Skip to content

Commit 90c19d6

Browse files
Merge pull request #863 from splitio/rb_segments_add_tests
[Rule-based segments] Add tests
2 parents ebd9c3d + dc18dbf commit 90c19d6

Some content is hidden

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

44 files changed

+595
-131
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ const config = {
2626
export default async function (fetchMock, assert) {
2727

2828
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 } } });
3029
fetchMock.getOnce(config.urls.sdk + '/memberships/emi%40split.io', { status: 200, body: { ms: {} } });
3130
fetchMock.getOnce(config.urls.sdk + '/memberships/2nd', { status: 200, body: { ms: {} } });
3231

src/__tests__/browserSuites/evaluations.spec.js

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,37 @@ export default function (config, fetchMock, assert) {
362362

363363
};
364364

365+
const evaluationsWithRuleBasedSegments = async (splitio) => {
366+
fetchMock.getOnce('https://sdk.split.io/api/memberships/emi%40split.io', { status: 200, body: { ms: { k: [{ n: 'segment_excluded_by_rbs' }] } } });
367+
fetchMock.getOnce('https://sdk.split.io/api/memberships/mauro%40split.io', { status: 200, body: { ms: {} } });
368+
fetchMock.getOnce('https://sdk.split.io/api/memberships/bilal%40split.io', { status: 200, body: { ms: {} } });
369+
fetchMock.getOnce('https://sdk.split.io/api/memberships/other_key', { status: 200, body: { ms: {} } });
370+
371+
const client1 = splitio.client('emi@split.io');
372+
await client1.ready();
373+
assert.equal(client1.getTreatment('rbs_test_flag'), 'v2', 'key in excluded segment');
374+
assert.equal(client1.getTreatment('rbs_test_flag_negated'), 'v1', 'key in excluded segment');
375+
await client1.destroy();
376+
377+
const client2 = splitio.client('mauro@split.io');
378+
await client2.ready();
379+
assert.equal(client2.getTreatment('rbs_test_flag'), 'v2', 'excluded key');
380+
assert.equal(client2.getTreatment('rbs_test_flag_negated'), 'v1', 'excluded key');
381+
await client2.destroy();
382+
383+
const client3 = splitio.client('bilal@split.io');
384+
await client3.ready();
385+
assert.equal(client3.getTreatment('rbs_test_flag'), 'v1', 'key satisfies the rbs condition');
386+
assert.equal(client3.getTreatment('rbs_test_flag_negated'), 'v2', 'key satisfies the rbs condition');
387+
await client3.destroy();
388+
389+
const client4 = splitio.client('other_key');
390+
await client4.ready();
391+
assert.equal(client4.getTreatment('rbs_test_flag'), 'v2', 'key not in segment');
392+
assert.equal(client4.getTreatment('rbs_test_flag_negated'), 'v1', 'key not in segment');
393+
await client4.destroy();
394+
};
395+
365396
for (i; i < SDK_INSTANCES_TO_TEST; i++) {
366397
let splitio = SplitFactory(config);
367398

@@ -376,13 +407,16 @@ export default function (config, fetchMock, assert) {
376407
getTreatmentsTests(client);
377408
getTreatmentsWithConfigTests(client);
378409
getTreatmentsWithInMemoryAttributes(client);
379-
clientTABucket1.destroy();
380-
client.destroy();
381-
tested++;
382410

383-
if (tested === SDK_INSTANCES_TO_TEST) {
384-
assert.end();
385-
}
411+
evaluationsWithRuleBasedSegments(splitio).then(() => {
412+
clientTABucket1.destroy();
413+
client.destroy();
414+
tested++;
415+
416+
if (tested === SDK_INSTANCES_TO_TEST) {
417+
assert.end();
418+
}
419+
});
386420
});
387421
}
388422
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ export default function (fetchMock, assert) {
102102
// Mock GET endpoints before creating the client
103103
const settings = settingsFactory(config);
104104
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 } } });
106105
fetchMock.getOnce(url(settings, `/memberships/${encodeURIComponent(config.core.key)}`), { status: 200, body: { ms: {} } });
107106

108107
// Init Split client

