diff --git a/packages/optimizely-sdk/lib/index.browser.tests.js b/packages/optimizely-sdk/lib/index.browser.tests.js index 3df25120c..cb1bba9be 100644 --- a/packages/optimizely-sdk/lib/index.browser.tests.js +++ b/packages/optimizely-sdk/lib/index.browser.tests.js @@ -28,6 +28,17 @@ import eventProcessorConfigValidator from './utils/event_processor_config_valida var LocalStoragePendingEventsDispatcher = eventProcessor.LocalStoragePendingEventsDispatcher; describe('javascript-sdk', function() { + var clock; + beforeEach(function() { + sinon.stub(optimizelyFactory.eventDispatcher, 'dispatchEvent'); + clock = sinon.useFakeTimers(new Date()); + }); + + afterEach(function() { + optimizelyFactory.eventDispatcher.dispatchEvent.restore(); + clock.restore(); + }); + describe('APIs', function() { it('should expose logger, errorHandler, eventDispatcher and enums', function() { assert.isDefined(optimizelyFactory.logging); @@ -166,19 +177,6 @@ describe('javascript-sdk', function() { assert.equal('react-sdk', optlyInstance.clientEngine); }); - it('should allow passing of "react-sdk" as the clientEngine', function() { - var optlyInstance = optimizelyFactory.createInstance({ - clientEngine: 'react-sdk', - datafile: {}, - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - }); - // Invalid datafile causes onReady Promise rejection - catch this error - optlyInstance.onReady().catch(function() {}); - assert.equal('react-sdk', optlyInstance.clientEngine); - }); - it('should activate with provided event dispatcher', function() { var optlyInstance = optimizelyFactory.createInstance({ datafile: testData.getTestProjectConfig(), @@ -393,7 +391,7 @@ describe('javascript-sdk', function() { describe('event processor configuration', function() { var eventProcessorSpy; beforeEach(function() { - eventProcessorSpy = sinon.stub(eventProcessor, 'LogTierV1EventProcessor').callThrough(); + eventProcessorSpy = sinon.spy(eventProcessor, 'LogTierV1EventProcessor'); }); afterEach(function() { diff --git a/packages/optimizely-sdk/lib/index.react_native.tests.js b/packages/optimizely-sdk/lib/index.react_native.tests.js index b876d0e3b..769406ddc 100644 --- a/packages/optimizely-sdk/lib/index.react_native.tests.js +++ b/packages/optimizely-sdk/lib/index.react_native.tests.js @@ -23,10 +23,20 @@ import testData from './tests/test_data'; import packageJSON from '../package.json'; import optimizelyFactory from './index.react_native'; import configValidator from './utils/config_validator'; -import defaultEventDispatcher from './plugins/event_dispatcher/index.browser'; import eventProcessorConfigValidator from './utils/event_processor_config_validator'; describe('javascript-sdk/react-native', function() { + var clock; + beforeEach(function() { + sinon.stub(optimizelyFactory.eventDispatcher, 'dispatchEvent'); + clock = sinon.useFakeTimers(new Date()); + }); + + afterEach(function() { + optimizelyFactory.eventDispatcher.dispatchEvent.restore(); + clock.restore(); + }); + describe('APIs', function() { it('should expose logger, errorHandler, eventDispatcher and enums', function() { assert.isDefined(optimizelyFactory.logging); @@ -120,16 +130,6 @@ describe('javascript-sdk/react-native', function() { }); describe('when no event dispatcher passed to createInstance', function() { - beforeEach(function() { - sinon.stub(defaultEventDispatcher, 'dispatchEvent', function(evt, cb) { - cb(); - }); - }); - - afterEach(function() { - defaultEventDispatcher.dispatchEvent.restore(); - }); - it('uses the default event dispatcher', function() { var optlyInstance = optimizelyFactory.createInstance({ datafile: testData.getTestProjectConfig(), @@ -137,9 +137,8 @@ describe('javascript-sdk/react-native', function() { logger: silentLogger, }); optlyInstance.activate('testExperiment', 'testUser'); - return optlyInstance.close().then(function() { - sinon.assert.calledOnce(defaultEventDispatcher.dispatchEvent); - }); + clock.tick(30001) + sinon.assert.calledOnce(optimizelyFactory.eventDispatcher.dispatchEvent); }); }); @@ -185,7 +184,7 @@ describe('javascript-sdk/react-native', function() { describe('event processor configuration', function() { var eventProcessorSpy; beforeEach(function() { - eventProcessorSpy = sinon.stub(eventProcessor, 'LogTierV1EventProcessor').callThrough(); + eventProcessorSpy = sinon.spy(eventProcessor, 'LogTierV1EventProcessor'); }); afterEach(function() { diff --git a/packages/optimizely-sdk/lib/optimizely/index.tests.js b/packages/optimizely-sdk/lib/optimizely/index.tests.js index 77ce8d6e0..b0b98a260 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely/index.tests.js @@ -46,6 +46,7 @@ describe('lib/optimizely', function() { var ProjectConfigManagerStub; var globalStubErrorHandler; var stubLogHandler; + var clock; beforeEach(function() { logging.setLogLevel('notset'); stubLogHandler = { @@ -65,12 +66,16 @@ describe('lib/optimizely', function() { onReady: sinon.stub().returns({ then: function() {} }), }; }); + sinon.stub(eventDispatcher, 'dispatchEvent'); + clock = sinon.useFakeTimers(new Date()); }); afterEach(function() { ProjectConfigManagerStub.restore(); logging.resetErrorHandler(); logging.resetLogger(); + eventDispatcher.dispatchEvent.restore(); + clock.restore(); }); describe('constructor', function() { @@ -272,7 +277,6 @@ describe('lib/optimizely', function() { describe('APIs', function() { var optlyInstance; var bucketStub; - var clock; var createdLogger = logger.createLogger({ logLevel: LOG_LEVEL.INFO, logToConsole: false, @@ -290,20 +294,15 @@ describe('lib/optimizely', function() { }); bucketStub = sinon.stub(bucketer, 'bucket'); - sinon.stub(eventDispatcher, 'dispatchEvent'); sinon.stub(errorHandler, 'handleError'); sinon.stub(createdLogger, 'log'); sinon.stub(fns, 'uuid').returns('a68cf1ad-0393-4e18-af87-efe8f01a7c9c'); - - clock = sinon.useFakeTimers(new Date().getTime()); }); afterEach(function() { bucketer.bucket.restore(); - eventDispatcher.dispatchEvent.restore(); errorHandler.handleError.restore(); createdLogger.log.restore(); - clock.restore(); fns.uuid.restore(); }); @@ -3172,7 +3171,7 @@ describe('lib/optimizely', function() { it('returns the right value from getAllFeatureVariables and send notification with featureEnabled true', function() { var result = optlyInstance.getAllFeatureVariables( - 'test_feature_for_experiment', + 'test_feature_for_experiment', 'user1', { test_attribute: 'test_value' } ); @@ -3192,7 +3191,7 @@ describe('lib/optimizely', function() { attributes: { test_attribute: 'test_value' }, decisionInfo: { featureKey: 'test_feature_for_experiment', - featureEnabled: true, + featureEnabled: true, variableValues: { is_button_animated: true, button_width: 20.25, @@ -3209,9 +3208,9 @@ describe('lib/optimizely', function() { variationKey: 'variation', }, }, - }); + }); }); - }); + }); describe('when the variation is toggled OFF', function() { beforeEach(function() { @@ -3370,7 +3369,7 @@ describe('lib/optimizely', function() { it('returns the right value from getAllFeatureVariables and send notification with featureEnabled false', function() { var result = optlyInstance.getAllFeatureVariables( - 'test_feature_for_experiment', + 'test_feature_for_experiment', 'user1', { test_attribute: 'test_value' } ); @@ -3390,7 +3389,7 @@ describe('lib/optimizely', function() { attributes: { test_attribute: 'test_value' }, decisionInfo: { featureKey: 'test_feature_for_experiment', - featureEnabled: false, + featureEnabled: false, variableValues: { is_button_animated: false, button_width: 50.55, @@ -3407,7 +3406,7 @@ describe('lib/optimizely', function() { variationKey: 'variation2', }, }, - }); + }); }); }); }); @@ -3671,7 +3670,7 @@ describe('lib/optimizely', function() { attributes: { test_attribute: 'test_value' }, decisionInfo: { featureKey: 'test_feature', - featureEnabled: true, + featureEnabled: true, variableValues: { new_content: true, price: 4.99, @@ -3681,7 +3680,7 @@ describe('lib/optimizely', function() { count: 2, message: 'Hello audience', }, - }, + }, source: DECISION_SOURCES.ROLLOUT, sourceInfo: {}, }, @@ -4234,7 +4233,7 @@ describe('lib/optimizely', function() { attributes: { test_attribute: 'test_value' }, decisionInfo: { featureKey: 'test_feature_for_experiment', - featureEnabled: false, + featureEnabled: false, variableValues: { is_button_animated: false, button_width: 50.55, @@ -4244,7 +4243,7 @@ describe('lib/optimizely', function() { num_buttons: 0, text: 'default value', } - }, + }, source: DECISION_SOURCES.ROLLOUT, sourceInfo: {}, }, @@ -4318,7 +4317,6 @@ describe('lib/optimizely', function() { logToConsole: false, }); var optlyInstance; - var clock; beforeEach(function() { optlyInstance = new Optimizely({ @@ -4333,17 +4331,14 @@ describe('lib/optimizely', function() { eventBatchSize: 1, }); - sandbox.stub(eventDispatcher, 'dispatchEvent'); sandbox.stub(errorHandler, 'handleError'); sandbox.stub(createdLogger, 'log'); sandbox.stub(fns, 'uuid').returns('a68cf1ad-0393-4e18-af87-efe8f01a7c9c'); sandbox.stub(fns, 'currentTimestamp').returns(1509489766569); - clock = sinon.useFakeTimers(new Date().getTime()); }); afterEach(function() { sandbox.restore(); - clock.restore(); }); describe('#isFeatureEnabled', function() { @@ -5864,7 +5859,7 @@ describe('lib/optimizely', function() { createdLogger.log, LOG_LEVEL.INFO, 'OPTIMIZELY: Variable "message_info" is not used in variation "594032". Returning default value.' - ); + ); }); }); }); @@ -6115,7 +6110,7 @@ describe('lib/optimizely', function() { }); assert.deepEqual(result, { num_buttons: 0, - text: 'default value', + text: 'default value', }); sinon.assert.calledWith( createdLogger.log, @@ -6229,7 +6224,7 @@ describe('lib/optimizely', function() { LOG_LEVEL.INFO, 'OPTIMIZELY: User "user1" is not in any variation or rollout rule. Returning default value for variable "button_info" of feature flag "test_feature_for_experiment".' ); - }); + }); }); it('returns null from getFeatureVariable if user id is null when variable type is boolean', function() { @@ -7010,7 +7005,6 @@ describe('lib/optimizely', function() { eventBatchSize: 1, }); - sandbox.stub(eventDispatcher, 'dispatchEvent'); sandbox.stub(errorHandler, 'handleError'); sandbox.stub(createdLogger, 'log'); }); @@ -7144,7 +7138,6 @@ describe('lib/optimizely', function() { }); audienceEvaluator = AudienceEvaluator.prototype; - sandbox.stub(eventDispatcher, 'dispatchEvent'); sandbox.stub(errorHandler, 'handleError'); sandbox.stub(createdLogger, 'log'); sandbox.spy(audienceEvaluator, 'evaluate'); @@ -7298,7 +7291,6 @@ describe('lib/optimizely', function() { describe('event batching', function() { var bucketStub; - var clock; var createdLogger = logger.createLogger({ logLevel: LOG_LEVEL.INFO, @@ -7307,20 +7299,16 @@ describe('lib/optimizely', function() { beforeEach(function() { bucketStub = sinon.stub(bucketer, 'bucket'); - sinon.stub(eventDispatcher, 'dispatchEvent'); sinon.stub(errorHandler, 'handleError'); sinon.stub(createdLogger, 'log'); sinon.stub(fns, 'uuid').returns('a68cf1ad-0393-4e18-af87-efe8f01a7c9c'); - clock = sinon.useFakeTimers(new Date().getTime()); }); afterEach(function() { bucketer.bucket.restore(); - eventDispatcher.dispatchEvent.restore(); errorHandler.handleError.restore(); createdLogger.log.restore(); - clock.restore(); fns.uuid.restore(); }); @@ -7665,14 +7653,12 @@ describe('lib/optimizely', function() { }); beforeEach(function() { - sinon.stub(eventDispatcher, 'dispatchEvent'); sinon.stub(errorHandler, 'handleError'); sinon.stub(createdLogger, 'log'); sinon.spy(eventProcessor, 'LogTierV1EventProcessor'); }); afterEach(function() { - eventDispatcher.dispatchEvent.restore(); errorHandler.handleError.restore(); createdLogger.log.restore(); eventProcessor.LogTierV1EventProcessor.restore(); @@ -7709,13 +7695,11 @@ describe('lib/optimizely', function() { }); beforeEach(function() { - sinon.stub(eventDispatcher, 'dispatchEvent'); sinon.stub(errorHandler, 'handleError'); sinon.stub(createdLogger, 'log'); }); afterEach(function() { - eventDispatcher.dispatchEvent.restore(); errorHandler.handleError.restore(); createdLogger.log.restore(); }); @@ -7774,11 +7758,9 @@ describe('lib/optimizely', function() { }); describe('onReady method', function() { - var clock; var setTimeoutSpy; var clearTimeoutSpy; beforeEach(function() { - clock = sinon.useFakeTimers(new Date().getTime()); setTimeoutSpy = sinon.spy(clock, 'setTimeout'); clearTimeoutSpy = sinon.spy(clock, 'clearTimeout'); }); @@ -7786,7 +7768,6 @@ describe('lib/optimizely', function() { afterEach(function() { setTimeoutSpy.restore(); clearTimeoutSpy.restore(); - clock.restore(); }); it('fulfills the promise with the value from the project config manager ready promise after the project config manager ready promise is fulfilled', function() { @@ -7943,6 +7924,7 @@ describe('lib/optimizely', function() { logger: createdLogger, sdkKey: '12345', isValidInstance: true, + eventBatchSize: 1, }); }); diff --git a/packages/optimizely-sdk/lib/plugins/event_dispatcher/index.node.tests.js b/packages/optimizely-sdk/lib/plugins/event_dispatcher/index.node.tests.js index f17fc9705..2afeccc7b 100644 --- a/packages/optimizely-sdk/lib/plugins/event_dispatcher/index.node.tests.js +++ b/packages/optimizely-sdk/lib/plugins/event_dispatcher/index.node.tests.js @@ -87,18 +87,26 @@ describe('lib/plugins/event_dispatcher/node', function() { dispatchEvent(eventObj, callback); sinon.assert.notCalled(callback); }); - }); - it('does not throw in the event of an error', function() { - var eventObj = { - url: 'https://example', - params: {}, - httpVerb: 'POST', - }; + describe('in the event of an error', function() { + beforeEach(function() { + nock('https://example') + .post('/event') + .replyWithError('Connection error') + }); - var callback = sinon.spy(); - dispatchEvent(eventObj, callback); - sinon.assert.notCalled(callback); + it('does not throw', function() { + var eventObj = { + url: 'https://example/event', + params: {}, + httpVerb: 'POST', + }; + + var callback = sinon.spy(); + dispatchEvent(eventObj, callback); + sinon.assert.notCalled(callback); + }); + }); }); }); }); diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index 578894105..49d62c92d 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -10,7 +10,7 @@ "scripts": { "clean": "rm -rf dist", "lint": "eslint 'lib/**/*.js'", - "test": "mocha --exit -r esm -r lib/tests/exit_on_unhandled_rejection.js 'lib/**/*.tests.js'", + "test": "mocha -r esm -r lib/tests/exit_on_unhandled_rejection.js 'lib/**/*.tests.js'", "posttest": "npm run lint", "test-ci": "npm run test-xbrowser && npm run test-umdbrowser", "test-xbrowser": "karma start karma.bs.conf.js --single-run",