Skip to content

Commit 9f1b7d9

Browse files
author
Bilal Al
committed
semver matchers integrations spec
1 parent 7fd6f34 commit 9f1b7d9

File tree

6 files changed

+586
-0
lines changed

6 files changed

+586
-0
lines changed
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
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+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
{
2+
"splits": [
3+
{
4+
"trafficTypeName": "user",
5+
"name": "semver_equalto",
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": "EQUAL_TO_SEMVER",
24+
"negate": false,
25+
"userDefinedSegmentMatcherData": null,
26+
"whitelistMatcherData": null,
27+
"unaryNumericMatcherData": null,
28+
"betweenMatcherData": null,
29+
"dependencyMatcherData": null,
30+
"booleanMatcherData": null,
31+
"stringMatcherData": "1.22.9"}
32+
]
33+
},
34+
"partitions": [
35+
{
36+
"treatment": "on",
37+
"size": 100
38+
},
39+
{
40+
"treatment": "off",
41+
"size": 0
42+
}
43+
],
44+
"label": "equal to semver"
45+
},
46+
{
47+
"conditionType": "ROLLOUT",
48+
"matcherGroup": {
49+
"combiner": "AND",
50+
"matchers": [
51+
{
52+
"keySelector": {
53+
"trafficType": "user",
54+
"attribute": null
55+
},
56+
"matcherType": "ALL_KEYS",
57+
"negate": false,
58+
"userDefinedSegmentMatcherData": null,
59+
"whitelistMatcherData": null,
60+
"unaryNumericMatcherData": null,
61+
"betweenMatcherData": null,
62+
"booleanMatcherData": null,
63+
"dependencyMatcherData": null,
64+
"stringMatcherData": null
65+
}
66+
]
67+
},
68+
"partitions": [
69+
{
70+
"treatment": "on",
71+
"size": 0
72+
},
73+
{
74+
"treatment": "off",
75+
"size": 100
76+
}
77+
],
78+
"label": "default rule"
79+
}
80+
]
81+
}
82+
],
83+
"since": -1,
84+
"till": 1675259356568
85+
}

0 commit comments

Comments
 (0)