Skip to content

Commit 31a4700

Browse files
Add wiring tests
1 parent cf03ab3 commit 31a4700

12 files changed

Lines changed: 2077 additions & 7 deletions

File tree

CHANGES.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
2.10.0 (Dec 16, 2025)
2+
- Updated @splitsoftware/splitio library, using @splitsoftware/splitio-commons:2.10.0 instead that includes
3+
- Added property `impressionsDisabled` in getTreatment(s) `evaluationOptions` parameter, to disable impressions per evaluations.
4+
15
2.8.1 (Oct 13, 2025)
26
- Updated base image to node:24.10.0-alpine3.22
37

listener/manager.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const fetch = require('node-fetch');
1+
const fetch = require('../sdk/platform/getFetch').getFetch();
22
const config = require('config');
33
const repeat = require('./repeat');
44
const ImpressionQueue = require('./queue');

package-lock.json

Lines changed: 60 additions & 2 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 & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "split-evaluator",
3-
"version": "2.9.1",
3+
"version": "2.9.0",
44
"description": "Split-Evaluator",
55
"repository": "splitio/split-evaluator",
66
"homepage": "https://github.com/splitio/split-evaluator#readme",
@@ -57,6 +57,7 @@
5757
"@babel/preset-env": "^7.15.6",
5858
"babel-jest": "^29.7.0",
5959
"eslint": "^8.9.0",
60+
"fetch-mock": "^11.1.5",
6061
"jest": "^29.7.0",
6162
"nodemon": "^3.1.0",
6263
"superagent": "^8.0.9",
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
const { isConsumerMode } = require('@splitsoftware/splitio-commons/cjs/utils/settingsValidation/mode');
2+
const { getSplitFactory } = require('../../sdk');
3+
4+
describe('SDK Wiring & Glue Code Integration', () => {
5+
const baseConfig = {
6+
core: {
7+
authorizationKey: 'localhost',
8+
},
9+
features: {
10+
'test_feature': 'on',
11+
},
12+
};
13+
14+
test('Should initialize correctly in OPTIMIZED mode - bloomFilter', async () => {
15+
const optimizedConfig = {
16+
...baseConfig,
17+
sync: {
18+
impressionsMode: 'OPTIMIZED',
19+
},
20+
};
21+
22+
const { factory } = getSplitFactory(optimizedConfig);
23+
const client = factory.client();
24+
25+
await client.ready();
26+
27+
const treatment = client.getTreatment('test', 'my-experiment');
28+
expect(treatment).toBe('on');
29+
30+
await expect(client.destroy()).resolves.toBeUndefined();
31+
});
32+
33+
test('SDK_READY event must be emitted and resolved', (done) => {
34+
const { factory } = getSplitFactory(baseConfig);
35+
const client = factory.client();
36+
37+
let readyCalled = false;
38+
39+
client.on(client.Event.SDK_READY, () => {
40+
readyCalled = true;
41+
client.destroy().then(async () => {
42+
expect(readyCalled).toBe(true);
43+
await expect(client.destroy()).resolves.toBeUndefined();
44+
45+
done();
46+
});
47+
});
48+
49+
setTimeout(() => {
50+
if (!readyCalled) {
51+
client.destroy();
52+
done(new Error('SDK_READY event was not emitted within timeout'));
53+
}
54+
}, 2000);
55+
});
56+
57+
test('ExtraProps adds getRolloutPlan to Manager', async () => {
58+
const { factory } = getSplitFactory(baseConfig);
59+
60+
expect(typeof factory.getRolloutPlan).toBe('function');
61+
62+
const plan = factory.getRolloutPlan({ feature: 'my-experiment' });
63+
expect(plan).toBeDefined();
64+
expect(plan.splitChanges).toBeDefined();
65+
66+
await expect(factory.destroy()).resolves.toBeUndefined();
67+
68+
});
69+
70+
test('Destroy must resolve and clean up resources', async () => {
71+
const { factory } = getSplitFactory(baseConfig);
72+
const client = factory.client();
73+
74+
await client.ready();
75+
76+
await expect(client.destroy()).resolves.toBeUndefined();
77+
});
78+
79+
test('Must force STANDALONE mode if it receives CONSUMER mode', async () => {
80+
const consumerConfig = {
81+
...baseConfig,
82+
mode: 'consumer',
83+
storage: {
84+
type: 'REDIS',
85+
prefix: 'test',
86+
},
87+
};
88+
89+
const { factory } = getSplitFactory(consumerConfig);
90+
91+
expect(isConsumerMode(factory.settings)).toBe(false);
92+
93+
const client = factory.client();
94+
expect(client).toBeDefined();
95+
96+
await client.ready();
97+
98+
const treatment = client.getTreatment('test', 'my-experiment');
99+
expect(treatment).toBe('on');
100+
101+
await expect(client.destroy()).resolves.toBeUndefined();
102+
});
103+
});
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
const { SplitFactory } = require('../');
2+
const { fetchMock } = require('./utils/fetchMock');
3+
4+
const splitChangesMock1 = require('./mocks/splitchanges.since.-1.json');
5+
const splitChangesMock2 = require('./mocks/splitchanges.since.1457552620999.json');
6+
7+
8+
describe('Evaluator Integration (Online Mode)', () => {
9+
const apiKey = 'sdk-test-api-key';
10+
const testUrls = {
11+
sdk: 'https://sdk.baseurl',
12+
events: 'https://events.baseurl',
13+
auth: 'https://auth.baseurl',
14+
telemetry: 'https://telemetry.baseurl',
15+
};
16+
17+
fetchMock.get(testUrls.sdk + '/splitChanges?s=1.3&since=-1&rbSince=-1', { status: 200, body: splitChangesMock1 });
18+
fetchMock.get(testUrls.sdk + '/splitChanges?s=1.3&since=1457552620999&rbSince=100', { status: 200, body: splitChangesMock2 });
19+
fetchMock.get(testUrls.auth + '/v2/auth?s=1.3', 200);
20+
fetchMock.getOnce(testUrls.sdk + '/segmentChanges/employees?since=-1', { status: 200, body: { name: 'employees', added: [], removed: [], since: -1, till: 100 } });
21+
fetchMock.getOnce(testUrls.sdk + '/segmentChanges/splitters?since=-1', { status: 200, body: { name: 'splitters', added: [], removed: [], since: -1, till: 100 } });
22+
fetchMock.getOnce(testUrls.sdk + '/segmentChanges/developers?since=-1', { status: 200, body: { name: 'developers', added: [], removed: [], since: -1, till: 100 } });
23+
fetchMock.get(testUrls.sdk + '/segmentChanges/employees?since=100', { status: 200, body: { name: 'employees', added: [], removed: [], since: 100, till: 100 } });
24+
fetchMock.get(testUrls.sdk + '/segmentChanges/splitters?since=100', { status: 200, body: { name: 'splitters', added: [], removed: [], since: 100, till: 100 } });
25+
fetchMock.get(testUrls.sdk + '/segmentChanges/developers?since=100', { status: 200, body: { name: 'developers', added: [], removed: [], since: 100, till: 100 } });
26+
fetchMock.postOnce(testUrls.events + '/testImpressions/bulk', 200);
27+
fetchMock.postOnce(testUrls.events + '/testImpressions/count', 200);
28+
fetchMock.get(testUrls.sdk + '/segmentChanges/segment_excluded_by_rbs?since=-1', { status: 200, body: { added: ['emi@split.io'], removed: [], since: -1, till: 1 } });
29+
fetchMock.get(testUrls.sdk + '/segmentChanges/segment_excluded_by_rbs?since=1', { status: 200, body: { added: [], removed: [], since: 1, till: 1 } });
30+
fetchMock.post(testUrls.events + '/testImpressions/bulk', 200);
31+
fetchMock.post(testUrls.events + '/testImpressions/count', 200);
32+
fetchMock.post(testUrls.telemetry + '/v1/metrics/config', 200);
33+
fetchMock.post(testUrls.telemetry + '/v1/metrics/usage', 200);
34+
35+
afterAll(() => {
36+
fetchMock.reset();
37+
});
38+
39+
test('Full Lifecycle: Init -> Download -> Evaluate -> Destroy', async () => {
40+
const factory = SplitFactory({
41+
core: { authorizationKey: apiKey },
42+
startup: { readyTimeout: 2 },
43+
urls: testUrls,
44+
});
45+
const client = factory.client();
46+
47+
await new Promise((resolve, reject) => {
48+
client.on(client.Event.SDK_READY, resolve);
49+
client.on(client.Event.SDK_READY_TIMED_OUT, () => reject(new Error('Timeout waiting for SDK_READY')));
50+
});
51+
52+
// 2. Verify Evaluation (Storage working)
53+
const treatment = client.getTreatment('user1', 'always_on');
54+
expect(treatment).toBe('on');
55+
56+
// 3. Verify Cleanup
57+
await client.destroy();
58+
});
59+
});

0 commit comments

Comments
 (0)