Skip to content

Commit a302223

Browse files
authored
Merge branch 'Feature/Semver' into semver-inlist-matcher
2 parents 5a084a8 + f76b944 commit a302223

13 files changed

Lines changed: 666 additions & 5 deletions

spec/engine/matchers/matches_greater_than_or_equal_to_semver_matcher_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
matcher = described_class.new("version", raw[:stringMatcherData], config.logger, config.split_validator)
2222
expect(matcher.match?(:attributes=>{"version": "2.1.8+rc"})).to eq(true)
2323
expect(matcher.match?(:attributes=>{"version": "2.1.8"})).to eq(true)
24-
expect(matcher.match?(:attributes=>{"version": "2.1.5"})).to eq(true)
25-
expect(matcher.match?(:attributes=>{"version": "2.1.5-rc1"})).to eq(true)
24+
expect(matcher.match?(:attributes=>{"version": "2.1.11"})).to eq(true)
25+
expect(matcher.match?(:attributes=>{"version": "2.2.0"})).to eq(true)
2626
end
2727

2828
it 'does not match' do

spec/engine/matchers/matches_less_than_or_equal_to_semver_matcher_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
matcher = described_class.new("version", raw[:stringMatcherData], config.logger, config.split_validator)
2222
expect(matcher.match?(:attributes=>{"version": "2.1.8+rc"})).to eq(true)
2323
expect(matcher.match?(:attributes=>{"version": "2.1.8"})).to eq(true)
24-
expect(matcher.match?(:attributes=>{"version": "2.1.11"})).to eq(true)
25-
expect(matcher.match?(:attributes=>{"version": "2.2.0"})).to eq(true)
24+
expect(matcher.match?(:attributes=>{"version": "2.1.5"})).to eq(true)
25+
expect(matcher.match?(:attributes=>{"version": "2.1.5-rc1"})).to eq(true)
2626
end
2727