src/__tests__/browserSuites/impressions.debug.spec.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { SplitFactory } from '../../';
22
import { settingsFactory } from '../../settings';
33
import splitChangesMock1 from '../mocks/splitchanges.since.-1.json';
4-
import splitChangesMock2 from '../mocks/splitchanges.since.1457552620999.json';
54
import membershipsFacundo from '../mocks/memberships.facundo@split.io.json';
65
import { DEBUG } from '@splitsoftware/splitio-commons/src/utils/constants';
76
import { truncateTimeFrame } from '@splitsoftware/splitio-commons/src/utils/time';
@@ -25,7 +24,6 @@ let truncatedTimeFrame;
2524
export default function (fetchMock, assert) {
2625
// Mocking this specific route to make sure we only get the items we want to test from the handlers.
2726
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=-1&rbSince=-1'), { status: 200, body: splitChangesMock1 });
28-
fetchMock.get(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), { status: 200, body: splitChangesMock2 });
2927
fetchMock.get(url(settings, '/memberships/facundo%40split.io'), { status: 200, body: membershipsFacundo });
3028

3129
const splitio = SplitFactory({

src/__tests__/browserSuites/impressions.none.spec.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { SplitFactory } from '../..';
22
import { settingsFactory } from '../../settings/node';
33
import splitChangesMock1 from '../mocks/splitchanges.since.-1.json';
4-
import splitChangesMock2 from '../mocks/splitchanges.since.1457552620999.json';
54
import membershipsFacundo from '../mocks/memberships.facundo@split.io.json';
65
import { NONE } from '@splitsoftware/splitio-commons/src/utils/constants';
76
import { truncateTimeFrame } from '@splitsoftware/splitio-commons/src/utils/time';
@@ -42,7 +41,6 @@ const config = {
4241
export default async function (fetchMock, assert) {
4342
// Mocking this specific route to make sure we only get the items we want to test from the handlers.
4443
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=-1&rbSince=-1'), { status: 200, body: splitChangesMock1 });
45-
fetchMock.get(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), { status: 200, body: splitChangesMock2 });
4644
fetchMock.get(url(settings, '/memberships/facundo%40split.io'), { status: 200, body: membershipsFacundo });
4745
fetchMock.get(url(settings, '/memberships/emma%40split.io'), { status: 200, body: membershipsFacundo });
4846

src/__tests__/browserSuites/impressions.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ let truncatedTimeFrame;
2525
export default function (fetchMock, assert) {
2626
// Mocking this specific route to make sure we only get the items we want to test from the handlers.
2727
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=-1&rbSince=-1'), { status: 200, body: splitChangesMock1 });
28-
fetchMock.get(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), { status: 200, body: splitChangesMock2 });
28+
fetchMock.get(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), { status: 200, body: splitChangesMock2 });
2929
fetchMock.get(url(settings, '/memberships/facundo%40split.io'), { status: 200, body: membershipsFacundo });
3030

3131
const splitio = SplitFactory({

src/__tests__/browserSuites/push-corner-cases.spec.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { getStorageHash } from '@splitsoftware/splitio-commons/src/storages/KeyBuilder';
22
import splitChangesMock1 from '../mocks/splitchanges.since.-1.json';
3+
import splitChangesMock2 from '../mocks/splitchanges.since.1457552620999.json';
34
import splitKillMessage from '../mocks/message.SPLIT_KILL.1457552650000.json';
45
import authPushEnabledNicolas from '../mocks/auth.pushEnabled.nicolas@split.io.json';
56
import { nearlyEqual, url } from '../testUtils';
@@ -77,7 +78,7 @@ export function testSplitKillOnReadyFromCache(fetchMock, assert) {
7778

7879
// 2 splitChanges request: initial sync and after SSE opened. Sync after SPLIT_KILL is not performed because SplitsSyncTask is "executing"
7980
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=25&rbSince=-1'), { status: 200, body: splitChangesMock1 }, { delay: MILLIS_SPLIT_CHANGES_RESPONSE, /* delay response */ });
80-
fetchMock.getOnce(url(settings, `/splitChanges?s=1.3&since=${splitChangesMock1.ff.t}&rbSince=-1`), { status: 200, body: { ff: { d: [], s: splitChangesMock1.ff.t, t: splitChangesMock1.ff.t } } }, { delay: MILLIS_SPLIT_CHANGES_RESPONSE - 100, /* delay response */ });
81+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), { status: 200, body: splitChangesMock2 }, { delay: MILLIS_SPLIT_CHANGES_RESPONSE - 100, /* delay response */ });
8182

8283
fetchMock.get(new RegExp('.*'), function (url) {
8384
assert.fail('unexpected GET request with url: ' + url);

src/__tests__/browserSuites/push-fallback.spec.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
* Validate the handling of OCCUPANCY and CONTROL events
33
*/
44

5-
import splitChangesMock1 from '../mocks/splitchanges.real.withSegments.json'; // since: -1, till: 1457552620999 (for initial fetch)
6-
import splitChangesMock2 from '../mocks/splitchanges.real.updateWithSegments.json'; // since: 1457552620999, till: 1457552649999 (for SPLIT_UPDATE event)
7-
import splitChangesMock3 from '../mocks/splitchanges.real.updateWithoutSegments.json'; // since: 1457552649999, till: 1457552669999 (for second polling fetch)
5+
import splitChangesMockReal1 from '../mocks/splitchanges.real.withSegments.json'; // since: -1, till: 1457552620999 (for initial fetch)
6+
import splitChangesMockReal2 from '../mocks/splitchanges.real.updateWithSegments.json'; // since: 1457552620999, till: 1457552649999 (for SPLIT_UPDATE event)
7+
import splitChangesMockReal3 from '../mocks/splitchanges.real.updateWithoutSegments.json'; // since: 1457552649999, till: 1457552669999 (for second polling fetch)
88
import membershipsNicolasMock1 from '../mocks/memberships.nicolas@split.io.json';
99
import membershipsNicolasMock2 from '../mocks/memberships.nicolas@split.io.mock2.json';
1010
import membershipsMarcio from '../mocks/memberships.marcio@split.io.json';
@@ -213,7 +213,7 @@ export function testFallback(fetchMock, assert) {
213213
});
214214

215215
// initial split and memberships sync
216-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=-1&rbSince=-1'), { status: 200, body: splitChangesMock1 });
216+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=-1&rbSince=-1'), { status: 200, body: splitChangesMockReal1 });
217217
fetchMock.getOnce(url(settings, '/memberships/nicolas%40split.io'), { status: 200, body: membershipsNicolasMock1 });
218218

219219
// split and segment sync after SSE opened
@@ -249,7 +249,7 @@ export function testFallback(fetchMock, assert) {
249249
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), function () {
250250
const lapse = Date.now() - start;
251251
assert.true(nearlyEqual(lapse, MILLIS_SPLIT_UPDATE_EVENT_DURING_PUSH), 'sync due to SPLIT_UPDATE event');
252-
return { status: 200, body: splitChangesMock2 };
252+
return { status: 200, body: splitChangesMockReal2 };
253253
});
254254

255255
// fetches due to second fallback to polling
@@ -288,7 +288,7 @@ export function testFallback(fetchMock, assert) {
288288
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552649999&rbSince=-1'), function () {
289289
const lapse = Date.now() - start;
290290
assert.true(nearlyEqual(lapse, MILLIS_STREAMING_DISABLED_CONTROL + settings.scheduler.featuresRefreshRate, 100), 'fetch due to fourth fallback to polling');
291-
return { status: 200, body: splitChangesMock3 };
291+
return { status: 200, body: splitChangesMockReal3 };
292292
});
293293
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552669999&rbSince=-1'), function () {
294294
const lapse = Date.now() - start;

src/__tests__/browserSuites/push-initialization-nopush.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,15 @@ function testInitializationFail(fetchMock, assert, fallbackToPolling) {
5353
});
5454

5555
if (fallbackToPolling) {
56-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), function () {
56+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), function () {
5757
assert.true(ready, 'client ready');
5858
const lapse = Date.now() - start;
5959
assert.true(nearlyEqual(lapse, 0), 'polling (first fetch)');
6060
return { status: 200, body: splitChangesMock2 };
6161
});
6262
}
6363

