/** * @depends testResolveQueryStringFromUrlAndCreateOrUpdateActivityThrowsExceptionForInvalidPersonIdForUrlClickTracking * @expectedException NotSupportedException */ public function testResolveQueryStringFromUrlAndCreateOrUpdateActivityThrowsExceptionForDuplicateActivityForUrlClickTracking() { // setup pre-req data $campaignItemActivities = CampaignItemActivity::getByType(CampaignItemActivity::TYPE_CLICK); $this->assertNotEmpty($campaignItemActivities); $campaignActivity = new CampaignItemActivity(); $campaignActivity->quantity = $campaignItemActivities[0]->quantity; $campaignActivity->type = $campaignItemActivities[0]->type; $campaignActivity->campaignItem = $campaignItemActivities[0]->campaignItem; $campaignActivity->person = $campaignItemActivities[0]->person; $campaignActivity->emailMessageUrl = $campaignItemActivities[0]->emailMessageUrl; $this->assertTrue($campaignActivity->save()); $modelId = $campaignItemActivities[0]->campaignItem->id; $modelType = get_class($campaignItemActivities[0]->campaignItem); $personId = $campaignItemActivities[0]->person->id; // 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_CLICK; $existingActivities = $modelClassName::getByType($type); $this->assertCount(2, $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); $queryStringArray['url'] = 'http://www.zurmo.com'; // 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->assertEquals($queryStringArray['url'], $queryStringArrayDecoded['url']); $this->assertNull($queryStringArrayDecoded['type']); // do the magic, confirm magic worked by checking return value. $_GET['id'] = $queryStringArrayHash; $result = $className::resolveQueryStringFromUrlAndCreateOrUpdateActivity(); }
/** * @depends testCreateAndGetCampaignItemById */ public function testDeleteCampaignItem() { $campaignItems = CampaignItem::getAll(); $this->assertNotEmpty($campaignItems); $this->assertCount(10, $campaignItems); $campaignItemActivity = new CampaignItemActivity(); $campaignItemActivity->type = CampaignItemActivity::TYPE_CLICK; $campaignItemActivity->quantity = 1; $campaignItemActivity->campaignItem = $campaignItems[0]; $campaignItemActivity->latestSourceIP = '121.212.122.112'; $this->assertTrue($campaignItemActivity->save()); $campaignItems[0]->emailMessage = $this->resolveEmailMessage(); $this->assertTrue($campaignItems[0]->unrestrictedSave()); $this->assertEquals(1, EmailMessage::getCount()); $this->assertEquals(1, EmailMessageContent::getCount()); $this->assertEquals(1, EmailMessageSender::getCount()); $this->assertEquals(1, EmailMessageRecipient::getCount()); $campaignItemActivities = CampaignItemActivity::getAll(); $this->assertCount(1, $campaignItemActivities); $campaignItems[0]->delete(); $campaignItems = CampaignItem::getAll(); $this->assertNotEmpty($campaignItems); $this->assertCount(9, $campaignItems); $campaignItemActivities = CampaignItemActivity::getAll(); $this->assertCount(0, $campaignItemActivities); $this->assertEquals(0, EmailMessage::getCount()); $this->assertEquals(0, EmailMessageContent::getCount()); $this->assertEquals(0, EmailMessageSender::getCount()); $this->assertEquals(0, EmailMessageRecipient::getCount()); }
/** * @depends testCreateAndGetCampaignItemActivityById */ public function testRequiredAttributes() { $campaignItemActivity = new CampaignItemActivity(); $this->assertFalse($campaignItemActivity->save()); $errors = $campaignItemActivity->getErrors(); $this->assertNotEmpty($errors); $this->assertCount(2, $errors); $this->assertArrayHasKey('type', $errors); $this->assertEquals('Type cannot be blank.', $errors['type'][0]); $this->assertArrayHasKey('quantity', $errors); $this->assertEquals('Quantity cannot be blank.', $errors['quantity'][0]); $campaignItemActivity->type = CampaignItemActivity::TYPE_CLICK; $campaignItemActivity->quantity = 5; $emailMessageUrl = new EmailMessageUrl(); $emailMessageUrl->url = 'http://www.example.com'; $campaignItemActivity->emailMessageUrl = $emailMessageUrl; $campaignItemActivity->latestSourceIP = '131.113.112.121'; $this->assertTrue($campaignItemActivity->save()); $id = $campaignItemActivity->id; unset($campaignItemActivity); $campaignItemActivity = CampaignItemActivity::getById($id); $this->assertEquals(CampaignItemActivity::TYPE_CLICK, $campaignItemActivity->type); $this->assertEquals(5, $campaignItemActivity->quantity); $this->assertEquals('http://www.example.com', $campaignItemActivity->emailMessageUrl->url); $this->assertEquals('131.113.112.121', $campaignItemActivity->latestSourceIP); }
/** * @depends testRequiredAttributes */ public function testDeleteCampaign() { $campaigns = Campaign::getAll(); $this->assertEquals(4, count($campaigns)); CampaignItemTestHelper::createCampaignItem(0, $campaigns[0]); $campaignItems = CampaignItem::getAll(); $this->assertCount(1, $campaignItems); $campaignItemActivity = new CampaignItemActivity(); $campaignItemActivity->type = CampaignItemActivity::TYPE_CLICK; $campaignItemActivity->quantity = 1; $campaignItemActivity->campaignItem = $campaignItems[0]; $campaignItemActivity->latestSourceIP = '121.212.122.112'; $this->assertTrue($campaignItemActivity->save()); $emailMessage = EmailMessageTestHelper::createOutboxEmail(Yii::app()->user->userModel, 'subject', 'html', 'text', 'from', '*****@*****.**', 'to', '*****@*****.**'); $campaignItems[0]->emailMessage = $emailMessage; $this->assertTrue($campaignItems[0]->unrestrictedSave()); $this->assertEquals(1, CampaignItemActivity::getCount()); $this->assertEquals(1, EmailMessage::getCount()); $campaigns[0]->delete(); $this->assertEquals(3, Campaign::getCount()); $this->assertEquals(0, CampaignItem::getCount()); $this->assertEquals(0, CampaignItemActivity::getCount()); $this->assertEquals(1, EmailMessage::getCount()); }
/** * Special method to load a campaign with all types of campaignItemActivity */ public function actionLoadCampaignWithAllItemActivityTypes() { if (!Group::isUserASuperAdministrator(Yii::app()->user->userModel)) { throw new NotSupportedException(); } $emailBox = EmailBoxUtil::getDefaultEmailBoxByUser(Yii::app()->user->userModel); $marketingList = new MarketingList(); $marketingList->name = 'Demo Marketing List'; $marketingList->save(); $campaign = new Campaign(); $campaign->marketingList = $marketingList; $campaign->name = 'Campaign with all campaignItemActivity'; $campaign->subject = 'Demo for all types of campaignItemActivities'; $campaign->status = Campaign::STATUS_COMPLETED; $campaign->sendOnDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time()); $campaign->supportsRichText = true; $campaign->htmlContent = 'Demo content'; $campaign->fromName = 'Zurmo'; $campaign->fromAddress = '*****@*****.**'; $campaign->enableTracking = true; $saved = $campaign->save(); if (!$saved) { throw new FailedToSaveModelException(); } $contacts = Contact::getAll(); //Awaiting queue $contact = $contacts[0]; $campaignItem = new CampaignItem(); $campaignItem->processed = true; $campaignItem->campaign = $campaign; $campaignItem->contact = $contact; $campaignItem->unrestrictedSave(); //Contact is not subscribed $contact = $contacts[1]; $marketingList->addNewMember($contact->id, true); $campaignItem = new CampaignItem(); $campaignItem->processed = true; $campaignItem->campaign = $campaign; $campaignItem->contact = $contact; $activity = new CampaignItemActivity(); $activity->person = $contact; $activity->campaignItem = $campaignItem; $activity->quantity = 1; $activity->type = CampaignItemActivity::TYPE_SKIP; $activity->save(); $campaignItem->unrestrictedSave(); //Skipped, both primary and secondary are opted out $contact = $contacts[2]; $contact->primaryEmail->emailAddress = $contact->firstName . '*****@*****.**'; $contact->primaryEmail->optOut = true; $contact->secondaryEmail->emailAddress = $contact->firstName . '*****@*****.**'; $contact->secondaryEmail->optOut = true; $contact->save(); $marketingList->addNewMember($contact->id); $campaignItem = new CampaignItem(); $campaignItem->processed = true; $campaignItem->campaign = $campaign; $campaignItem->contact = $contact; $activity = new CampaignItemActivity(); $activity->person = $contact; $activity->campaignItem = $campaignItem; $activity->quantity = 1; $activity->type = CampaignItemActivity::TYPE_SKIP; $activity->save(); $campaignItem->unrestrictedSave(); //Skipped, primary is opted out but secondary is not $contact = $contacts[3]; $contact->primaryEmail->emailAddress = $contact->firstName . '*****@*****.**'; $contact->primaryEmail->optOut = true; $contact->secondaryEmail->emailAddress = $contact->firstName . '*****@*****.**'; $contact->secondaryEmail->optOut = false; $contact->save(); $marketingList->addNewMember($contact->id); $campaignItem = new CampaignItem(); $campaignItem->processed = true; $campaignItem->campaign = $campaign; $campaignItem->contact = $contact; $activity = new CampaignItemActivity(); $activity->person = $contact; $activity->campaignItem = $campaignItem; $activity->quantity = 1; $activity->type = CampaignItemActivity::TYPE_SKIP; $activity->save(); $campaignItem->unrestrictedSave(); //Skipped, primary and secondary not set $contact = $contacts[4]; $contact->primaryEmail = null; $contact->secondaryEmail = null; $contact->save(); $marketingList->addNewMember($contact->id); $campaignItem = new CampaignItem(); $campaignItem->processed = true; $campaignItem->campaign = $campaign; $campaignItem->contact = $contact; $activity = new CampaignItemActivity(); $activity->person = $contact; $activity->campaignItem = $campaignItem; $activity->quantity = 1; $activity->type = CampaignItemActivity::TYPE_SKIP; $activity->save(); $campaignItem->unrestrictedSave(); //Skipped, primary not set but secondary is set $contact = $contacts[5]; $contact->primaryEmail = null; $contact->secondaryEmail->emailAddress = $contact->firstName . '@zurmo.org'; $contact->secondaryEmail->optOut = false; $contact->save(); $marketingList->addNewMember($contact->id); $campaignItem = new CampaignItem(); $campaignItem->processed = true; $campaignItem->campaign = $campaign; $campaignItem->contact = $contact; $activity = new CampaignItemActivity(); $activity->person = $contact; $activity->campaignItem = $campaignItem; $activity->quantity = 1; $activity->type = CampaignItemActivity::TYPE_SKIP; $activity->save(); $campaignItem->unrestrictedSave(); //Queued $contact = $contacts[6]; $campaignItem = new CampaignItem(); $campaignItem->processed = true; $campaignItem->campaign = $campaign; $campaignItem->contact = $contact; $activity = new CampaignItemActivity(); $activity->person = $contact; $activity->campaignItem = $campaignItem; $activity->quantity = 1; $activity->save(); $emailMessage = new EmailMessage(); $emailMessage->setScenario('importModel'); $emailMessage->owner = $contact->owner; $emailMessage->subject = 'Subject'; $emailContent = new EmailMessageContent(); $emailContent->textContent = 'My First Message'; $emailContent->htmlContent = 'Some fake HTML content'; $emailMessage->content = $emailContent; //Sending is current user (super) $sender = new EmailMessageSender(); $sender->fromAddress = '*****@*****.**'; $sender->fromName = 'Zurmo'; $sender->personsOrAccounts->add(Yii::app()->user->userModel); $emailMessage->sender = $sender; //Recipient is BobMessage $recipient = new EmailMessageRecipient(); $recipient->toAddress = '*****@*****.**'; $recipient->toName = strval($contact); $recipient->personsOrAccounts->add($contact); $recipient->type = EmailMessageRecipient::TYPE_TO; $emailMessage->recipients->add($recipient); $emailMessage->folder = EmailFolder::getByBoxAndType($emailBox, EmailFolder::TYPE_OUTBOX); $emailMessage->createdDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time()); $emailMessage->save(); if (!$saved) { throw new FailedToSaveModelException(); } $campaignItem->emailMessage = $emailMessage; $campaignItem->unrestrictedSave(); //Queued with error $contact = $contacts[7]; $campaignItem = new CampaignItem(); $campaignItem->processed = true; $campaignItem->campaign = $campaign; $campaignItem->contact = $contact; $activity = new CampaignItemActivity(); $activity->person = $contact; $activity->campaignItem = $campaignItem; $activity->quantity = 1; $activity->save(); $emailMessage = new EmailMessage(); $emailMessage->setScenario('importModel'); $emailMessage->owner = $contact->owner; $emailMessage->subject = 'Subject'; $emailContent = new EmailMessageContent(); $emailContent->textContent = 'My First Message'; $emailContent->htmlContent = 'Some fake HTML content'; $emailMessage->content = $emailContent; //Sending is current user (super) $sender = new EmailMessageSender(); $sender->fromAddress = '*****@*****.**'; $sender->fromName = 'Zurmo'; $sender->personsOrAccounts->add(Yii::app()->user->userModel); $emailMessage->sender = $sender; //Recipient is BobMessage $recipient = new EmailMessageRecipient(); $recipient->toAddress = '*****@*****.**'; $recipient->toName = strval($contact); $recipient->personsOrAccounts->add($contact); $recipient->type = EmailMessageRecipient::TYPE_TO; $emailMessage->recipients->add($recipient); $emailMessage->folder = EmailFolder::getByBoxAndType($emailBox, EmailFolder::TYPE_OUTBOX_ERROR); $emailMessage->createdDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time()); $emailMessage->sendAttempts = 2; $emailMessageError = new EmailMessageSendError(); $emailMessageError->serializedData = serialize(array('code' => '0001', 'message' => 'Error Message')); $emailMessage->error = $emailMessageError; $emailMessage->createdDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time()); $emailMessage->save(); if (!$saved) { throw new FailedToSaveModelException(); } $campaignItem->emailMessage = $emailMessage; $campaignItem->unrestrictedSave(); //Failure $contact = $contacts[8]; $campaignItem = new CampaignItem(); $campaignItem->processed = true; $campaignItem->campaign = $campaign; $campaignItem->contact = $contact; $activity = new CampaignItemActivity(); $activity->person = $contact; $activity->campaignItem = $campaignItem; $activity->quantity = 1; $activity->save(); $emailMessage = new EmailMessage(); $emailMessage->setScenario('importModel'); $emailMessage->owner = $contact->owner; $emailMessage->subject = 'Subject'; $emailContent = new EmailMessageContent(); $emailContent->textContent = 'My First Message'; $emailContent->htmlContent = 'Some fake HTML content'; $emailMessage->content = $emailContent; //Sending is current user (super) $sender = new EmailMessageSender(); $sender->fromAddress = '*****@*****.**'; $sender->fromName = 'Zurmo'; $sender->personsOrAccounts->add(Yii::app()->user->userModel); $emailMessage->sender = $sender; //Recipient is BobMessage $recipient = new EmailMessageRecipient(); $recipient->toAddress = '*****@*****.**'; $recipient->toName = strval($contact); $recipient->personsOrAccounts->add($contact); $recipient->type = EmailMessageRecipient::TYPE_TO; $emailMessage->recipients->add($recipient); $emailMessage->folder = EmailFolder::getByBoxAndType($emailBox, EmailFolder::TYPE_OUTBOX_FAILURE); $emailMessage->createdDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time()); $emailMessage->sendAttempts = 3; $emailMessageError = new EmailMessageSendError(); $emailMessageError->serializedData = serialize(array('code' => '0001', 'message' => 'Error Message')); $emailMessage->error = $emailMessageError; $emailMessage->createdDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time()); $emailMessage->save(); if (!$saved) { throw new FailedToSaveModelException(); } $campaignItem->emailMessage = $emailMessage; $campaignItem->unrestrictedSave(); //Sent, open, click, bounce $contact = $contacts[9]; $campaignItem = new CampaignItem(); $campaignItem->processed = true; $campaignItem->campaign = $campaign; $campaignItem->contact = $contact; $activity = new CampaignItemActivity(); $activity->person = $contact; $activity->campaignItem = $campaignItem; $activity->type = CampaignItemActivity::TYPE_CLICK; $activity->quantity = rand(1, 50); $activity->latestDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() + rand(100, 1000)); $activity->latestSourceIP = '10.11.12.13'; $activity->save(); $activity = new CampaignItemActivity(); $activity->person = $contact; $activity->campaignItem = $campaignItem; $activity->type = CampaignItemActivity::TYPE_OPEN; $activity->quantity = rand(1, 50); $activity->latestDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() + rand(100, 1000)); $activity->latestSourceIP = '10.11.12.13'; $activity->save(); $activity = new CampaignItemActivity(); $activity->person = $contact; $activity->campaignItem = $campaignItem; $activity->type = CampaignItemActivity::TYPE_BOUNCE; $activity->quantity = rand(1, 50); $activity->latestDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() + rand(100, 1000)); $activity->latestSourceIP = '10.11.12.13'; $activity->save(); $emailMessage = new EmailMessage(); $emailMessage->setScenario('importModel'); $emailMessage->owner = $contact->owner; $emailMessage->subject = 'Subject'; $emailContent = new EmailMessageContent(); $emailContent->textContent = 'My First Message'; $emailContent->htmlContent = 'Some fake HTML content'; $emailMessage->content = $emailContent; //Sending is current user (super) $sender = new EmailMessageSender(); $sender->fromAddress = '*****@*****.**'; $sender->fromName = 'Zurmo'; $sender->personsOrAccounts->add(Yii::app()->user->userModel); $emailMessage->sender = $sender; //Recipient is BobMessage $recipient = new EmailMessageRecipient(); $recipient->toAddress = '*****@*****.**'; $recipient->toName = strval($contact); $recipient->personsOrAccounts->add($contact); $recipient->type = EmailMessageRecipient::TYPE_TO; $emailMessage->recipients->add($recipient); $emailMessage->folder = EmailFolder::getByBoxAndType($emailBox, EmailFolder::TYPE_SENT); $emailMessage->sentDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time()); $emailMessage->save(); if (!$saved) { throw new FailedToSaveModelException(); } $emailMessage->save(); $campaignItem->emailMessage = $emailMessage; $campaignItem->unrestrictedSave(); }