2828
it 'does not match' do
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
describe 'Semver matchers integration' do
6+
subject do
7+
SplitIoClient::SplitFactory.new('test_api_key', {
8+
logger: Logger.new(log),
9+
streaming_enabled: false,
10+
impressions_refresh_rate: 9999,
11+
impressions_mode: :none,
12+
features_refresh_rate: 9999,
13+
telemetry_refresh_rate: 99999}).client
14+
end
15+
16+
let(:log) { StringIO.new }
17+
18+
let(:semver_between_matcher_splits) do
19+
File.read(File.expand_path(File.join(File.dirname(__FILE__),
20+
'../../test_data/splits/semver_matchers/semver_between.json')))
21+
end
22+
23+
let(:semver_equalto_matcher_splits) do
24+
File.read(File.expand_path(File.join(File.dirname(__FILE__),
25+
'../../test_data/splits/semver_matchers/semver_equalto.json')))
26+
end
27+
28+
let(:semver_greater_or_equalto_matcher_splits) do
29+
File.read(File.expand_path(File.join(File.dirname(__FILE__),
30+
'../../test_data/splits/semver_matchers/semver_greater_or_equalto.json')))
31+
end
32+
33+
let(:semver_less_or_equalto_matcher_splits) do
34+
File.read(File.expand_path(File.join(File.dirname(__FILE__),
35+
'../../test_data/splits/semver_matchers/semver_less_or_equalto.json')))
36+
end
37+
38+
let(:semver_inlist_matcher_splits) do
39+
File.read(File.expand_path(File.join(File.dirname(__FILE__),
40+
'../../test_data/splits/semver_matchers/semver_inlist.json')))
41+
end
42+
43+
let(:user) { 'fake_user_id_1' }
44+
45+
before do
46+
stub_request(:any, /https:\/\/telemetry.*/).to_return(status: 200, body: 'ok')
47+
stub_request(:any, /https:\/\/events.*/).to_return(status: 200, body: "", headers: {})
48+
end
49+
50+
context 'equal to matcher' do
51+
before do
52+
stub_request(:get, /https:\/\/sdk\.split\.io\/api\/splitChanges\?since/)
53+
.to_return(status: 200, body: semver_equalto_matcher_splits)
54+
stub_request(:get, 'https://sdk.split.io/api/splitChanges?since=-1')
55+
.to_return(status: 200, body: semver_equalto_matcher_splits)
56+
sleep 1
57+
subject.block_until_ready
58+
end
59+
60+
it 'validates the treatment is ON for correct attribute value' do
61+
expect(subject.get_treatment(user, 'semver_equalto', {:version => "1.22.9"})).to eq 'on'
62+
end
63+
64+
it 'validates the treatment is the default treatment for incorrect attributes hash and nil' do
65+
expect(subject.get_treatment(user, 'semver_equalto')).to eq 'off'
66+
expect(subject.get_treatment(user, 'semver_equalto', {:version => "1.22.10"})).to eq 'off'
67+
subject.destroy()
68+
end
69+
end
70+
71+
context 'greater than or equal to matcher' do
72+
before do
73+
stub_request(:get, /https:\/\/sdk\.split\.io\/api\/splitChanges\?since/)
74+
.to_return(status: 200, body: semver_greater_or_equalto_matcher_splits)
75+
stub_request(:get, 'https://sdk.split.io/api/splitChanges?since=-1')
76+
.to_return(status: 200, body: semver_greater_or_equalto_matcher_splits)
77+
sleep 1
78+
subject.block_until_ready
79+
end
80+
81+
it 'validates the treatment is ON for correct attribute value' do
82+
expect(subject.get_treatment(user, 'semver_greater_or_equalto', {:version => "1.22.9"})).to eq 'on'
83+
expect(subject.get_treatment(user, 'semver_greater_or_equalto', {:version => "1.22.10"})).to eq 'on'
84+
end
85+
86+
it 'validates the treatment is the default treatment for incorrect attributes hash and nil' do
87+
expect(subject.get_treatment(user, 'semver_greater_or_equalto')).to eq 'off'
88+
expect(subject.get_treatment(user, 'semver_greater_or_equalto', {:version => "1.22.8"})).to eq 'off'
89+
subject.destroy()
90+
end
91+
end
92+
93+
context 'less than or equal to matcher' do
94+
before do
95+
stub_request(:get, /https:\/\/sdk\.split\.io\/api\/splitChanges\?since/)
96+
.to_return(status: 200, body: semver_less_or_equalto_matcher_splits)
97+
stub_request(:get, 'https://sdk.split.io/api/splitChanges?since=-1')
98+
.to_return(status: 200, body: semver_less_or_equalto_matcher_splits)
99+
sleep 1
100+
subject.block_until_ready
101+
end
102+
103+
it 'validates the treatment is ON for correct attribute value' do
104+
expect(subject.get_treatment(user, 'semver_less_or_equalto', {:version => "1.22.9"})).to eq 'on'
105+
expect(subject.get_treatment(user, 'semver_less_or_equalto', {:version => "1.22.8"})).to eq 'on'
106+
end
107+
108+
it 'validates the treatment is the default treatment for incorrect attributes hash and nil' do
109+
expect(subject.get_treatment(user, 'semver_less_or_equalto')).to eq 'off'
110+
expect(subject.get_treatment(user, 'semver_less_or_equalto', {:version => "1.22.10"})).to eq 'off'
111+
subject.destroy()
112+
end
113+
end
114+
115+
context 'in list matcher' do
116+
before do
117+
stub_request(:get, /https:\/\/sdk\.split\.io\/api\/splitChanges\?since/)
118+
.to_return(status: 200, body: semver_inlist_matcher_splits)
119+
stub_request(:get, 'https://sdk.split.io/api/splitChanges?since=-1')
120+
.to_return(status: 200, body: semver_inlist_matcher_splits)
121+
sleep 1
122+
subject.block_until_ready
123+
end
124+
125+
it 'validates the treatment is ON for correct attribute value' do
126+
expect(subject.get_treatment(user, 'semver_inlist', {:version => "1.22.9"})).to eq 'on'
127+
expect(subject.get_treatment(user, 'semver_inlist', {:version => "2.1.0"})).to eq 'on'
128+
end
129+
130+
it 'validates the treatment is the default treatment for incorrect attributes hash and nil' do
131+
expect(subject.get_treatment(user, 'semver_inlist')).to eq 'off'
132+
expect(subject.get_treatment(user, 'semver_inlist', {:version => "1.22.10"})).to eq 'off'
133+
subject.destroy()
134+
end
135+
end
136+
137+
context 'between matcher' do
138+
before do
139+
stub_request(:get, /https:\/\/sdk\.split\.io\/api\/splitChanges\?since/)
140+
.to_return(status: 200, body: semver_between_matcher_splits)
141+
stub_request(:get, 'https://sdk.split.io/api/splitChanges?since=-1')
142+
.to_return(status: 200, body: semver_between_matcher_splits)
143+
sleep 1
144+
subject.block_until_ready
145+
end
146+
147+
it 'validates the treatment is ON for correct attribute value' do
148+
expect(subject.get_treatment(user, 'semver_between', {:version => "1.22.9"})).to eq 'on'
149+
expect(subject.get_treatment(user, 'semver_between', {:version => "2.0.10"})).to eq 'on'
150+
end
151+
152+
it 'validates the treatment is the default treatment for incorrect attributes hash and nil' do
153+
expect(subject.get_treatment(user, 'semver_between')).to eq 'off'
154+
expect(subject.get_treatment(user, 'semver_between', {:version => "1.22.9-rc1"})).to eq 'off'
155+
expect(subject.get_treatment(user, 'semver_between', {:version => "2.1.1"})).to eq 'off'
156+
subject.destroy()
157+
end
158+
end
159+
end

