Skip to content

Commit ebd9c3d

Browse files
Merge pull request #862 from splitio/rb_segments_test_updates
[Rule-based segments] Update tests
2 parents e2dc151 + 33e5ea9 commit ebd9c3d

File tree

84 files changed

+4434
-4115
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+4434
-4115
lines changed

.github/workflows/ci-cd.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ jobs:
6666

6767
upload-stage:
6868
name: Upload assets
69-
runs-on: ubuntu-20.04
69+
runs-on: ubuntu-latest
7070
needs: build
7171
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/development' }}
7272
strategy:
@@ -105,7 +105,7 @@ jobs:
105105

106106
upload-prod:
107107
name: Upload assets
108-
runs-on: ubuntu-20.04
108+
runs-on: ubuntu-latest
109109
needs: build
110110
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
111111
strategy:

.github/workflows/sonar-scan.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
fetch-depth: 0
2121

2222
- name: Set up Node.js
23-
uses: actions/setup-node@v3
23+
uses: actions/setup-node@v4
2424
with:
2525
node-version: 'lts/*'
2626
cache: 'npm'

CHANGES.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
11.2.0 (March 28, 2025)
2+
- Added a new optional argument to the client `getTreatment` methods to allow passing additional evaluation options, such as a map of properties to append to the generated impressions sent to Split backend. Read more in our docs.
3+
- Added two new configuration options for the SDK's `LOCALSTORAGE` storage type to control the behavior of the persisted rollout plan cache in the browser:
4+
- `storage.expirationDays` to specify the validity period of the rollout plan cache in days.
5+
- `storage.clearOnInit` to clear the rollout plan cache on SDK initialization.
6+
- Updated SDK_READY_FROM_CACHE event when using the `LOCALSTORAGE` storage type to be emitted alongside the SDK_READY event if it has not already been emitted.
7+
- Updated @splitsoftware/splitio-commons package to version 2.2.0.
8+
19
11.1.0 (January 17, 2025)
210
- Added support for the new impressions tracking toggle available on feature flags, both respecting the setting and including the new field being returned on `SplitView` type objects. Read more in our docs.
311
- Updated @splitsoftware/splitio-commons package to version 2.1.0.

package-lock.json

