@@ -23,6 +23,76 @@ func TestSemVerOperator_Compare(t *testing.T) {
23
23
want bool
24
24
wantErr bool
25
25
}{
26
+ {
27
+ name : "invalid version" ,
28
+ svo : Greater ,
29
+ args : args {
30
+ v1 : "invalid" ,
31
+ v2 : "v1.0.0" ,
32
+ },
33
+ want : false ,
34
+ wantErr : true ,
35
+ },
36
+ {
37
+ name : "preview version vs non preview version" ,
38
+ svo : Greater ,
39
+ args : args {
40
+ v1 : "v1.0.0-preview.1.2" ,
41
+ v2 : "v1.0.0" ,
42
+ },
43
+ want : false ,
44
+ wantErr : false ,
45
+ },
46
+ {
47
+ name : "preview version vs preview version" ,
48
+ svo : Greater ,
49
+ args : args {
50
+ v1 : "v1.0.0-preview.1.3" ,
51
+ v2 : "v1.0.0-preview.1.2" ,
52
+ },
53
+ want : true ,
54
+ wantErr : false ,
55
+ },
56
+ {
57
+ name : "no prefixed v left greater" ,
58
+ svo : Greater ,
59
+ args : args {
60
+ v1 : "0.0.1" ,
61
+ v2 : "v0.0.2" ,
62
+ },
63
+ want : false ,
64
+ wantErr : false ,
65
+ },
66
+ {
67
+ name : "no prefixed v right greater" ,
68
+ svo : Greater ,
69
+ args : args {
70
+ v1 : "v0.0.1" ,
71
+ v2 : "0.0.2" ,
72
+ },
73
+ want : false ,
74
+ wantErr : false ,
75
+ },
76
+ {
77
+ name : "no prefixed v right equals" ,
78
+ svo : Equals ,
79
+ args : args {
80
+ v1 : "v0.0.1" ,
81
+ v2 : "0.0.1" ,
82
+ },
83
+ want : true ,
84
+ wantErr : false ,
85
+ },
86
+ {
87
+ name : "no prefixed v both" ,
88
+ svo : Greater ,
89
+ args : args {
90
+ v1 : "0.0.1" ,
91
+ v2 : "0.0.2" ,
92
+ },
93
+ want : false ,
94
+ wantErr : false ,
95
+ },
26
96
{
27
97
name : "invalid operator" ,
28
98
svo : "" ,
@@ -33,6 +103,16 @@ func TestSemVerOperator_Compare(t *testing.T) {
33
103
want : false ,
34
104
wantErr : true ,
35
105
},
106
+ {
107
+ name : "less with large number" ,
108
+ svo : Less ,
109
+ args : args {
110
+ v1 : "v1234.0.1" ,
111
+ v2 : "v1235.0.2" ,
112
+ },
113
+ want : true ,
114
+ wantErr : false ,
115
+ },
36
116
{
37
117
name : "less" ,
38
118
svo : Less ,
@@ -43,6 +123,16 @@ func TestSemVerOperator_Compare(t *testing.T) {
43
123
want : true ,
44
124
wantErr : false ,
45
125
},
126
+ {
127
+ name : "no minor version" ,
128
+ svo : Less ,
129
+ args : args {
130
+ v1 : "v1.0" ,
131
+ v2 : "v1.2" ,
132
+ },
133
+ want : true ,
134
+ wantErr : false ,
135
+ },
46
136
{
47
137
name : "not less" ,
48
138
svo : Less ,
@@ -206,13 +296,20 @@ func TestSemVerOperator_Compare(t *testing.T) {
206
296
}
207
297
for _ , tt := range tests {
208
298
t .Run (tt .name , func (t * testing.T ) {
209
- got , err := tt .svo .compare (tt .args .v1 , tt .args .v2 )
299
+ var operatorInterface interface {} = string (tt .svo )
300
+ actualVersion , targetVersion , operator , err := parseSemverEvaluationData ([]interface {}{tt .args .v1 , operatorInterface , tt .args .v2 })
301
+ if err != nil {
302
+ require .Truef (t , tt .wantErr , "Error parsing semver evaluation data. actualVersion: %s, targetVersion: %s, operator: %s, err: %s" , actualVersion , targetVersion , operator , err )
303
+ return
304
+ }
305
+
306
+ got , err := operator .compare (actualVersion , targetVersion )
210
307
211
308
if tt .wantErr {
212
309
require .NotNil (t , err )
213
310
} else {
214
311
require .Nil (t , err )
215
- require .Equalf (t , tt .want , got , "compare(%v, %v)" , tt .args .v1 , tt .args .v2 )
312
+ require .Equalf (t , tt .want , got , "compare(%v, %v) operator: %s " , tt .args .v1 , tt .args .v2 , operator )
216
313
}
217
314
})
218
315
}
@@ -385,6 +482,130 @@ func TestJSONEvaluator_semVerEvaluation(t *testing.T) {
385
482
expectedValue : "#FF0000" ,
386
483
expectedReason : model .TargetingMatchReason ,
387
484
},
485
+ "versions given as double - match" : {
486
+ flags : Flags {
487
+ Flags : map [string ]model.Flag {
488
+ "headerColor" : {
489
+ State : "ENABLED" ,
490
+ DefaultVariant : "red" ,
491
+ Variants : map [string ]any {
492
+ "red" : "#FF0000" ,
493
+ "blue" : "#0000FF" ,
494
+ "green" : "#00FF00" ,
495
+ "yellow" : "#FFFF00" ,
496
+ },
497
+ Targeting : []byte (`{
498
+ "if": [
499
+ {
500
+ "sem_ver": [1.2, "=", "1.2"]
501
+ },
502
+ "red", "green"
503
+ ]
504
+ }` ),
505
+ },
506
+ },
507
+ },
508
+ flagKey : "headerColor" ,
509
+ context : map [string ]any {
510
+ "version" : "1.0.0" ,
511
+ },
512
+ expectedVariant : "red" ,
513
+ expectedValue : "#FF0000" ,
514
+ expectedReason : model .TargetingMatchReason ,
515
+ },
516
+ "versions given as int - match" : {
517
+ flags : Flags {
518
+ Flags : map [string ]model.Flag {
519
+ "headerColor" : {
520
+ State : "ENABLED" ,
521
+ DefaultVariant : "red" ,
522
+ Variants : map [string ]any {
523
+ "red" : "#FF0000" ,
524
+ "blue" : "#0000FF" ,
525
+ "green" : "#00FF00" ,
526
+ "yellow" : "#FFFF00" ,
527
+ },
528
+ Targeting : []byte (`{
529
+ "if": [
530
+ {
531
+ "sem_ver": [1, "=", "v1.0.0"]
532
+ },
533
+ "red", "green"
534
+ ]
535
+ }` ),
536
+ },
537
+ },
538
+ },
539
+ flagKey : "headerColor" ,
540
+ context : map [string ]any {
541
+ "version" : "1.0.0" ,
542
+ },
543
+ expectedVariant : "red" ,
544
+ expectedValue : "#FF0000" ,
545
+ expectedReason : model .TargetingMatchReason ,
546
+ },
547
+ "versions and minor-version without patch version operator provided - match" : {
548
+ flags : Flags {
549
+ Flags : map [string ]model.Flag {
550
+ "headerColor" : {
551
+ State : "ENABLED" ,
552
+ DefaultVariant : "red" ,
553
+ Variants : map [string ]any {
554
+ "red" : "#FF0000" ,
555
+ "blue" : "#0000FF" ,
556
+ "green" : "#00FF00" ,
557
+ "yellow" : "#FFFF00" ,
558
+ },
559
+ Targeting : []byte (`{
560
+ "if": [
561
+ {
562
+ "sem_ver": [1.2, "=", "1.2"]
563
+ },
564
+ "red", "green"
565
+ ]
566
+ }` ),
567
+ },
568
+ },
569
+ },
570
+ flagKey : "headerColor" ,
571
+ context : map [string ]any {
572
+ "version" : "1.0.0" ,
573
+ },
574
+ expectedVariant : "red" ,
575
+ expectedValue : "#FF0000" ,
576
+ expectedReason : model .TargetingMatchReason ,
577
+ },
578
+ "versions with prefixed v operator provided - match" : {
579
+ flags : Flags {
580
+ Flags : map [string ]model.Flag {
581
+ "headerColor" : {
582
+ State : "ENABLED" ,
583
+ DefaultVariant : "red" ,
584
+ Variants : map [string ]any {
585
+ "red" : "#FF0000" ,
586
+ "blue" : "#0000FF" ,
587
+ "green" : "#00FF00" ,
588
+ "yellow" : "#FFFF00" ,
589
+ },
590
+ Targeting : []byte (`{
591
+ "if": [
592
+ {
593
+ "sem_ver": [{"var": "version"}, "<", "v1.2"]
594
+ },
595
+ "red", "green"
596
+ ]
597
+ }` ),
598
+ },
599
+ },
600
+ },
601
+ flagKey : "headerColor" ,
602
+ context : map [string ]any {
603
+ "version" : "v1.0.0" ,
604
+ },
605
+ expectedVariant : "red" ,
606
+ expectedValue : "#FF0000" ,
607
+ expectedReason : model .TargetingMatchReason ,
608
+ },
388
609
"versions and major-version operator provided - no match" : {
389
610
flags : Flags {
390
611
Flags : map [string ]model.Flag {
0 commit comments