spec/engine/matchers/semver_spec.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
expect(described_class.build(valid_versions[i][0], logger).compare(described_class.build(valid_versions[i][1], logger))).not_to eq(0)
4646
end
4747
end
48-
4948
end
5049
end
5150
end
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# version1, version2, version3, expected
2+
1.1.1,2.2.2,3.3.3,true
3+
1.1.1-rc.1,1.1.1-rc.2,1.1.1-rc.3,true
4+
1.0.0-alpha,1.0.0-alpha.1,1.0.0-alpha.beta,true
5+
1.0.0-alpha.1,1.0.0-alpha.beta,1.0.0-beta,true
6+
1.0.0-alpha.beta,1.0.0-beta,1.0.0-beta.2,true
7+
1.0.0-beta,1.0.0-beta.2,1.0.0-beta.11,true
8+
1.0.0-beta.2,1.0.0-beta.11,1.0.0-rc.1,true
9+
1.0.0-beta.11,1.0.0-rc.1,1.0.0,true
10+
1.1.2,1.1.3,1.1.4,true
11+
1.2.1,1.3.1,1.4.1,true
12+
2.0.0,3.0.0,4.0.0,true
13+
2.2.2,2.2.3-rc1,2.2.3,true
14+
2.2.2,2.3.2-rc100,2.3.3,true
15+
1.0.0-rc.1+build.1,1.2.3-beta,1.2.3-rc.1+build.123,true
16+
3.3.3,3.3.3-alpha,3.3.4,false
17+
2.2.2-rc.1,2.2.2+metadata,2.2.2-rc.10,false
18+
1.1.1-rc.1,1.1.1-rc.3,1.1.1-rc.2,false
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# version1, version2, equals
2+
1.1.1,1.1.1,true
3+
1.1.1,1.1.1+metadata,false
4+
1.1.1,1.1.1-rc.1,false
5+
88.88.88,88.88.88,true
6+
1.2.3----RC-SNAPSHOT.12.9.1--.12,1.2.3----RC-SNAPSHOT.12.9.1--.12,true
7+
10.2.3-DEV-SNAPSHOT,10.2.3-SNAPSHOT-123,false
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# invalid
2+
1
3+
1.2
4+
1.alpha.2
5+
+invalid
6+
-invalid
7+
-invalid+invalid
8+
-invalid.01
9+
alpha
10+
alpha.beta
11+
alpha.beta.1
12+
alpha.1
13+
alpha+beta
14+
alpha_beta
15+
alpha.
16+
alpha..
17+
beta
18+
-alpha.
19+
1.2
20+
1.2.3.DEV
21+
1.2-SNAPSHOT
22+
1.2.31.2.3----RC-SNAPSHOT.12.09.1--..12+788
23+
1.2-RC-SNAPSHOT
24+
-1.0.3-gamma+b7718
25+
+justmeta
26+
#99999999999999999999999.999999999999999999.99999999999999999----RC-SNAPSHOT.12.09.1--------------------------------..12
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# higher, lower
2+
1.1.2,1.1.1
3+
1.0.0,1.0.0-rc.1
4+
1.1.0-rc.1,1.0.0-beta.11
5+
1.0.0-beta.11,1.0.0-beta.2
6+
1.0.0-beta.2,1.0.0-beta
7+
1.0.0-beta,1.0.0-alpha.beta
8+
1.0.0-alpha.beta,1.0.0-alpha.1
9+
1.0.0-alpha.1,1.0.0-alpha
10+
2.2.2-rc.2+metadata-lalala,2.2.2-rc.1.2
11+
1.2.3,0.0.4
12+
1.1.2+meta,1.1.2-prerelease+meta
13+
1.0.0-beta,1.0.0-alpha
14+
1.0.0-alpha0.valid,1.0.0-alpha.0valid
15+
1.0.0-rc.1+build.1,1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay
16+
10.2.3-DEV-SNAPSHOT,1.2.3-SNAPSHOT-123
17+
1.1.1-rc2,1.0.0-0A.is.legal
18+
1.2.3----RC-SNAPSHOT.12.9.1--.12+788,1.2.3----R-S.12.9.1--.12+meta
19+
1.2.3----RC-SNAPSHOT.12.9.1--.12.88,1.2.3----RC-SNAPSHOT.12.9.1--.12
20+
9223372036854775807.9223372036854775807.9223372036854775807,9223372036854775807.9223372036854775807.9223372036854775806
21+
1.1.1-alpha.beta.rc.build.java.pr.support.10,1.1.1-alpha.beta.rc.build.java.pr.support
22+
1.1.2,1.1.1
23+
1.2.1,1.1.1
24+
2.1.1,1.1.1
25+
1.1.1-rc.1,1.1.1-rc.0
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
{
2+
"splits": [
3+
{
4+
"trafficTypeName": "user",
5+
"name": "semver_between",
6+
"trafficAllocation": 100,
7+
"trafficAllocationSeed": 1068038034,
8+
"seed": -1053389887,
9+
"status": "ACTIVE",
10+
"killed": false,
11+
"defaultTreatment": "off",
12+
"changeNumber": 1675259356568,
13+
"algo": 2,
14+
"configurations": {},
15+
"conditions": [
16+
{
17+
"conditionType": "ROLLOUT",
18+
"matcherGroup": {
19+
"combiner": "AND",
20+
"matchers":
21+
[
22+
{"keySelector": {"trafficType": "user", "attribute": "version"},
23+
"matcherType": "BETWEEN_SEMVER",
24+
"negate": false,
25+
"userDefinedSegmentMatcherData": null,
26+
"whitelistMatcherData": null,
27+
"unaryNumericMatcherData": null,
28+
"betweenMatcherData": null,
29+
"dependencyMatcherData": null,
30+
"booleanMatcherData": null,
31+
"stringMatcherData": null,
32+
"betweenStringMatcherData": {"start": "1.22.9", "end": "2.1.0"}}
33+
]
34+
},
35+
"partitions": [
36+
{
37+
"treatment": "on",
38+
"size": 100
39+
},
40+
{
41+
"treatment": "off",
42+
"size": 0
43+
}
44+
],
45+
"label": "between semver"
46+
},
47+
{
48+
"conditionType": "ROLLOUT",
49+
"matcherGroup": {
50+
"combiner": "AND",
51+
"matchers": [
52+
{
53+
"keySelector": {
54+
"trafficType": "user",
55+
"attribute": null
56+
},
57+
"matcherType": "ALL_KEYS",
58+
"negate": false,
59+
"userDefinedSegmentMatcherData": null,
60+
"whitelistMatcherData": null,
61+
"unaryNumericMatcherData": null,
62+
"betweenMatcherData": null,
63+
"booleanMatcherData": null,
64+
"dependencyMatcherData": null,
65+
"stringMatcherData": null
66+
}
67+
]
68+
},
69+
"partitions": [
70+
{
71+
"treatment": "on",
72+
"size": 0
73+
},
74+
{
75+
"treatment": "off",
76+
"size": 100
77+
}
78+
],
79+
"label": "default rule"
80+
}
81+
]
82+
}
83+
],
84+
"since": -1,
85+
"till": 1675259356568
86+
}

0 commit comments

Comments
 (0)