Lines changed: 17 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@splitsoftware/splitio",
3-
"version": "11.1.0",
3+
"version": "11.2.0",
44
"description": "Split SDK",
55
"files": [
66
"README.md",
@@ -38,7 +38,7 @@
3838
"node": ">=14.0.0"
3939
},
4040
"dependencies": {
41-
"@splitsoftware/splitio-commons": "2.1.0",
41+
"@splitsoftware/splitio-commons": "2.2.1-rc.1",
4242
"bloom-filters": "^3.0.4",
4343
"ioredis": "^4.28.0",
4444
"js-yaml": "^3.13.1",

src/__tests__/browserSuites/evaluations-semver.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ const config = {
2525

2626
export default async function (fetchMock, assert) {
2727

28-
fetchMock.getOnce(config.urls.sdk + '/splitChanges?s=1.2&since=-1', { status: 200, body: splitChangesMock1 });
29-
fetchMock.getOnce(config.urls.sdk + '/splitChanges?s=1.2&since=1675259356568', { status: 200, body: { splits: [], since: 1675259356568, till: 1675259356568 } });
28+
fetchMock.getOnce(config.urls.sdk + '/splitChanges?s=1.3&since=-1&rbSince=-1', { status: 200, body: splitChangesMock1 });
29+
fetchMock.getOnce(config.urls.sdk + '/splitChanges?s=1.3&since=1675259356568&rbSince=-1', { status: 200, body: { ff: { d: [], s: 1675259356568, t: 1675259356568 } } });
3030
fetchMock.getOnce(config.urls.sdk + '/memberships/emi%40split.io', { status: 200, body: { ms: {} } });
3131
fetchMock.getOnce(config.urls.sdk + '/memberships/2nd', { status: 200, body: { ms: {} } });
3232

src/__tests__/browserSuites/fetch-specific-splits.spec.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ export function fetchSpecificSplits(fetchMock, assert) {
2525
const queryString = queryStrings[i] || '';
2626
let factory;
2727

28-
fetchMock.getOnce(urls.sdk + '/splitChanges?s=1.2&since=-1' + queryString, { status: 200, body: { splits: [], since: -1, till: 1457552620999 } });
29-
fetchMock.getOnce(urls.sdk + '/splitChanges?s=1.2&since=1457552620999' + queryString, { status: 200, body: { splits: [], since: 1457552620999, till: 1457552620999 } });
30-
fetchMock.getOnce(urls.sdk + '/splitChanges?s=1.2&since=1457552620999' + queryString, function () {
28+
fetchMock.getOnce(urls.sdk + '/splitChanges?s=1.3&since=-1&rbSince=-1' + queryString, { status: 200, body: { ff: { d: [], s: -1, t: 1457552620999 } } });
29+
fetchMock.getOnce(urls.sdk + '/splitChanges?s=1.3&since=1457552620999&rbSince=-1' + queryString, { status: 200, body: { ff: { d: [], s: 1457552620999, t: 1457552620999 } } });
30+
fetchMock.getOnce(urls.sdk + '/splitChanges?s=1.3&since=1457552620999&rbSince=-1' + queryString, function () {
3131
factory.client().destroy().then(() => {
3232
assert.pass(`splitFilters #${i}`);
3333
});
34-
return { status: 200, body: { splits: [], since: 1457552620999, till: 1457552620999 } };
34+
return { status: 200, body: { ff: { d: [], s: 1457552620999, t: 1457552620999 } } };
3535
});
3636
fetchMock.get(urls.sdk + '/memberships/nicolas%40split.io', { status: 200, body: { 'ms': {} } });
3737

@@ -70,8 +70,8 @@ export function fetchSpecificSplitsForFlagSets(fetchMock, assert) {
7070
const queryString = '&sets=4_valid,set_2,set_3,set_ww,set_x';
7171
fetchMock.get(baseUrls.sdk + '/memberships/nicolas%40split.io', { status: 200, body: { 'ms': {} } });
7272

73-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=-1' + queryString, { status: 200, body: { splits: [], since: 1457552620999, till: 1457552620999 }});
74-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=1457552620999' + queryString, async function () {
73+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=-1&rbSince=-1' + queryString, { status: 200, body: { ff: { d: [], s: 1457552620999, t: 1457552620999 } }});
74+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=1457552620999&rbSince=-1' + queryString, async function () {
7575
t.pass('flag set query correctly formed');
7676
t.true(logSpy.calledWithExactly('[WARN] splitio => settings: bySet filter value "set_x " has extra whitespace, trimming.'));
7777
t.true(logSpy.calledWithExactly('[WARN] splitio => settings: you passed invalid+, flag set must adhere to the regular expressions /^[a-z0-9][_a-z0-9]{0,49}$/. This means a flag set must start with a letter or number, be in lowercase, alphanumeric and have a max length of 50 characters. invalid+ was discarded.'));

src/__tests__/browserSuites/flag-sets.spec.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ export default function flagSets(fetchMock, t) {
2424
let manager;
2525

2626
// Receive split change with 1 split belonging to set_1 & set_2 and one belonging to set_3
27-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=-1&sets=set_1,set_2', function () {
27+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=-1&rbSince=-1&sets=set_1,set_2', function () {
2828
return { status: 200, body: splitChange2};
2929
});
3030

3131
// Receive split change with 1 split belonging to set_1 only
32-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=1602796638344&sets=set_1,set_2', function () {
32+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=1602796638344&rbSince=-1&sets=set_1,set_2', function () {
3333
// stored feature flags before update
3434
const storedFlags = manager.splits();
3535
assert.true(storedFlags.length === 1, 'only one feature flag should be added');
@@ -41,7 +41,7 @@ export default function flagSets(fetchMock, t) {
4141
});
4242

4343
// Receive split change with 1 split belonging to set_3 only
44-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=1602797638344&sets=set_1,set_2', function () {
44+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=1602797638344&rbSince=-1&sets=set_1,set_2', function () {
4545
// stored feature flags before update
4646
const storedFlags = manager.splits();
4747
assert.true(storedFlags.length === 1);
@@ -52,7 +52,7 @@ export default function flagSets(fetchMock, t) {
5252
return { status: 200, body: splitChange0};
5353
});
5454

55-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=1602798638344&sets=set_1,set_2', async function () {
55+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=1602798638344&rbSince=-1&sets=set_1,set_2', async function () {
5656
// stored feature flags before update
5757
const storedFlags = manager.splits();
5858
assert.true(storedFlags.length === 0, 'the feature flag should be removed');
@@ -75,12 +75,12 @@ export default function flagSets(fetchMock, t) {
7575
let manager;
7676

7777
// Receive split change with 1 split belonging to set_1 & set_2 and one belonging to set_3
78-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=-1', function () {
78+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=-1&rbSince=-1', function () {
7979
return { status: 200, body: splitChange2};
8080
});
8181

8282
// Receive split change with 1 split belonging to set_1 only
83-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=1602796638344', function () {
83+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=1602796638344&rbSince=-1', function () {
8484
// stored feature flags before update
8585
const storedFlags = manager.splits();
8686
assert.true(storedFlags.length === 2, 'every feature flag should be added');
@@ -94,7 +94,7 @@ export default function flagSets(fetchMock, t) {
9494
});
9595

9696
// Receive split change with 1 split belonging to set_3 only
97-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=1602797638344', function () {
97+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=1602797638344&rbSince=-1', function () {
9898
// stored feature flags before update
9999
const storedFlags = manager.splits();
100100
assert.true(storedFlags.length === 2);
@@ -107,7 +107,7 @@ export default function flagSets(fetchMock, t) {
107107
return { status: 200, body: splitChange0};
108108
});
109109

110-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=1602798638344', async function () {
110+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=1602798638344&rbSince=-1', async function () {
111111
// stored feature flags before update
112112
const storedFlags = manager.splits();
113113
assert.true(storedFlags.length === 2);
@@ -137,11 +137,11 @@ export default function flagSets(fetchMock, t) {
137137

138138
fetchMock.get(baseUrls.sdk + '/memberships/nicolas%40split.io', { status: 200, body: { 'ms': {} } });
139139
// Receive split change with 1 split belonging to set_1 & set_2 and one belonging to set_3
140-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=-1&sets=set_1', function () {
140+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=-1&rbSince=-1&sets=set_1', function () {
141141
return { status: 200, body: splitChange2};
142142
});
143143

