Skip to content

Commit 5bbcaa9

Browse files
[FME-11258] Add impressions disabled by evaluation
1 parent 34fa535 commit 5bbcaa9

File tree

12 files changed

+218
-54
lines changed

12 files changed

+218
-54
lines changed

package-lock.json

Lines changed: 7 additions & 7 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
@@ -38,7 +38,7 @@
3838
"node": ">=14.0.0"
3939
},
4040
"dependencies": {
41-
"@splitsoftware/splitio-commons": "2.8.0",
41+
"@splitsoftware/splitio-commons": "2.8.1-rc.1",
4242
"bloom-filters": "^3.0.4",
4343
"ioredis": "^4.28.0",
4444
"js-yaml": "^3.13.1",
@@ -107,7 +107,7 @@
107107
"test-node-e2e-destroy": "cross-env NODE_ENV=test tape -r ./ts-node.register src/__tests__/destroy/node.spec.js | tap-min",
108108
"test-node-e2e-errorCatching": "cross-env NODE_ENV=test tape -r ./ts-node.register src/__tests__/errorCatching/node.spec.js | tap-min",
109109
"test-node-e2e-push": "cross-env NODE_ENV=test tape -r ./ts-node.register src/__tests__/push/node.spec.js | tap-min",
110-
"test-node-e2e-redis": "cross-env NODE_ENV=test tape -r ./ts-node.register src/__tests__/consumer/node_redis.spec.js | tap-min",
110+
"test-node-e2e-redis": "cross-env NODE_ENV=test tape -r ./ts-node.register src/__tests__/consumer/node_redis.spec.js",
111111
"test-ts-decls": "tsc --build ts-tests",
112112
"test": "npm run test-node && npm run test-browser",
113113
"all": "npm run check && npm run build && npm run test-ts-decls && npm run test",

src/__tests__/consumer/node_redis.spec.js

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ const expectedImpressionCount = [
5454
`UT_SET_MATCHER::${truncateTimeFrame(timeFrame)}`, '2',
5555
`UT_NOT_SET_MATCHER::${truncateTimeFrame(timeFrame)}`, '3',
5656
`always-o.n-with-config::${truncateTimeFrame(timeFrame)}`, '1',
57-
`always-on::${truncateTimeFrame(timeFrame)}`, '1',
57+
`always-on::${truncateTimeFrame(timeFrame)}`, '5',
5858
`hierarchical_splits_testing_on::${truncateTimeFrame(timeFrame)}`, '1',
5959
`hierarchical_splits_testing_off::${truncateTimeFrame(timeFrame)}`, '1',
6060
`hierarchical_splits_testing_on_negated::${truncateTimeFrame(timeFrame)}`, '1',
@@ -158,6 +158,12 @@ tape('Node.js Redis', function (t) {
158158
assert.equal(await client.getTreatment('UT_Segment_member', 'hierarchical_splits_testing_on_negated'), 'off', 'Evaluations using Redis storage should be correct.');
159159
assert.equal(await client.getTreatment('other_key', 'always-on-impressions-disabled-true'), 'on', 'Evaluations using Redis storage should be correct.');
160160

161+
// Verify impressionsDisabled option
162+
assert.deepEqual(await client.getTreatment('other_key', 'always-on', undefined, { impressionsDisabled: true }), 'on', 'Evaluations with impressionsDisabled: true should be correct.');
163+
assert.deepEqual(await client.getTreatmentWithConfig('other_key', 'always-on', undefined, { impressionsDisabled: true }), { treatment: 'on', config: null }, 'Evaluations with impressionsDisabled: true should be correct.');
164+
assert.deepEqual(await client.getTreatments('other_key', ['always-on'], undefined, { impressionsDisabled: true }), { 'always-on': 'on' }, 'Evaluations with impressionsDisabled: true should be correct.');
165+
assert.deepEqual(await client.getTreatmentsWithConfig('other_key', ['always-on'], undefined, { impressionsDisabled: true }), { 'always-on': { treatment: 'on', config: null } }, 'Evaluations with impressionsDisabled: true should be correct.');
166+
161167
// Evaluations with rule-based segments
162168
assert.equal(await client.getTreatment('emi@split.io', 'rbs_test_flag'), 'v2', 'key in excluded segment');
163169
assert.equal(await client.getTreatment('mauro@split.io', 'rbs_test_flag'), 'v2', 'excluded key');
@@ -189,11 +195,11 @@ tape('Node.js Redis', function (t) {
189195
// Validate Impression Counts and Unique Keys for 'always-on-impressions-disabled-true'
190196
exec(`echo "HGETALL ${config.storage.prefix}.SPLITIO.impressions.count" | redis-cli -p ${redisPort}`, async (error, stdout) => {
191197
const trackedImpressionCounts = stdout.split('\n').filter(line => line !== '');
192-
assert.deepEqual(trackedImpressionCounts, [`always-on-impressions-disabled-true::${truncateTimeFrame(timeFrame)}`, '1',], 'Tracked impression counts should be stored in Redis TODO');
198+
assert.deepEqual(trackedImpressionCounts, [`always-on-impressions-disabled-true::${truncateTimeFrame(timeFrame)}`, '1',`always-on::${truncateTimeFrame(timeFrame)}`, '4',], 'Tracked impression counts should be stored in Redis TODO');
193199

194200
exec(`echo "LRANGE ${config.storage.prefix}.SPLITIO.uniquekeys 0 20" | redis-cli -p ${redisPort}`, async (error, stdout) => {
195201
const storedUniqueKeys = stdout.split('\n').filter(line => line !== '').map(JSON.parse);
196-
assert.deepEqual(storedUniqueKeys, [{ 'f': 'always-on-impressions-disabled-true', 'ks': ['other_key'] }], 'Unique keys should be stored in Redis TODO');
202+
assert.deepEqual(storedUniqueKeys, [{ 'f': 'always-on-impressions-disabled-true', 'ks': ['other_key'] }, { f: 'always-on', ks: [ 'other_key' ] }], 'Unique keys should be stored in Redis TODO');
197203

198204
// Validate stored impressions and events
199205
exec(`echo "LLEN ${config.storage.prefix}.SPLITIO.impressions \n LLEN ${config.storage.prefix}.SPLITIO.events" | redis-cli -p ${redisPort}`, (error, stdout) => {
@@ -308,6 +314,12 @@ tape('Node.js Redis', function (t) {
308314
// this should be deduped
309315
assert.equal(await client.getTreatment('UT_Segment_member', 'hierarchical_splits_testing_on_negated'), 'off', 'Evaluations using Redis storage should be correct.');
310316

317+
// Verify impressionsDisabled option
318+
assert.deepEqual(await client.getTreatment('other_key', 'always-on', undefined, { impressionsDisabled: true }), 'on', 'Evaluations with impressionsDisabled: true should be correct.');
319+
assert.deepEqual(await client.getTreatmentWithConfig('other_key', 'always-on', undefined, { impressionsDisabled: true }), { treatment: 'on', config: null }, 'Evaluations with impressionsDisabled: true should be correct.');
320+
assert.deepEqual(await client.getTreatments('other_key', ['always-on'], undefined, { impressionsDisabled: true }), { 'always-on': 'on' }, 'Evaluations with impressionsDisabled: true should be correct.');
321+
assert.deepEqual(await client.getTreatmentsWithConfig('other_key', ['always-on'], undefined, { impressionsDisabled: true }), { 'always-on': { treatment: 'on', config: null } }, 'Evaluations with impressionsDisabled: true should be correct.');
322+
311323
assert.equal(typeof client.track('nicolas@split.io', 'user', 'test.redis.event', 18).then, 'function', 'Track calls should always return a promise on Redis mode.');
312324
assert.equal(typeof client.track().then, 'function', 'Track calls should always return a promise on Redis mode, even when parameters are incorrect.');
313325

@@ -357,7 +369,7 @@ tape('Node.js Redis', function (t) {
357369
{ 'f': 'UT_SET_MATCHER', 'ks': ['UT_Segment_member'] },
358370
{ 'f': 'UT_NOT_SET_MATCHER', 'ks': ['UT_Segment_member'] },
359371
{ 'f': 'always-o.n-with-config', 'ks': ['UT_Segment_member'] },
360-
{ 'f': 'always-on', 'ks': ['UT_Segment_member'] },
372+
{ 'f': 'always-on', 'ks': ['UT_Segment_member', 'other_key'] },
361373
{ 'f': 'hierarchical_splits_testing_on', 'ks': ['UT_Segment_member'] },
362374
{ 'f': 'hierarchical_splits_testing_off', 'ks': ['UT_Segment_member'] },
363375
{ 'f': 'hierarchical_splits_testing_on_negated', 'ks': ['UT_Segment_member'] },
@@ -404,6 +416,12 @@ tape('Node.js Redis', function (t) {
404416
assert.equal(await client.getTreatment('UT_Segment_member', 'hierarchical_splits_testing_off'), 'off', 'Evaluations using Redis storage should be correct.');
405417
assert.equal(await client.getTreatment('UT_Segment_member', 'hierarchical_splits_testing_on_negated'), 'off', 'Evaluations using Redis storage should be correct.');
406418

419+
// Verify impressionsDisabled option
420+
assert.deepEqual(await client.getTreatment('other_key', 'always-on', undefined, { impressionsDisabled: true }), 'on', 'Evaluations with impressionsDisabled: true should be correct.');
421+
assert.deepEqual(await client.getTreatmentWithConfig('other_key', 'always-on', undefined, { impressionsDisabled: true }), { treatment: 'on', config: null }, 'Evaluations with impressionsDisabled: true should be correct.');
422+
assert.deepEqual(await client.getTreatments('other_key', ['always-on'], undefined, { impressionsDisabled: true }), { 'always-on': 'on' }, 'Evaluations with impressionsDisabled: true should be correct.');
423+
assert.deepEqual(await client.getTreatmentsWithConfig('other_key', ['always-on'], undefined, { impressionsDisabled: true }), { 'always-on': { treatment: 'on', config: null } }, 'Evaluations with impressionsDisabled: true should be correct.');
424+
407425
assert.equal(typeof client.track('nicolas@split.io', 'user', 'test.redis.event', 18).then, 'function', 'Track calls should always return a promise on Redis mode.');
408426
assert.equal(typeof client.track().then, 'function', 'Track calls should always return a promise on Redis mode, even when parameters are incorrect.');
409427

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import { SplitFactory } from '../..';
2+
import { settingsFactory } from '../../settings';
3+
import splitChangesMock1 from '../mocks/splitchanges.since.-1.json';
4+
import { url } from '../testUtils';
5+
6+
const baseUrls = {
7+
sdk: 'https://sdk.baseurl/evaluationsImpressionsDisabledSuite',
8+
events: 'https://events.baseurl/evaluationsImpressionsDisabledSuite',
9+
telemetry: 'https://telemetry.baseurl/evaluationsImpressionsDisabledSuite'
10+
};
11+
12+
const settings = settingsFactory({
13+
core: {
14+
key: '<fake id>'
15+
},
16+
urls: baseUrls,
17+
streamingEnabled: false
18+
});
19+
20+
const config = {
21+
core: {
22+
authorizationKey: '<fake-token>'
23+
},
24+
urls: baseUrls,
25+
streamingEnabled: false
26+
};
27+
28+
export default async function (fetchMock, assert) {
29+
30+
assert.test('Evaluations / impressionsDisabled option', async t => {
31+
// Mocking split changes
32+
fetchMock.getOnce(url(settings, '/splitChanges?s=1.3&since=-1&rbSince=-1'), { status: 200, body: splitChangesMock1 });
33+
fetchMock.get(new RegExp(`${url(settings, '/segmentChanges/')}.*`), { status: 200, body: { since: 10, till: 10, name: 'segmentName', added: [], removed: [] } });
34+
fetchMock.post(url(settings, '/v1/keys/ss'), 200);
35+
fetchMock.post(url(settings, '/v1/metrics/usage'), 200);
36+
fetchMock.post(url(settings, '/v1/metrics/config'), 200);
37+
// Mock default telemetry URLs as fallback
38+
fetchMock.post('https://telemetry.split.io/api/v1/keys/ss', 200);
39+
fetchMock.post('https://telemetry.split.io/api/v1/metrics/usage', 200);
40+
fetchMock.post('https://telemetry.split.io/api/v1/metrics/usage', 200);
41+
fetchMock.post('https://telemetry.split.io/api/v1/metrics/config', 200);
42+
43+
fetchMock.post(url(settings, '/testImpressions/bulk'), 200);
44+
fetchMock.post(url(settings, '/testImpressions/count'), 200);
45+
46+
const splitio = SplitFactory(config);
47+
const client = splitio.client();
48+
49+
await client.ready();
50+
51+
// getTreatment
52+
t.equal(client.getTreatment('emi@split.io', 'split_with_config', { impressionsDisabled: true }), 'o.n', 'getTreatment with impressionsDisabled: true returns correct treatment');
53+
t.equal(client.getTreatment('emi@split.io', 'split_with_config', { impressionsDisabled: false }), 'o.n', 'getTreatment with impressionsDisabled: false returns correct treatment');
54+
55+
// getTreatments
56+
t.deepEqual(client.getTreatments('emi@split.io', ['split_with_config', 'whitelist'], { impressionsDisabled: true }), {
57+
split_with_config: 'o.n',
58+
whitelist: 'not_allowed'
59+
}, 'getTreatments with impressionsDisabled: true returns correct treatments');
60+
61+
// getTreatmentWithConfig
62+
const expectedConfig = '{"color":"brown","dimensions":{"height":12,"width":14},"text":{"inner":"click me"}}';
63+
t.deepEqual(client.getTreatmentWithConfig('emi@split.io', 'split_with_config', { impressionsDisabled: true }), {
64+
treatment: 'o.n',
65+
config: expectedConfig
66+
}, 'getTreatmentWithConfig with impressionsDisabled: true returns correct treatment and config');
67+
68+
// getTreatmentsWithConfig
69+
t.deepEqual(client.getTreatmentsWithConfig('emi@split.io', ['split_with_config', 'whitelist'], { impressionsDisabled: true }), {
70+
split_with_config: { treatment: 'o.n', config: expectedConfig },
71+
whitelist: { treatment: 'not_allowed', config: null }
72+
}, 'getTreatmentsWithConfig with impressionsDisabled: true returns correct treatments and configs');
73+
74+
await client.destroy();
75+
t.end();
76+
});
77+
}

0 commit comments

Comments
 (0)