From 86ca673cfb78ee865278be11ec96c0401b9f0a7b Mon Sep 17 00:00:00 2001 From: Sohail Hussain Date: Thu, 23 Aug 2018 11:24:59 -0700 Subject: [PATCH] fix(track): Send decisions for all experiments using an event when using track --- src/Optimizely/Event/Builder/EventBuilder.php | 59 +++++++++-------- tests/EventTests/EventBuilderTest.php | 66 +++++++++++++++++++ tests/ProjectConfigTest.php | 3 +- tests/TestData.php | 8 +++ 4 files changed, 108 insertions(+), 28 deletions(-) diff --git a/src/Optimizely/Event/Builder/EventBuilder.php b/src/Optimizely/Event/Builder/EventBuilder.php index 8ed82999..1eaceff7 100644 --- a/src/Optimizely/Event/Builder/EventBuilder.php +++ b/src/Optimizely/Event/Builder/EventBuilder.php @@ -180,45 +180,50 @@ private function getImpressionParams(Experiment $experiment, $variationId) private function getConversionParams($config, $eventKey, $experimentVariationMap, $eventTags) { $conversionParams = []; + $singleSnapshot = []; + $decisions = []; + foreach ($experimentVariationMap as $experimentId => $variationId) { - $singleSnapshot = []; + + $experiment = $config->getExperimentFromId($experimentId); $eventEntity = $config->getEvent($eventKey); - $singleSnapshot[DECISIONS] = [ - [ - CAMPAIGN_ID => $experiment->getLayerId(), - EXPERIMENT_ID => $experiment->getId(), - VARIATION_ID => $variationId - ] - ]; - - $singleSnapshot[EVENTS] = [ - [ - ENTITY_ID => $eventEntity->getId(), - TIMESTAMP => time()*1000, - UUID => GeneratorUtils::getRandomUuid(), - KEY => $eventKey - ] + $decision = [ + CAMPAIGN_ID => $experiment->getLayerId(), + EXPERIMENT_ID => $experiment->getId(), + VARIATION_ID => $variationId ]; + $decisions [] = $decision; + } - if (!is_null($eventTags)) { - $revenue = EventTagUtils::getRevenueValue($eventTags, $this->_logger); - if (!is_null($revenue)) { - $singleSnapshot[EVENTS][0][EventTagUtils::REVENUE_EVENT_METRIC_NAME] = $revenue; - } + $eventDict = [ + ENTITY_ID => $eventEntity->getId(), + TIMESTAMP => time()*1000, + UUID => GeneratorUtils::getRandomUuid(), + KEY => $eventKey + ]; - $eventValue = EventTagUtils::getNumericValue($eventTags, $this->_logger); - if (!is_null($eventValue)) { - $singleSnapshot[EVENTS][0][EventTagUtils::NUMERIC_EVENT_METRIC_NAME] = $eventValue; - } + if (!is_null($eventTags)) { + $revenue = EventTagUtils::getRevenueValue($eventTags, $this->_logger); + if (!is_null($revenue)) { + $eventDict[EventTagUtils::REVENUE_EVENT_METRIC_NAME] = $revenue; + } - $singleSnapshot[EVENTS][0]['tags'] = $eventTags; + $eventValue = EventTagUtils::getNumericValue($eventTags, $this->_logger); + if (!is_null($eventValue)) { + $eventDict[EventTagUtils::NUMERIC_EVENT_METRIC_NAME] = $eventValue; } - $conversionParams [] = $singleSnapshot; + if(count($eventTags) > 0) { + $eventDict['tags'] = $eventTags; + } } + $singleSnapshot[DECISIONS] = $decisions; + $singleSnapshot[EVENTS] [] = $eventDict; + $conversionParams [] = $singleSnapshot; + return $conversionParams; } diff --git a/tests/EventTests/EventBuilderTest.php b/tests/EventTests/EventBuilderTest.php index 5f4ae8fc..367b1420 100644 --- a/tests/EventTests/EventBuilderTest.php +++ b/tests/EventTests/EventBuilderTest.php @@ -823,4 +823,70 @@ public function testCreateConversionEventWithUserAgentAttribute() $result = $this->areLogEventsEqual($expectedLogEvent, $logEvent); $this->assertTrue($result[0], $result[1]); } + + public function testCreateConversionEventWhenEventUsedInMultipleExp() + { + $eventTags = [ + 'revenue' => 4200, + 'value' => 1.234, + 'non-revenue' => 'abc' + ]; + $this->expectedEventParams['visitors'][0]['snapshots'][0]['decisions'][] = [ + 'campaign_id' => '4', + 'experiment_id' => '122230', + 'variation_id' => '122234' + ]; + + $this->expectedEventParams['visitors'][0]['snapshots'][0]['events'][0] = [ + 'entity_id' => '7718020065', + 'timestamp' => $this->timestamp, + 'uuid' => $this->uuid, + 'key' => 'multi_exp_event', + 'revenue' => 4200, + 'value' => 1.234, + 'tags' => $eventTags, + ]; + + array_unshift($this->expectedEventParams['visitors'][0]['attributes'], + [ + 'entity_id' => '7723280020', + 'key' => 'device_type', + 'type' => 'custom', + 'value' => 'iPhone' + ],[ + 'entity_id' => '7723340004', + 'key' => 'location', + 'type' => 'custom', + 'value' => 'SF' + ]); + + $decisions = [ + '7716830082' => '7721010009', + '122230' => '122234' + ]; + $userAttributes = [ + 'device_type' => 'iPhone', + 'location' => 'SF' + ]; + + $logEvent = $this->eventBuilder->createConversionEvent( + $this->config, + 'multi_exp_event', + $decisions, + $this->testUserId, + $userAttributes, + $eventTags + ); + $expectedLogEvent = new LogEvent( + $this->expectedEventUrl, + $this->expectedEventParams, + $this->expectedEventHttpVerb, + $this->expectedEventHeaders + ); + + $logEvent = $this->fakeParamsToReconcile($logEvent); + $result = $this->areLogEventsEqual($expectedLogEvent, $logEvent); + $this->assertTrue($result[0], $result[1]); + + } } diff --git a/tests/ProjectConfigTest.php b/tests/ProjectConfigTest.php index b2f4cd89..5c233ff9 100644 --- a/tests/ProjectConfigTest.php +++ b/tests/ProjectConfigTest.php @@ -140,7 +140,8 @@ public function testInit() $this->assertEquals( [ 'purchase' => $this->config->getEvent('purchase'), - 'unlinked_event' => $this->config->getEvent('unlinked_event') + 'unlinked_event' => $this->config->getEvent('unlinked_event'), + 'multi_exp_event' => $this->config->getEvent('multi_exp_event') ], $eventKeyMap->getValue($this->config) ); diff --git a/tests/TestData.php b/tests/TestData.php index e25fe695..b2ac4bfa 100644 --- a/tests/TestData.php +++ b/tests/TestData.php @@ -486,6 +486,14 @@ "experimentIds": [], "id": "7718020064", "key": "unlinked_event" + }, + { + "experimentIds":[ + "7716830082", + "122230" + ], + "id": "7718020065", + "key": "multi_exp_event" } ], "anonymizeIP": false,