144-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=1602796638344&sets=set_1', async function () {
144+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=1602796638344&rbSince=-1&sets=set_1', async function () {
145145
// stored feature flags before update
146146
assert.deepEqual(client.getTreatmentsByFlagSet('set_1'), {workm: 'on'}, 'only the flag in set_1 can be evaluated');
147147
assert.deepEqual(client.getTreatmentsByFlagSet('set_2'), {}, 'only the flag in set_1 can be evaluated');
@@ -174,11 +174,11 @@ export default function flagSets(fetchMock, t) {
174174

175175
fetchMock.get(baseUrls.sdk + '/memberships/nicolas%40split.io', { status: 200, body: { 'ms': {} } });
176176
// Receive split change with 1 split belonging to set_1 & set_2 and one belonging to set_3
177-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=-1', function () {
177+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=-1&rbSince=-1', function () {
178178
return { status: 200, body: splitChange2};
179179
});
180180

181-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.2&since=1602796638344', async function () {
181+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.3&since=1602796638344&rbSince=-1', async function () {
182182
// stored feature flags before update
183183
assert.deepEqual(client.getTreatmentsByFlagSet('set_1'), {workm: 'on'}, 'all flags can be evaluated');
184184
assert.deepEqual(client.getTreatmentsByFlagSet('set_2'), {workm: 'on'}, 'all flags can be evaluated');

src/__tests__/browserSuites/ignore-ip-addresses-setting.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ export default function (fetchMock, assert) {
101101

102102
// Mock GET endpoints before creating the client
103103
const settings = settingsFactory(config);
104-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.2&since=-1'), { status: 200, body: splitChangesMock1 });
105-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.2&since=1457552620999'), { status: 200, body: { splits: [], since: 1457552620999, till: 1457552620999 } });
104+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=-1&rbSince=-1'), { status: 200, body: splitChangesMock1 });
105+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), { status: 200, body: { ff: { d: [], s: 1457552620999, t: 1457552620999 } } });
106106
fetchMock.getOnce(url(settings, `/memberships/${encodeURIComponent(config.core.key)}`), { status: 200, body: { ms: {} } });
107107

108108
// Init Split client

src/__tests__/browserSuites/impressions-listener.spec.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export default function (assert) {
4646
const testAttrs = { is_test: true };
4747

4848
// Impression listener is shared across all client instances and does not get affected by configurations.
49-
client.getTreatment('hierarchical_splits_test');
49+
client.getTreatment('hierarchical_splits_test', undefined, { properties: { prop1: 'prop-value' } });
5050
client2.getTreatment('qc_team');
5151
client2.getTreatmentWithConfig('qc_team'); // Validate that the impression is the same.
5252
client3.getTreatment('qc_team', testAttrs);
@@ -58,7 +58,8 @@ export default function (assert) {
5858
treatment: 'no',
5959
bucketingKey: 'impr_bucketing_2',
6060
label: 'default rule',
61-
pt: undefined
61+
pt: undefined,
62+
properties: undefined
6263
};
6364

6465
assert.equal(listener.logImpression.callCount, 4, 'Impression listener logImpression method should be called after we call client.getTreatment, once per each impression generated.');
@@ -71,7 +72,7 @@ export default function (assert) {
7172
bucketingKey: undefined,
7273
label: 'expected label',
7374
changeNumber: 2828282828,
74-
pt: undefined
75+
properties: '{"prop1":"prop-value"}'
7576
},
7677
attributes: undefined,
7778
...metaData

0 commit comments

Comments
 (0)