diff --git a/packages/optimizely-sdk/lib/core/event_builder/index.js b/packages/optimizely-sdk/lib/core/event_builder/index.js index 364e16491..6fd03d258 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/index.js +++ b/packages/optimizely-sdk/lib/core/event_builder/index.js @@ -115,47 +115,45 @@ function getImpressionEventParams(configObj, experimentId, variationId) { * @param {Object} logger Logger object * @return {Object} Conversion event params */ -function getConversionEventParams(configObj, eventKey, eventTags, experimentsToVariationMap, logger) { - - var conversionEventParams = []; +function getVisitorSnapshot(configObj, eventKey, eventTags, experimentsToVariationMap, logger) { + var snapshot = { + decisions: [], + events: [] + }; fns.forOwn(experimentsToVariationMap, function(variationId, experimentId) { - var decision = { - decisions: [{ - campaign_id: projectConfig.getLayerId(configObj, experimentId), - experiment_id: experimentId, - variation_id: variationId, - }], - events: [], + campaign_id: projectConfig.getLayerId(configObj, experimentId), + experiment_id: experimentId, + variation_id: variationId, }; - var eventDict = { - entity_id: projectConfig.getEventId(configObj, eventKey), - timestamp: fns.currentTimestamp(), - uuid: fns.uuid(), - key: eventKey, - }; + snapshot.decisions.push(decision); + }); - if (eventTags) { - var revenue = eventTagUtils.getRevenueValue(eventTags, logger); - if (revenue) { - eventDict[enums.RESERVED_EVENT_KEYWORDS.REVENUE] = revenue; - } + var eventDict = { + entity_id: projectConfig.getEventId(configObj, eventKey), + timestamp: fns.currentTimestamp(), + uuid: fns.uuid(), + key: eventKey, + }; - var eventValue = eventTagUtils.getEventValue(eventTags, logger); - if (eventValue) { - eventDict[enums.RESERVED_EVENT_KEYWORDS.VALUE] = eventValue; - } + if (eventTags) { + var revenue = eventTagUtils.getRevenueValue(eventTags, logger); + if (revenue) { + eventDict[enums.RESERVED_EVENT_KEYWORDS.REVENUE] = revenue; + } - eventDict['tags'] = eventTags; + var eventValue = eventTagUtils.getEventValue(eventTags, logger); + if (eventValue) { + eventDict[enums.RESERVED_EVENT_KEYWORDS.VALUE] = eventValue; } - decision.events = [eventDict]; - conversionEventParams.push(decision); - }); + eventDict['tags'] = eventTags; + } + snapshot.events.push(eventDict); - return conversionEventParams; + return snapshot; } module.exports = { @@ -210,13 +208,13 @@ module.exports = { var commonParams = getCommonEventParams(options); conversionEvent.url = ENDPOINT; - var conversionEventParams = getConversionEventParams(options.configObj, - options.eventKey, - options.eventTags, - options.experimentsToVariationMap, - options.logger); + var snapshot = getVisitorSnapshot(options.configObj, + options.eventKey, + options.eventTags, + options.experimentsToVariationMap, + options.logger); - commonParams.visitors[0].snapshots = conversionEventParams; + commonParams.visitors[0].snapshots = [snapshot]; conversionEvent.params = commonParams; return conversionEvent; diff --git a/packages/optimizely-sdk/lib/core/event_builder/index.tests.js b/packages/optimizely-sdk/lib/core/event_builder/index.tests.js index 5f4945b31..08ab9fa73 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/index.tests.js +++ b/packages/optimizely-sdk/lib/core/event_builder/index.tests.js @@ -782,6 +782,59 @@ describe('lib/core/event_builder', function() { assert.deepEqual(actualParams, expectedParams); }); + it('should create the correct snapshot for multiple experiments attached to the event', function() { + var expectedParams = { + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: { + 'account_id': '12001', + 'project_id': '111001', + 'visitors': [{ + 'visitor_id': 'testUser', + 'attributes': [], + 'snapshots': [{ + 'decisions': [{ + 'variation_id': '111128', + 'experiment_id': '111127', + 'campaign_id': '4' + }, { + 'variation_id': '122228', + 'experiment_id': '122227', + 'campaign_id': '5' + }], + 'events': [{ + 'timestamp': Math.round(new Date().getTime()), + 'entity_id': '111100', + 'uuid': 'a68cf1ad-0393-4e18-af87-efe8f01a7c9c', + 'key': 'testEventWithMultipleExperiments' + }] + }] + }], + 'revision': '42', + 'client_name': 'node-sdk', + 'client_version': packageJSON.version, + 'anonymize_ip': false, + } + }; + + var eventOptions = { + clientEngine: 'node-sdk', + clientVersion: packageJSON.version, + configObj: configObj, + eventKey: 'testEventWithMultipleExperiments', + logger: mockLogger, + userId: 'testUser', + experimentsToVariationMap: { + '111127': '111128', + '122227': '122228' + }, + }; + + var actualParams = eventBuilder.getConversionEvent(eventOptions); + + assert.deepEqual(actualParams, expectedParams); + }); + describe('and event tags are passed it', function() { it('should create proper params for getConversionEvent with event tags', function() { var expectedParams = { diff --git a/packages/optimizely-sdk/lib/optimizely/index.tests.js b/packages/optimizely-sdk/lib/optimizely/index.tests.js index bf8b88588..02ca86e60 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely/index.tests.js @@ -1272,16 +1272,7 @@ describe('lib/optimizely', function() { 'campaign_id': '4', 'experiment_id': '111127', 'variation_id': '111129' - }], - 'events': [{ - 'entity_id': '111100', - 'timestamp': Math.round(new Date().getTime()), - 'uuid': 'a68cf1ad-0393-4e18-af87-efe8f01a7c9c', - 'key': 'testEventWithMultipleExperiments', - }] - }, - { - 'decisions': [{ + }, { 'campaign_id': '5', 'experiment_id': '122227', 'variation_id': '122229'