64-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), function () {
64+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), function () {
6565
assert.true(ready, 'client ready');
6666
const lapse = Date.now() - start;
6767
assert.true(nearlyEqual(lapse, settings.scheduler.featuresRefreshRate), 'polling (second fetch)');

src/__tests__/browserSuites/push-initialization-retries.spec.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,18 @@ export function testPushRetriesDueToAuthErrors(fetchMock, assert) {
7171
assert.true(nearlyEqual(lapse, 0), 'initial sync');
7272
return { status: 200, body: splitChangesMock1 };
7373
});
74-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), function () {
74+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), function () {
7575
assert.true(ready, 'client ready before first polling fetch');
7676
const lapse = Date.now() - start;
7777
assert.true(nearlyEqual(lapse, 0), 'fallback to polling');
7878
return { status: 200, body: splitChangesMock2 };
7979
});
80-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), function () {
80+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), function () {
8181
const lapse = Date.now() - start;
8282
assert.true(nearlyEqual(lapse, settings.scheduler.featuresRefreshRate), 'polling');
8383
return { status: 200, body: splitChangesMock2 };
8484
});
85-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), function () {
85+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), function () {
8686
const lapse = Date.now() - start;
8787
assert.true(nearlyEqual(lapse, settings.scheduler.featuresRefreshRate * 2), 'keep polling since auth success buth with push disabled');
8888
client.destroy().then(() => {
@@ -142,18 +142,18 @@ export function testPushRetriesDueToSseErrors(fetchMock, assert) {
142142
assert.true(nearlyEqual(lapse, 0), 'initial sync');
143143
return { status: 200, body: splitChangesMock1 };
144144
});
145-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), function () {
145+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), function () {
146146
assert.true(ready, 'client ready before first polling fetch');
147147
const lapse = Date.now() - start;
148148
assert.true(nearlyEqual(lapse, 0), 'fallback to polling');
149149
return { status: 200, body: splitChangesMock2 };
150150
});
151-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), function () {
151+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), function () {
152152
const lapse = Date.now() - start;
153153
assert.true(nearlyEqual(lapse, settings.scheduler.featuresRefreshRate), 'polling');
154154
return { status: 200, body: splitChangesMock2 };
155155
});
156-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), function () {
156+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), function () {
157157
const lapse = Date.now() - start;
158158
assert.true(nearlyEqual(lapse, expectedTimeToSSEsuccess), 'sync due to success SSE connection');
159159
client.destroy().then(() => {
@@ -260,7 +260,7 @@ export function testSdkDestroyWhileAuthRetries(fetchMock, assert) {
260260

261261
fetchMock.get({ url: url(settings, '/memberships/nicolas%40split.io'), repeat: 2 }, { status: 200, body: membershipsNicolasMock });
262262
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=-1&rbSince=-1'), { status: 200, body: splitChangesMock1 });
263-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), { status: 200, body: splitChangesMock2 });
263+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), { status: 200, body: splitChangesMock2 });
264264

