Skip to content

Commit c1f0463

Browse files
[FSSDK-8950] change identifiers to be required for sendOdpEvent (#823)
* Add event hasNecessaryIdentifiers check during enqueue * Add unit tests for verifying identifier per context * Fix requested PR changes * Change Map initialization
1 parent d11c847 commit c1f0463

File tree

4 files changed

+79
-17
lines changed

4 files changed

+79
-17
lines changed

packages/optimizely-sdk/lib/core/odp/odp_event_manager.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,11 @@ export abstract class OdpEventManager implements IOdpEventManager {
243243
return;
244244
}
245245

246+
if (!this.hasNecessaryIdentifiers(event)) {
247+
this.logger.log(LogLevel.ERROR, 'ODP events should have at least one key-value pair in identifiers.');
248+
return;
249+
}
250+
246251
if (this.queue.length >= this.queueSize) {
247252
this.logger.log(
248253
LogLevel.WARNING,
@@ -257,6 +262,8 @@ export abstract class OdpEventManager implements IOdpEventManager {
257262
this.processQueue();
258263
}
259264

265+
protected abstract hasNecessaryIdentifiers(event: OdpEvent): boolean;
266+
260267
/**
261268
* Process events in the main queue
262269
* @param shouldFlush Flush all events regardless of available queue event count

packages/optimizely-sdk/lib/plugins/odp/event_manager/index.browser.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { IOdpEventManager, OdpEventManager } from '../../../../lib/core/odp/odp_event_manager';
22
import { LogLevel } from '../../../modules/logging';
3+
import { OdpEvent } from "../../../core/odp/odp_event";
34

45
const DEFAULT_BROWSER_QUEUE_SIZE = 100;
56

@@ -28,4 +29,6 @@ export class BrowserOdpEventManager extends OdpEventManager implements IOdpEvent
2829
// in Browser/client-side context, give debug message but leave events in queue
2930
this.getLogger().log(LogLevel.DEBUG, 'ODPConfig not ready. Leaving events in queue.');
3031
}
32+
33+
protected hasNecessaryIdentifiers = (event: OdpEvent): boolean => event.identifiers.size >= 0;
3134
}

packages/optimizely-sdk/lib/plugins/odp/event_manager/index.node.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,6 @@ export class NodeOdpEventManager extends OdpEventManager implements IOdpEventMan
2929
this.getLogger().log(LogLevel.WARNING, 'ODPConfig not ready. Discarding events in queue.');
3030
this.queue = new Array<OdpEvent>();
3131
}
32+
33+
protected hasNecessaryIdentifiers = (event: OdpEvent): boolean => event.identifiers.size >= 1;
3234
}

packages/optimizely-sdk/tests/odpEventManager.spec.ts

Lines changed: 67 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { ODP_EVENT_ACTION, ODP_DEFAULT_EVENT_TYPE } from './../lib/utils/enums/index';
18-
17+
import { ODP_EVENT_ACTION, ODP_DEFAULT_EVENT_TYPE } from '../lib/utils/enums';
1918
import { OdpConfig } from '../lib/core/odp/odp_config';
2019
import { STATE } from '../lib/core/odp/odp_event_manager';
21-
import { NodeOdpEventManager as OdpEventManager } from '../lib/plugins/odp/event_manager/index.node';
20+
import { BrowserOdpEventManager } from "../lib/plugins/odp/event_manager/index.browser";
21+
import { NodeOdpEventManager, NodeOdpEventManager as OdpEventManager } from '../lib/plugins/odp/event_manager/index.node';
2222
import { anything, capture, instance, mock, resetCalls, spy, verify, when } from 'ts-mockito';
2323
import { NodeOdpEventApiManager as OdpEventApiManager } from '../lib/plugins/odp/event_api_manager/index.node';
2424
import { LogHandler, LogLevel } from '../lib/modules/logging';
@@ -33,14 +33,12 @@ const EVENTS: OdpEvent[] = [
3333
't1',
3434
'a1',
3535
new Map([['id-key-1', 'id-value-1']]),
36-
new Map(
37-
Object.entries({
38-
'key-1': 'value1',
39-
'key-2': null,
40-
'key-3': 3.3,
41-
'key-4': true,
42-
})
43-
)
36+
new Map<string, unknown>([
37+
['key-1', 'value1'],
38+
['key-2', null],
39+
['key-3', 3.3],
40+
['key-4', true],
41+
]),
4442
),
4543
new OdpEvent(
4644
't2',
@@ -90,6 +88,26 @@ const PROCESSED_EVENTS: OdpEvent[] = [
9088
)
9189
),
9290
];
91+
const EVENT_WITH_EMPTY_IDENTIFIER = new OdpEvent(
92+
't4',
93+
'a4',
94+
new Map(),
95+
new Map<string, unknown>([
96+
['key-53f3', true],
97+
['key-a04a', 123],
98+
['key-2ab4', 'Linus Torvalds'],
99+
]),
100+
);
101+
const EVENT_WITH_UNDEFINED_IDENTIFIER = new OdpEvent(
102+
't4',
103+
'a4',
104+
undefined,
105+
new Map<string, unknown>([
106+
['key-53f3', false],
107+
['key-a04a', 456],
108+
['key-2ab4', 'Bill Gates']
109+
]),
110+
);
93111
const makeEvent = (id: number) => {
94112
const identifiers = new Map<string, string>();
95113
identifiers.set('identifier1', 'value1-' + id);
@@ -185,12 +203,10 @@ describe('OdpEventManager', () => {
185203
't3',
186204
'a3',
187205
new Map([['id-key-3', 'id-value-3']]),
188-
new Map(
189-
Object.entries({
190-
'key-1': false,
191-
'key-2': { random: 'object', whichShouldFail: true },
192-
})
193-
)
206+
new Map<string, unknown>([
207+
['key-1', false],
208+
['key-2', { random: 'object', whichShouldFail: true }],
209+
]),
194210
);
195211
eventManager.sendEvent(badEvent);
196212

@@ -455,4 +471,38 @@ describe('OdpEventManager', () => {
455471
expect(eventManager['odpConfig'].segmentsToCheck).toContain(Array.from(segmentsToCheck)[0]);
456472
expect(eventManager['odpConfig'].segmentsToCheck).toContain(Array.from(segmentsToCheck)[1]);
457473
});
474+
475+
it('should error when no identifiers are provided in Node', () => {
476+
const eventManager = new NodeOdpEventManager({
477+
odpConfig,
478+
apiManager,
479+
logger,
480+
clientEngine,
481+
clientVersion,
482+
});
483+
484+
eventManager.start();
485+
eventManager.sendEvent(EVENT_WITH_EMPTY_IDENTIFIER);
486+
eventManager.sendEvent(EVENT_WITH_UNDEFINED_IDENTIFIER);
487+
eventManager.stop();
488+
489+
verify(mockLogger.log(LogLevel.ERROR, 'ODP events should have at least one key-value pair in identifiers.')).twice();
490+
});
491+
492+
it('should never error when no identifiers are provided in Browser', () => {
493+
const eventManager = new BrowserOdpEventManager({
494+
odpConfig,
495+
apiManager,
496+
logger,
497+
clientEngine,
498+
clientVersion,
499+
});
500+
501+
eventManager.start();
502+
eventManager.sendEvent(EVENT_WITH_EMPTY_IDENTIFIER);
503+
eventManager.sendEvent(EVENT_WITH_UNDEFINED_IDENTIFIER);
504+
eventManager.stop();
505+
506+
verify(mockLogger.log(LogLevel.ERROR, 'ODP events should have at least one key-value pair in identifiers.')).never();
507+
});
458508
});

0 commit comments

Comments
 (0)