/** * @depends testResolveQueryStringFromUrlAndCreateOrUpdateActivityThrowsExceptionWhenNoIdInQueryString */ public function testResolveQueryStringFromUrlAndCreateOrUpdateActivityForEmailOpenTrackingWithoutExceptions() { // setup pre-req data $contact = ContactTestHelper::createContactByNameForOwner('contact 01', $this->user); $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 01', 'description 01', 'fromName 01', '*****@*****.**'); $campaign = CampaignTestHelper::createCampaign('campaign 01', 'subject 01', 'text Content 01', 'html Content 01', 'fromName 01', '*****@*****.**', null, null, null, null, $marketingList); $processed = 0; $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact); $modelId = $campaignItem->id; $modelType = get_class($campaignItem); $personId = $contact->getClassId('Person'); $this->assertNotNull($personId); // get the modelClassName to use for activity object tests $className = 'CampaignItemActivityUtil'; $resolveModelClassNameByModelTypeFunction = static::getProtectedMethod($className, 'resolveModelClassNameByModelType'); $modelClassName = $resolveModelClassNameByModelTypeFunction->invokeArgs(null, array($modelType)); $type = $modelClassName::TYPE_OPEN; $existingActivities = $modelClassName::getByType($type); $this->assertCount(0, $existingActivities); // get base query string $resolveBaseQueryStringArrayFunction = static::getProtectedMethod('ContentTrackingUtil', 'resolveBaseQueryStringArray'); $queryStringArray = $resolveBaseQueryStringArrayFunction->invokeArgs(null, array($modelId, $modelType, $personId)); $this->assertNotEmpty($queryStringArray); $this->assertCount(3, $queryStringArray); $this->assertArrayHasKey('modelId', $queryStringArray); $this->assertArrayHasKey('modelType', $queryStringArray); $this->assertArrayHasKey('personId', $queryStringArray); // get hash for query string and ensure its what we expect it to be. $queryStringArrayHash = StringUtil::resolveHashForQueryStringArray($queryStringArray); $queryStringArrayDecoded = $className::resolveQueryStringArrayForHash($queryStringArrayHash); $this->assertNotEmpty($queryStringArrayDecoded); $this->assertCount(5, $queryStringArrayDecoded); $this->assertArrayHasKey('modelId', $queryStringArrayDecoded); $this->assertArrayHasKey('modelType', $queryStringArrayDecoded); $this->assertArrayHasKey('personId', $queryStringArrayDecoded); $this->assertArrayHasKey('url', $queryStringArrayDecoded); $this->assertArrayHasKey('type', $queryStringArrayDecoded); $this->assertEquals($queryStringArray['modelId'], $queryStringArrayDecoded['modelId']); $this->assertEquals($queryStringArray['modelType'], $queryStringArrayDecoded['modelType']); $this->assertEquals($queryStringArray['personId'], $queryStringArrayDecoded['personId']); $this->assertNull($queryStringArrayDecoded['url']); $this->assertNull($queryStringArrayDecoded['type']); // do the magic, confirm magic worked by checking return value. $_GET['id'] = $queryStringArrayHash; $result = $className::resolveQueryStringFromUrlAndCreateOrUpdateActivity(); $this->assertNotEmpty($result); $this->assertCount(2, $result); $this->assertArrayHasKey('redirect', $result); $this->assertArrayHasKey('imagePath', $result); $this->assertEquals(false, $result['redirect']); $this->assertEquals(PlaceholderImageUtil::resolveOneByOnePixelImagePath(), $result['imagePath']); // check activity object count to confirm we got a new activity $existingActivities = $modelClassName::getByType($type); $this->assertCount(1, $existingActivities); // try fetching an object matching criteria of the one we just inserted. $activity = $modelClassName::getByTypeAndModelIdAndPersonIdAndUrl($type, $modelId, $personId); $this->assertNotEmpty($activity); $this->assertCount(1, $activity); $this->assertEquals(1, $activity[0]->quantity); // do the magic again, this time it should update quantity $result = $className::resolveQueryStringFromUrlAndCreateOrUpdateActivity(); $this->assertNotEmpty($result); $this->assertCount(2, $result); $this->assertArrayHasKey('redirect', $result); $this->assertArrayHasKey('imagePath', $result); $this->assertEquals(false, $result['redirect']); $this->assertEquals(PlaceholderImageUtil::resolveOneByOnePixelImagePath(), $result['imagePath']); // check activity object count to confirm we got a new activity $existingActivities = $modelClassName::getByType($type); $this->assertCount(1, $existingActivities); // try fetching an object matching criteria of the one we just inserted. $type = $modelClassName::TYPE_OPEN; $activity = $modelClassName::getByTypeAndModelIdAndPersonIdAndUrl($type, $modelId, $personId); $this->assertNotEmpty($activity); $this->assertCount(1, $activity); $this->assertEquals(2, $activity[0]->quantity); }
protected static function processActivityFromQueryStringArray($queryStringArray) { $activityUpdated = static::createOrUpdateActivity($queryStringArray); if (!$activityUpdated) { throw new FailedToSaveModelException(); } $trackingType = static::resolveTrackingTypeByQueryStringArray($queryStringArray); if ($trackingType === EmailMessageActivity::TYPE_CLICK) { // this shouldn't be here, its here to suppose no-scheme urls from previous versions' database $url = StringUtil::addSchemeIfMissing($queryStringArray['url']); return array('redirect' => true, 'url' => $url); } else { return array('redirect' => false, 'imagePath' => PlaceholderImageUtil::resolveOneByOnePixelImagePath()); } }