265265
fetchMock.get(new RegExp('.*'), function (url) {
266266
assert.fail('unexpected GET request with url: ' + url);

src/__tests__/browserSuites/push-refresh-token.spec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export function testRefreshToken(fetchMock, assert) {
8888
});
8989

9090
// sync after SSE opened
91-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), { status: 200, body: splitChangesMock2 });
91+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), { status: 200, body: splitChangesMock2 });
9292
fetchMock.getOnce(url(settings, '/memberships/nicolas%40split.io'), { status: 200, body: membershipsNicolasMock1 });
9393

9494
// re-auth due to refresh token, with connDelay of 0.5 seconds
@@ -100,7 +100,7 @@ export function testRefreshToken(fetchMock, assert) {
100100
});
101101

102102
// sync after SSE reopened
103-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), function () {
103+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), function () {
104104
const lapse = Date.now() - start;
105105
assert.true(nearlyEqual(lapse, MILLIS_REFRESH_TOKEN + MILLIS_CONNDELAY), 'sync after SSE connection is reopened');
106106
return { status: 200, body: { ff: { d: [], s: 1457552620999, t: 1457552620999 } } };
@@ -116,7 +116,7 @@ export function testRefreshToken(fetchMock, assert) {
116116
});
117117

118118
// split sync after SSE closed due to push disabled
119-
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=-1'), function () {
119+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=1457552620999&rbSince=100'), function () {
120120
const lapse = Date.now() - start;
121121
assert.true(nearlyEqual(lapse, MILLIS_REFRESH_TOKEN * 2), 'sync after SSE connection is reopened a second time');
122122
setTimeout(() => {

0 commit comments

Comments
 (0)