Skip to content

Commit 43ee9f6

Browse files
authored
Merge branch 'master' into jnguyen/fixes-for-fsc
2 parents cf803ae + 34a7bf0 commit 43ee9f6

File tree

6 files changed

+70
-9
lines changed

6 files changed

+70
-9
lines changed

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

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

246-
if (!this.odpConfig.isReady()) {
247-
this.logger.log(LogLevel.DEBUG, 'Unable to Process ODP Event. ODPConfig is not ready.');
248-
return;
249-
}
250-
251246
if (this.queue.length >= this.queueSize) {
252247
this.logger.log(
253248
LogLevel.WARNING,

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,13 @@ export class OdpSegmentApiManager implements IOdpSegmentApiManager {
108108
}
109109

110110
if (parsedSegments.errors?.length > 0) {
111-
const errors = parsedSegments.errors.map(e => e.message).join('; ');
111+
const { code, classification } = parsedSegments.errors[0].extensions;
112112

113-
this.logger.log(LogLevel.ERROR, `${AUDIENCE_FETCH_FAILURE_MESSAGE} (${errors})`);
113+
if (code == "INVALID_IDENTIFIER_EXCEPTION") {
114+
this.logger.log(LogLevel.ERROR, `${AUDIENCE_FETCH_FAILURE_MESSAGE} (invalid identifier)`);
115+
} else {
116+
this.logger.log(LogLevel.ERROR, `${AUDIENCE_FETCH_FAILURE_MESSAGE} (${classification})`);
117+
}
114118

115119
return null;
116120
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export interface Location {
5858
* Extended error information
5959
*/
6060
export interface Extension {
61+
code: string;
6162
classification: string;
6263
}
6364

packages/optimizely-sdk/lib/index.browser.tests.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,40 @@ describe('javascript-sdk (Browser)', function() {
10491049

10501050
sinon.assert.notCalled(logger.error);
10511051
});
1052+
1053+
it('should send odp client_initialized on client instantiation', async () => {
1054+
const odpConfig = new OdpConfig();
1055+
const apiManager = new BrowserOdpEventApiManager(mockRequestHandler, logger);
1056+
sinon.spy(apiManager, 'sendEvents');
1057+
const eventManager = new BrowserOdpEventManager({
1058+
odpConfig,
1059+
apiManager,
1060+
logger,
1061+
});
1062+
const datafile = testData.getOdpIntegratedConfigWithSegments();
1063+
const client = optimizelyFactory.createInstance({
1064+
datafile,
1065+
errorHandler: fakeErrorHandler,
1066+
eventDispatcher: fakeEventDispatcher,
1067+
eventBatchSize: null,
1068+
logger,
1069+
odpOptions: {
1070+
odpConfig,
1071+
eventManager,
1072+
},
1073+
});
1074+
1075+
const readyData = await client.onReady();
1076+
assert.equal(readyData.success, true);
1077+
assert.isUndefined(readyData.reason);
1078+
1079+
clock.tick(100);
1080+
1081+
const [,,events] = apiManager.sendEvents.getCall(0).args;
1082+
const [firstEvent] = events;
1083+
assert.equal(firstEvent.action, 'client_initialized');
1084+
assert.equal(firstEvent.type, 'fullstack');
1085+
});
10521086
});
10531087
});
10541088
});

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ describe('OdpEventManager', () => {
168168

169169
eventManager.sendEvent(EVENTS[0]);
170170

171-
verify(mockLogger.log(LogLevel.DEBUG, 'Unable to Process ODP Event. ODPConfig is not ready.')).once();
171+
// In a Node context, the events should be discarded
172+
verify(mockLogger.log(LogLevel.WARNING, 'ODPConfig not ready. Discarding events in queue.')).once();
172173
});
173174

174175
it('should discard events with invalid data', () => {

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,32 @@ describe('OdpSegmentApiManager', () => {
179179
});
180180

181181
it('should handle error with invalid identifier', async () => {
182+
const INVALID_USER_ID = 'invalid-user';
183+
const errorJsonResponse =
184+
'{"errors":[{"message":' +
185+
'"Exception while fetching data (/customer) : ' +
186+
`Exception: could not resolve _fs_user_id = ${INVALID_USER_ID}",` +
187+
'"locations":[{"line":1,"column":8}],"path":["customer"],' +
188+
'"extensions":{"code": "INVALID_IDENTIFIER_EXCEPTION","classification":"DataFetchingException"}}],' +
189+
'"data":{"customer":null}}';
190+
when(mockRequestHandler.makeRequest(anything(), anything(), anything(), anything())).thenReturn(
191+
abortableRequest(200, errorJsonResponse)
192+
);
193+
const manager = managerInstance();
194+
195+
const segments = await manager.fetchSegments(
196+
API_key,
197+
GRAPHQL_ENDPOINT,
198+
USER_KEY,
199+
INVALID_USER_ID,
200+
SEGMENTS_TO_CHECK
201+
);
202+
203+
expect(segments).toBeNull();
204+
verify(mockLogger.log(LogLevel.ERROR, 'Audience segments fetch failed (invalid identifier)')).once();
205+
});
206+
207+
it('should handle other fetch error responses', async () => {
182208
const INVALID_USER_ID = 'invalid-user';
183209
const errorJsonResponse =
184210
'{"errors":[{"message":' +
@@ -201,7 +227,7 @@ describe('OdpSegmentApiManager', () => {
201227
);
202228

203229
expect(segments).toBeNull();
204-
verify(mockLogger.log(anything(), anyString())).once();
230+
verify(mockLogger.log(LogLevel.ERROR, 'Audience segments fetch failed (DataFetchingException)')).once();
205231
});
206232

207233
it('should handle unrecognized JSON responses', async () => {

0 commit comments

Comments
 (0)