Skip to content

Commit 8fa0c9b

Browse files
authored
throw error from createUserContext in case of invalid input (#1063)
1 parent e3234c7 commit 8fa0c9b

File tree

3 files changed

+24
-16
lines changed

3 files changed

+24
-16
lines changed

lib/optimizely/index.tests.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { assert, expect } from 'chai';
1717
import sinon from 'sinon';
1818
import { sprintf } from '../utils/fns';
1919
import { NOTIFICATION_TYPES } from '../notification_center/type';
20-
import Optimizely from './';
20+
import Optimizely, { INVALID_ATTRIBUTES, INVALID_IDENTIFIER } from './';
2121
import OptimizelyUserContext from '../optimizely_user_context';
2222
import { OptimizelyDecideOption } from '../shared_types';
2323
import AudienceEvaluator from '../core/audience_evaluator';
@@ -4379,14 +4379,16 @@ describe('lib/optimizely', function() {
43794379
assert.deepEqual(userId, user.getUserId());
43804380
});
43814381

4382-
it('should return null OptimizelyUserContext when input userId is null', function() {
4383-
var user = optlyInstance.createUserContext(null);
4384-
assert.deepEqual(null, user);
4382+
it('should throw error when input userId is null', function() {
4383+
assert.throws(() => {
4384+
optlyInstance.createUserContext(null);
4385+
}, Error, INVALID_IDENTIFIER);
43854386
});
43864387

4387-
it('should return null OptimizelyUserContext when input userId is undefined', function() {
4388-
var user = optlyInstance.createUserContext(undefined);
4389-
assert.deepEqual(null, user);
4388+
it('should throw error when input userId is undefined', function() {
4389+
assert.throws(() => {
4390+
optlyInstance.createUserContext(undefined);
4391+
}, Error, INVALID_IDENTIFIER);
43904392
});
43914393

43924394
it('should create multiple instances of OptimizelyUserContext', function() {
@@ -4405,11 +4407,11 @@ describe('lib/optimizely', function() {
44054407
assert.deepEqual(user2.getUserId(), userId2);
44064408
});
44074409

4408-
it('should call the error handler for invalid user ID and return null', function() {
4410+
it('should call the error handler for invalid user ID and throw', function() {
44094411
const { optlyInstance, errorNotifier, createdLogger } = getOptlyInstance({
44104412
datafileObj: testData.getTestDecideProjectConfig(),
44114413
});
4412-
assert.isNull(optlyInstance.createUserContext(1));
4414+
assert.throws(() => optlyInstance.createUserContext(1), Error, INVALID_IDENTIFIER);
44134415
sinon.assert.calledOnce(errorNotifier.notify);
44144416
// var errorMessage = errorHandler.handleError.lastCall.args[0].message;
44154417
// assert.strictEqual(errorMessage, sprintf(INVALID_INPUT_FORMAT, 'OPTIMIZELY', 'user_id'));
@@ -4418,11 +4420,11 @@ describe('lib/optimizely', function() {
44184420
// assert.strictEqual(logMessage, sprintf(INVALID_INPUT_FORMAT, 'OPTIMIZELY', 'user_id'));
44194421
});
44204422

4421-
it('should call the error handler for invalid attributes and return null', function() {
4423+
it('should call the error handler for invalid attributes and throw', function() {
44224424
const { optlyInstance, errorNotifier, createdLogger } = getOptlyInstance({
44234425
datafileObj: testData.getTestDecideProjectConfig(),
44244426
});
4425-
assert.isNull(optlyInstance.createUserContext('user1', 'invalid_attributes'));
4427+
assert.throws(() => optlyInstance.createUserContext('user1', 'invalid_attributes'), Error, INVALID_ATTRIBUTES);
44264428
sinon.assert.calledOnce(errorNotifier.notify);
44274429
// var errorMessage = errorHandler.handleError.lastCall.args[0].message;
44284430
// assert.strictEqual(errorMessage, sprintf(INVALID_ATTRIBUTES, 'ATTRIBUTES_VALIDATOR'));

lib/optimizely/index.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ type DecisionReasons = (string | number)[];
114114

115115
export const INSTANCE_CLOSED = 'Instance closed';
116116
export const ONREADY_TIMEOUT = 'onReady timeout expired after %s ms';
117+
export const INVALID_IDENTIFIER = 'Invalid identifier';
118+
export const INVALID_ATTRIBUTES = 'Invalid attributes';
117119

118120
/**
119121
* options required to create optimizely object
@@ -1356,13 +1358,17 @@ export default class Optimizely extends BaseService implements Client {
13561358
* @param {string} userId (Optional) The user ID to be used for bucketing.
13571359
* @param {UserAttributes} attributes (Optional) user attributes.
13581360
* @return {OptimizelyUserContext|null} An OptimizelyUserContext associated with this OptimizelyClient or
1359-
* null if provided inputs are invalid
1361+
* throws if provided inputs are invalid
13601362
*/
1361-
createUserContext(userId?: string, attributes?: UserAttributes): OptimizelyUserContext | null {
1363+
createUserContext(userId?: string, attributes?: UserAttributes): OptimizelyUserContext {
13621364
const userIdentifier = userId ?? this.vuidManager?.getVuid();
13631365

1364-
if (userIdentifier === undefined || !this.validateInputs({ user_id: userIdentifier }, attributes)) {
1365-
return null;
1366+
if (userIdentifier === undefined || !this.validateInputs({ user_id: userIdentifier })) {
1367+
throw new Error(INVALID_IDENTIFIER);
1368+
}
1369+
1370+
if (!this.validateInputs({}, attributes)) {
1371+
throw new Error(INVALID_ATTRIBUTES);
13661372
}
13671373

13681374
const userContext = new OptimizelyUserContext({

lib/shared_types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ export interface OptimizelyVariable {
293293
export interface Client {
294294
// TODO: In the future, will add a function to allow overriding the VUID.
295295
getVuid(): string | undefined;
296-
createUserContext(userId?: string, attributes?: UserAttributes): OptimizelyUserContext | null;
296+
createUserContext(userId?: string, attributes?: UserAttributes): OptimizelyUserContext;
297297
notificationCenter: NotificationCenter;
298298
activate(experimentKey: string, userId: string, attributes?: UserAttributes): string | null;
299299
track(eventKey: string, userId: string, attributes?: UserAttributes, eventTags?: EventTags): void;

0 commit comments

Comments
 (0)