public function getStringifiedModelForValue() { if ($this->value != null) { try { return strval(MarketingList::getById((int) $this->value)); } catch (NotFoundException $e) { } } }
public function actionCreate($marketingListId, $redirectUrl) { $autoresponder = new Autoresponder(); $autoresponder->marketingList = MarketingList::getById(intval($marketingListId)); ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($autoresponder->marketingList); $model = $this->attemptToSaveModelFromPost($autoresponder, $redirectUrl); $editAndDetailsView = $this->makeEditAndDetailsView($model, 'Edit'); $breadcrumbLinks = static::getDetailsAndEditBreadcrumbLinks($autoresponder->marketingList); $breadcrumbLinks[] = Zurmo::t('AutorespondersModule', 'Create'); $view = new AutorespondersPageView(MarketingDefaultViewUtil::makeViewWithBreadcrumbsForCurrentUser($this, $editAndDetailsView, $breadcrumbLinks, 'MarketingBreadCrumbView')); echo $view->render(); }
public function testCreateAndGetMarketingListById() { $marketingList = new MarketingList(); $marketingList->name = 'Test Marketing List'; $marketingList->description = 'Test Description'; $marketingList->fromName = 'Zurmo Sales'; $marketingList->fromAddress = '*****@*****.**'; $this->assertTrue($marketingList->save()); $id = $marketingList->id; unset($marketingList); $marketingList = MarketingList::getById($id); $this->assertEquals('Test Marketing List', $marketingList->name); $this->assertEquals('Test Description', $marketingList->description); $this->assertEquals('Zurmo Sales', $marketingList->fromName); $this->assertEquals('*****@*****.**', $marketingList->fromAddress); }
/** * @param DemoDataHelper $demoDataHelper */ public function makeAll(&$demoDataHelper) { assert('$demoDataHelper instanceof DemoDataHelper'); assert('$demoDataHelper->isSetRange("User")'); $marketingLists = array(); for ($this->index = 0; $this->index < 5; $this->index++) { $marketingList = new MarketingList(); $marketingList->owner = $demoDataHelper->getRandomByModelName('User'); $this->populateModel($marketingList); $marketingList->addPermissions(Group::getByName(Group::EVERYONE_GROUP_NAME), Permission::READ_WRITE_CHANGE_PERMISSIONS_CHANGE_OWNER); $saved = $marketingList->save(); assert('$saved'); $marketingList = MarketingList::getById($marketingList->id); AllPermissionsOptimizationUtil::securableItemGivenPermissionsForGroup($marketingList, Group::getByName(Group::EVERYONE_GROUP_NAME)); $marketingList->save(); $marketingLists[] = $marketingList->id; } $demoDataHelper->setRangeByModelName('MarketingList', $marketingLists[0], $marketingLists[count($marketingLists) - 1]); }
/** * @depends testRunWithMultipleRecipientsWithAttachments */ public function testRunWithSubscribedAndUnsubscribedMembers() { $campaignItemsCountBefore = CampaignItem::getCount(); $job = new CampaignQueueMessagesInOutboxJob(); $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 10'); $marketingListId = $marketingList->id; $contacts = array(); for ($i = 0; $i < 5; $i++) { $email = new Email(); $email->emailAddress = "demo{$i}@zurmo.com"; $contact = ContactTestHelper::createContactByNameForOwner('contact 0' . ($i + 14), $this->user); $contact->primaryEmail = $email; $this->assertTrue($contact->save()); $contacts[] = $contact; MarketingListMemberTestHelper::createMarketingListMember($i % 2, $marketingList, $contact); } $marketingList->forgetAll(); $marketingList = MarketingList::getById($marketingListId); $campaign = CampaignTestHelper::createCampaign('campaign 10', 'subject 10', '[[FIRST^NAME]]', '[[LAST^NAME]]', null, null, null, Campaign::STATUS_PROCESSING, null, 0, $marketingList); $this->assertNotNull($campaign); $campaignId = $campaign->id; foreach ($contacts as $contact) { CampaignItemTestHelper::createCampaignItem(0, $campaign, $contact); } $this->assertTrue($job->run()); $campaign = Campaign::getById($campaignId); $campaignItemsCountExpected = $campaignItemsCountBefore + 5; $campaignItemsCountAfter = CampaignItem::getCount(); $this->assertEquals($campaignItemsCountExpected, $campaignItemsCountAfter); $campaignItemsProcessed = CampaignItem::getByProcessedAndCampaignId(1, $campaign->id); $this->assertCount(5, $campaignItemsProcessed); $skippedCount = 0; foreach ($campaignItemsProcessed as $campaignItem) { $contact = $campaignItem->contact; $member = MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($campaign->marketingList->id, $contact->id, true); if ($member) { $personId = $campaignItem->contact->getClassId('Person'); $type = CampaignItemActivity::TYPE_SKIP; $activity = CampaignItemActivity::getByTypeAndModelIdAndPersonIdAndUrl($type, $campaignItem->id, $personId); $this->assertNotNull($activity); $this->assertNotEmpty($activity); $this->assertCount(1, $activity); $skippedCount++; } else { $this->assertNotEmpty($campaignItem->emailMessage); $this->assertContains($contact->firstName, $campaignItem->emailMessage->content->textContent); $this->assertContains($contact->lastName, $campaignItem->emailMessage->content->htmlContent); } } $this->assertEquals(2, $skippedCount); }
public function testGetInfoToCopyToCampaign() { $marketingListId = self::getModelIdByModelNameAndName('MarketingList', 'MarketingListName'); $marketingList = MarketingList::getById($marketingListId); $this->setGetArray(array('id' => $marketingListId)); $content = $this->runControllerWithNoExceptionsAndGetContent('marketingLists/default/getInfoToCopyToCampaign'); $decodedContent = CJSON::decode($content); $this->assertNotEmpty($decodedContent); $this->assertArrayHasKey('fromName', $decodedContent); $this->assertArrayHasKey('fromAddress', $decodedContent); $this->assertEquals($marketingList->fromName, $decodedContent['fromName']); $this->assertEquals($marketingList->fromAddress, $decodedContent['fromAddress']); }
/** * @depends testMassDeleteActionsForSelectedIds */ public function testMassDeletePagesProperlyAndRemovesAllSelected() { // MassDelete for selected Record Count $listId = self::getModelIdByModelNameAndName('MarketingList', 'MarketingList2'); $this->assertNotEmpty($listId); $list = MarketingList::getById($listId); $this->assertNotEmpty($list); $members = $list->marketingListMembers; $this->assertEquals(17, count($members)); // save Model MassDelete for entire search result $this->setGetArray(array('selectAll' => '1', 'MarketingListMembersPortletView_page' => 1, 'id' => $listId)); $this->setPostArray(array('selectedRecordCount' => 17)); // Run Mass Delete using progress save for page1. $pageSize = Yii::app()->pagination->getForCurrentUserByType('massDeleteProgressPageSize'); $this->assertEquals(5, $pageSize); $this->runControllerWithExitExceptionAndGetContent('marketingLists/member/massDelete'); // check for previous mass delete progress $list->forgetAll(); $list = MarketingList::getById($listId); $this->assertNotEmpty($list); $members = $list->marketingListMembers; $this->assertEquals(12, count($members)); $this->setGetArray(array('selectAll' => '1', 'MarketingListMember_page' => 2, 'id' => $listId)); $this->setPostArray(array('selectedRecordCount' => 17)); // Run Mass Delete using progress save for page2. $pageSize = Yii::app()->pagination->getForCurrentUserByType('massDeleteProgressPageSize'); $this->assertEquals(5, $pageSize); $this->runControllerWithNoExceptionsAndGetContent('marketingLists/member/massDeleteProgress'); $list->forgetAll(); $list = MarketingList::getById($listId); $this->assertNotEmpty($list); $members = $list->marketingListMembers; $this->assertEquals(7, count($members)); $this->setGetArray(array('selectAll' => '1', 'MarketingListMember_page' => 3, 'id' => $listId)); $this->setPostArray(array('selectedRecordCount' => 17)); // Run Mass Delete using progress save for page3. $pageSize = Yii::app()->pagination->getForCurrentUserByType('massDeleteProgressPageSize'); $this->assertEquals(5, $pageSize); $this->runControllerWithNoExceptionsAndGetContent('marketingLists/member/massDeleteProgress'); $list->forgetAll(); $list = MarketingList::getById($listId); $this->assertNotEmpty($list); $members = $list->marketingListMembers; $this->assertEquals(2, count($members)); $this->setGetArray(array('selectAll' => '1', 'MarketingListMember_page' => 4, 'id' => $listId)); $this->setPostArray(array('selectedRecordCount' => 17)); // Run Mass Delete using progress save for page4. $pageSize = Yii::app()->pagination->getForCurrentUserByType('massDeleteProgressPageSize'); $this->assertEquals(5, $pageSize); $this->runControllerWithNoExceptionsAndGetContent('marketingLists/member/massDeleteProgress'); $list->forgetAll(); $list = MarketingList::getById($listId); $this->assertNotEmpty($list); $members = $list->marketingListMembers; $this->assertEquals(0, count($members)); }
/** * @depends testProcessDueCampaignItemWithAttachments */ public function testGenerateCampaignItemsForDueCampaigns() { $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 07'); $marketingListId = $marketingList->id; for ($i = 0; $i < 5; $i++) { $contact = ContactTestHelper::createContactByNameForOwner('campaignContact ' . $i, $this->user); MarketingListMemberTestHelper::createMarketingListMember($i % 2, $marketingList, $contact); } $marketingList->forgetAll(); $marketingList = MarketingList::getById($marketingListId); $campaign = CampaignTestHelper::createCampaign('campaign 07', 'subject 07', 'text 07', 'html 07', null, null, null, null, null, null, $marketingList); $this->assertNotNull($campaign); $campaign->forgetAll(); $campaignId = $campaign->id; $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); $this->assertEmpty($campaignItems); //Process open campaigns. Yii::app()->jobQueue->deleteAll(); $this->assertCount(0, Yii::app()->jobQueue->getAll()); $util = new CampaignItemsUtil(); $this->assertTrue($util->generateCampaignItemsForDueCampaigns()); $jobs = Yii::app()->jobQueue->getAll(); $this->assertCount(1, $jobs); $this->assertEquals('CampaignQueueMessagesInOutbox', $jobs[5][0]['jobType']); $campaign = Campaign::getById($campaignId); $this->assertNotNull($campaign); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); // TODO: @Shoaibi: Low: Add tests for the other campaign type. }
public function testRunWithCampaignPausedAfterAllItemsGeneratedAndThenUnpaused() { // Cleanup Campaign::deleteAll(); $this->assertEquals(0, Campaign::getCount()); $this->assertEquals(0, CampaignItem::getCount()); $this->assertEquals(0, CampaignItemActivity::getCount()); MarketingList::deleteAll(); $this->assertEquals(0, MarketingList::getCount()); $this->assertEquals(0, MarketingListMember::getCount()); EmailMessage::deleteAll(); $this->assertEquals(0, EmailMessage::getCount()); $this->assertEquals(0, EmailMessageContent::getCount()); $this->assertEquals(0, EmailMessageSender::getCount()); $this->assertEquals(0, EmailMessageRecipient::getCount()); Contact::deleteAll(); $this->assertEquals(0, Contact::getCount()); // setup an email address for contacts $email = new Email(); $email->emailAddress = '*****@*****.**'; // create a marketing list with 5 members $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 05'); $marketingListId = $marketingList->id; for ($i = 1; $i <= 5; $i++) { $contact = ContactTestHelper::createContactByNameForOwner('campaignContact 0' . $i, $this->user); $contact->primaryEmail = $email; $this->assertTrue($contact->save()); MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact); } $marketingList->forgetAll(); // create a due campaign with that marketing list $campaign = CampaignTestHelper::createCampaign('campaign 04', 'subject', 'text Content', 'Html Content', null, null, null, null, null, null, MarketingList::getById($marketingListId)); $campaignId = $campaign->id; /* * Run 1: * CampaignGenerateDueCampaignItemsJob * status == processing * items generated but unprocessed * * CampaignQueueMessagesInOutboxJob * status == processing * items processed with email messages generated and queued * * ProcessOutboundEmailJob * status == processing * email items attempted to be sent * * Run 2: * Pause the campaign * items are processed and still present * * Unpause the campaign * status == active * items are processed and still present * * CampaignGenerateDueCampaignItemsJob * status == processing * ensure all items are present and processed * * CampaignQueueMessagesInOutboxJob * status == processing * ensure all items are present and processed * ensure all email messages are present with correct folder type * * ProcessOutboundEmailJob * ensure all email messages are present with correct folder type * status == processing * * * Run 3: * Mark Campaign as Completed * status == completed */ // we have to do this to ensure when we retrieve the data status is updated from db. $campaign->forgetAll(); $this->assertEmpty(CampaignItem::getAll()); // Run 1 starts here // Run CampaignGenerateDueCampaignItemsJob $job = new CampaignGenerateDueCampaignItemsJob(); $this->assertTrue($job->run()); $campaign = Campaign::getById($campaignId); // ensure status is processing $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); // ensure 5 campaign items have been generated $this->assertEquals(5, CampaignItem::getCount()); // ensure all 5 campaign items are unprocessed $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); // Run CampaignQueueMessagesInOutboxJob $job = new CampaignQueueMessagesInOutboxJob(); $this->assertTrue($job->run()); // Ensure campaign status $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); // ensure all 5 campaign items are processed $campaignItems = CampaignItem::getByProcessedAndCampaignId(1, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); // Ensure 5 new email messages $this->assertEquals(5, EmailMessage::getCount()); $this->assertEquals(5, EmailHelper::getQueuedCount()); // Run ProcessOutboundEmail $job = new ProcessOutboundEmailJob(); $this->assertTrue($job->run()); // Ensure all email were sent $this->assertEquals(5, EmailMessage::getCount()); $this->assertEquals(0, EmailHelper::getQueuedCount()); foreach (EmailMessage::getAll() as $emailMessage) { $this->assertEquals($emailMessage->folder->type, EmailFolder::TYPE_SENT); } // Ensure campaign status $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); // end of Run 1 // Run 2 starts here // Pause the campaign $campaign->status = Campaign::STATUS_PAUSED; $this->assertTrue($campaign->save()); // ensure campaign items are still there $campaignItems = CampaignItem::getByProcessedAndCampaignId(1, $campaignId); $this->assertCount(5, $campaignItems); $this->assertNotEmpty($campaignItems); // Unpause campaign $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PAUSED, $campaign->status); $campaign->status = Campaign::STATUS_ACTIVE; $this->assertTrue($campaign->save()); // ensure campaign items are still there $campaignItems = CampaignItem::getByProcessedAndCampaignId(1, $campaignId); $this->assertCount(5, $campaignItems); $this->assertNotEmpty($campaignItems); // Ensure status change $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_ACTIVE, $campaign->status); // Run CampaignGenerateDueCampaignItemsJob $job = new CampaignGenerateDueCampaignItemsJob(); $this->assertTrue($job->run()); // Ensure campaign status change $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); // ensure all 5 (previously created in run1) campaign items are still processed $campaignItems = CampaignItem::getByProcessedAndCampaignId(1, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); // Run CampaignQueueMessagesInOutboxJob $job = new CampaignQueueMessagesInOutboxJob(); $this->assertTrue($job->run()); // Ensure campaign status $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); // ensure all 5 (previously created in run1) campaign items are still processed $campaignItems = CampaignItem::getByProcessedAndCampaignId(1, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); // Ensure all 5 (previously created and sent in run1) emails are sent. $this->assertEquals(5, EmailMessage::getCount()); foreach (EmailMessage::getAll() as $emailMessage) { $this->assertEquals($emailMessage->folder->type, EmailFolder::TYPE_SENT); } // Run ProcessOutboundEmail $job = new ProcessOutboundEmailJob(); $this->assertTrue($job->run()); // Ensure all 5 (previously created and sent in run1) emails are sent. $this->assertEquals(5, EmailMessage::getCount()); foreach (EmailMessage::getAll() as $emailMessage) { $this->assertEquals($emailMessage->folder->type, EmailFolder::TYPE_SENT); } // Ensure campaign status $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); // end of Run 2 // Run 3 starts here // Run CampaignMarkCompleted $job = new CampaignMarkCompletedJob(); $this->assertTrue($job->run()); // Ensure campaign status change $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_COMPLETED, $campaign->status); // end of Run 3 }
protected function processUnsubscribeFromListAction() { $actionAttributes = $this->action->getActionAttributes(); if (count($actionAttributes) > 1 || !isset($actionAttributes['marketingList']) || !$this->triggeredModel instanceof Contact) { throw new NotSupportedException(); } $marketingListId = $actionAttributes['marketingList']->value; $members = MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($marketingListId, (int) $this->triggeredModel->id, false); if ($members !== false) { $member = $members[0]; $member->unsubscribed = true; if (!$member->unrestrictedSave()) { throw new FailedToSaveModelException(); } } else { try { //Does the marketing list still exist MarketingList::getById((int) $marketingListId); } catch (NotFoundException $e) { $this->logAndNotifyOnMissingMarketingListModel(ActionForWorkflowForm::TYPE_UNSUBSCRIBE_FROM_LIST); } } }
/** * @depends testRunWithDueActiveCampaignsWithMembers */ public function testRunWithJustDueActiveCampaignsWithMembers() { $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 05'); $marketingListId = $marketingList->id; $processed = 0; for ($i = 6; $i <= 10; $i++) { $contact = ContactTestHelper::createContactByNameForOwner('campaignContact 0' . $i, $this->user); MarketingListMemberTestHelper::createMarketingListMember($processed, $marketingList, $contact); } $marketingList->forgetAll(); $marketingList = MarketingList::getById($marketingListId); $nowDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time()); $campaign = CampaignTestHelper::createCampaign('Active, Just Due With Members', 'subject', 'text Content', 'Html Content', null, null, null, Campaign::STATUS_ACTIVE, $nowDateTime, null, $marketingList); // we have to do this to ensure when we retrieve the data status is updated from db. $campaign->forgetAll(); $this->assertEmpty(CampaignItem::getAll()); // sleep 1 second to ensure we are giving ample time difference between creating the campaign and calling the job sleep(1); $job = new CampaignGenerateDueCampaignItemsJob(); $this->assertTrue($job->run()); $campaign = Campaign::getByName('Active, just Due With Members'); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign[0]->status); $allCampaignItems = CampaignItem::getAll(); $this->assertNotEmpty($allCampaignItems); $this->assertCount(5, $allCampaignItems); $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaign[0]->id); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); }
public function generateCampaignItemsForDueCampaigns($count) { $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList Test', 'description goes here', 'fromName', '*****@*****.**'); $marketingListId = $marketingList->id; $contacts = array(); $emails = array(); for ($i = 0; $i < $count; $i++) { $emails[$i] = new Email(); $emails[$i]->emailAddress = "demo{$i}@zurmo.com"; $account = AccountTestHelper::createAccountByNameForOwner('account ' . $i, $this->user); $contact = ContactTestHelper::createContactWithAccountByNameForOwner('contact ' . $i, $this->user, $account); $contact->primaryEmail = $emails[$i]; $this->assertTrue($contact->save()); $contacts[$i] = $contact; MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact); } $marketingList->forgetAll(); $marketingList = MarketingList::getById($marketingListId); $content = <<<MTG [[COMPANY^NAME]] [[CREATED^DATE^TIME]] [[DEPARTMENT]] [[DESCRIPTION]] [[FIRST^NAME]] [[GOOGLE^WEB^TRACKING^ID]] [[INDUSTRY]] [[JOB^TITLE]] [[LAST^NAME]] [[LATEST^ACTIVITY^DATE^TIME]] [[MOBILE^PHONE]] [[MODIFIED^DATE^TIME]] [[OFFICE^FAX]] [[OFFICE^PHONE]] [[TITLE]] [[SOURCE]] [[STATE]] [[WEBSITE]] [[MODEL^URL]] [[BASE^URL]] [[APPLICATION^NAME]] [[CURRENT^YEAR]] [[LAST^YEAR]] [[OWNERS^AVATAR^SMALL]] [[OWNERS^AVATAR^MEDIUM]] [[OWNERS^AVATAR^LARGE]] [[OWNERS^EMAIL^SIGNATURE]] [[UNSUBSCRIBE^URL]] [[MANAGE^SUBSCRIPTIONS^URL]] [[PRIMARY^EMAIL__EMAIL^ADDRESS]] [[PRIMARY^EMAIL__EMAIL^ADDRESS]] [[SECONDARY^ADDRESS__CITY]] [[SECONDARY^ADDRESS__COUNTRY]] [[SECONDARY^ADDRESS__INVALID]] [[SECONDARY^ADDRESS__LATITUDE]] [[SECONDARY^ADDRESS__LONGITUDE]] [[SECONDARY^ADDRESS__POSTAL^CODE]] [[SECONDARY^ADDRESS__STATE]] [[SECONDARY^ADDRESS__STREET1]] [[SECONDARY^ADDRESS__STREET2]] [[OWNER__DEPARTMENT]] [[OWNER__FIRST^NAME]] [[OWNER__IS^ACTIVE]] [[OWNER__MOBILE^PHONE]] [[OWNER__LAST^LOGIN^DATE^TIME]] [[OWNER__LAST^NAME]] [[CREATED^BY^USER__FIRST^NAME]] [[CREATED^BY^USER__LAST^NAME]] [[CREATED^BY^USER__MOBILE^PHONE]] [[CREATED^BY^USER__TITLE]] [[CREATED^BY^USER__USERNAME]] [[ACCOUNT__ANNUAL^REVENUE]] [[ACCOUNT__INDUSTRY]] [[ACCOUNT__NAME]] [[ACCOUNT__WEBSITE]] [[ACCOUNT__BILLING^ADDRESS__COUNTRY]] [[ACCOUNT__BILLING^ADDRESS__CITY]] [[ACCOUNT__OWNER__FIRST^NAME]] ' " ` " ' MTG; $sendOnDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() - 600); $campaign = CampaignTestHelper::createCampaign('campaign Test', 'subject', $content, $content, null, null, null, Campaign::STATUS_ACTIVE, $sendOnDateTime, null, $marketingList, false); $fileNames = array('testImage.png', 'testZip.zip', 'testPDF.pdf'); $files = array(); foreach ($fileNames as $index => $fileName) { $file = ZurmoTestHelper::createFileModel($fileName); $files[$index]['name'] = $fileName; $files[$index]['type'] = $file->type; $files[$index]['size'] = $file->size; $files[$index]['contents'] = $file->fileContent->content; $campaign->files->add($file); } $this->assertTrue($campaign->save(false)); $campaignId = $campaign->id; $campaign->forgetAll(); $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); $this->assertEmpty($campaignItems); //Process open campaigns. Yii::app()->jobQueue->deleteAll(); AutoresponderOrCampaignBatchSizeConfigUtil::setBatchSize($count); Yii::app()->jobQueue->deleteAll(); $this->assertCount(0, Yii::app()->jobQueue->getAll()); ForgetAllCacheUtil::forgetAllCaches(); $job = new CampaignGenerateDueCampaignItemsJob(); $startedAt = microtime(true); $this->assertTrue($job->run()); $timeTaken = microtime(true) - $startedAt; ForgetAllCacheUtil::forgetAllCaches(); $campaign->forgetAll(); unset($campaign); $campaign = Campaign::getById($campaignId); $this->assertNotNull($campaign); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount($count, $campaignItems); return $timeTaken; }
/** * Tests subscribing a contact to a marketing list */ public function testSubscribeToListAction() { Yii::app()->user->userModel = User::getByUsername('super'); //Create marketing list $marketingList = MarketingListTestHelper::createMarketingListByName('testList'); $marketingListId = $marketingList->id; $this->assertEquals(0, $marketingList->marketingListMembers->count()); //Create workflow $workflow = new Workflow(); $workflow->setDescription('aDescription'); $workflow->setIsActive(true); $workflow->setOrder(5); $workflow->setModuleClassName('ContactsModule'); $workflow->setName('myFirstWorkflow'); $workflow->setTriggerOn(Workflow::TRIGGER_ON_NEW_AND_EXISTING); $workflow->setType(Workflow::TYPE_ON_SAVE); $workflow->setTriggersStructure('1'); //Add action $action = new ActionForWorkflowForm('Contact', Workflow::TYPE_ON_SAVE); $action->type = ActionForWorkflowForm::TYPE_SUBSCRIBE_TO_LIST; $attributes = array('marketingList' => array('type' => WorkflowActionAttributeForm::TYPE_STATIC, 'value' => $marketingListId)); $action->setAttributes(array(ActionForWorkflowForm::ACTION_ATTRIBUTES => $attributes)); $workflow->addAction($action); //Create the saved Workflow $savedWorkflow = new SavedWorkflow(); SavedWorkflowToWorkflowAdapter::resolveWorkflowToSavedWorkflow($workflow, $savedWorkflow); $saved = $savedWorkflow->save(); $this->assertTrue($saved); //Confirm that the workflow processes and the contact gets updated $contact = ContactTestHelper::createContactByNameForOwner('jason', Yii::app()->user->userModel); $marketingList->forget(); $marketingList = MarketingList::getById($marketingListId); $this->assertEquals(1, $marketingList->marketingListMembers->count()); $this->assertEquals(0, $marketingList->marketingListMembers[0]->unsubscribed); }
public function actionEdit($id) { $marketingList = MarketingList::getById(intval($id)); ControllerSecurityUtil::resolveAccessCanCurrentUserWriteModel($marketingList); $breadCrumbLinks = static::getDetailsAndEditBreadcrumbLinks(); $breadCrumbLinks[] = StringUtil::getChoppedStringContent(strval($marketingList), 25); $editView = new MarketingListEditView($this->getId(), $this->getModule()->getId(), $this->attemptToSaveModelFromPost($marketingList), strval($marketingList)); $view = new MarketingListsPageView(MarketingDefaultViewUtil::makeViewWithBreadcrumbsForCurrentUser($this, $editView, $breadCrumbLinks, 'MarketingBreadCrumbView')); echo $view->render(); }
public function testUnsubscribeContactFromListUsingWorkflowAction() { $this->assertEquals(1, static::$marketingList->marketingListMembers->count()); $this->assertEquals(1, MarketingListMember::getCount()); //Try to unsubscribe the contact, this doesn't do anything useful as contact is already unsubscribed $action = new ActionForWorkflowForm('Contact', Workflow::TYPE_ON_SAVE); $action->type = ActionForWorkflowForm::TYPE_UNSUBSCRIBE_FROM_LIST; $attributes = array('marketingList' => array('shouldSetValue' => '1', 'type' => WorkflowActionAttributeForm::TYPE_STATIC, 'value' => static::$marketingList->id)); $action->setAttributes(array(ActionForWorkflowForm::ACTION_ATTRIBUTES => $attributes)); $helper = new WorkflowActionProcessingHelper(88, 'some name', $action, static::$contact, Yii::app()->user->userModel); $helper->processNonUpdateSelfAction(); $marketingListId = static::$marketingList->id; static::$marketingList->forget(); static::$marketingList = MarketingList::getById($marketingListId); $this->assertEquals(1, static::$marketingList->marketingListMembers->count()); $this->assertEquals(1, static::$marketingList->marketingListMembers[0]->unsubscribed); $this->assertEquals(1, MarketingListMember::getCount()); }
protected static function processModelForMassSubscribe(&$model) { $marketingListMember = Yii::app()->request->getPost('MarketingListMember'); if ($marketingListMember['marketingList']['id'] > 0) { $marketingList = MarketingList::getById((int) $marketingListMember['marketingList']['id']); $marketingList->addNewMember($model->id); return true; } }
protected function resolveMembers($unsubscribed, Contact $contact, $marketingListId, $optOut) { if ($optOut) { $members = MarketingListMember::getByContactIdAndSubscribed($contact->id, $unsubscribed); } else { $members = MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($marketingListId, $contact->id, $unsubscribed); } if (!is_array($members) && $members !== false) { $members = array($members); } if (empty($members)) { $marketingList = MarketingList::getById(intval($marketingListId)); if ($unsubscribed === 1 && !empty($marketingList) && $marketingList->anyoneCanSubscribe && !$marketingList->memberAlreadyExists($contact->id)) { $members[0] = new MarketingListMember(); $members[0]->contact = $contact; $members[0]->marketingList = $marketingList; } else { return false; } } return $members; }
/** * @depends testGenerateCampaignItemsForDueCampaigns */ public function testGenerateCampaignItemsForDueCampaignsWithCustomBatchSize() { $contactIds = array(); $marketingListIds = array(); $campaignIds = array(); for ($index = 6; $index < 9; $index++) { $contact = ContactTestHelper::createContactByNameForOwner('campaignContact 0' . $index, $this->user); $contactIds[] = $contact->id; $contact->forgetAll(); } for ($index = 8; $index < 12; $index++) { $suffix = $index; if ($index < 10) { $suffix = "0{$suffix}"; } $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList ' . $suffix); $marketingListId = $marketingList->id; $marketingListIds[] = $marketingListId; foreach ($contactIds as $contactId) { $contact = Contact::getById($contactId); $unsubscribed = rand(10, 20) % 2; MarketingListMemberTestHelper::createMarketingListMember($unsubscribed, $marketingList, $contact); } $marketingList->forgetAll(); $marketingList = MarketingList::getById($marketingListId); $campaignSuffix = substr($marketingList->name, -2); $campaign = CampaignTestHelper::createCampaign('campaign ' . $campaignSuffix, 'subject ' . $campaignSuffix, 'text ' . $campaignSuffix, 'html ' . $campaignSuffix, null, null, null, null, null, null, $marketingList); $this->assertNotNull($campaign); $campaignIds[] = $campaign->id; $campaign->forgetAll(); } foreach ($campaignIds as $campaignId) { $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); $this->assertEmpty($campaignItems); } $this->assertTrue(CampaignItemsUtil::generateCampaignItemsForDueCampaigns(5)); foreach ($campaignIds as $index => $campaignId) { $campaign = Campaign::getById($campaignId); $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); if ($index === 0) { $expectedCount = AutoresponderOrCampaignBatchSizeConfigUtil::getBatchSize(); $memberCount = count($campaign->marketingList->marketingListMembers); if ($memberCount < $expectedCount) { $expectedCount = $memberCount; } $this->assertNotEmpty($campaignItems); $this->assertCount($expectedCount, $campaignItems); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); } else { $this->assertEmpty($campaignItems); $this->assertEquals(Campaign::STATUS_ACTIVE, $campaign->status); } } $this->assertTrue(CampaignItemsUtil::generateCampaignItemsForDueCampaigns()); foreach ($campaignIds as $index => $campaignId) { $campaign = Campaign::getById($campaignId); $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); if ($index < 2) { $expectedCount = AutoresponderOrCampaignBatchSizeConfigUtil::getBatchSize(); $memberCount = count($campaign->marketingList->marketingListMembers); if ($memberCount < $expectedCount) { $expectedCount = $memberCount; } $this->assertNotEmpty($campaignItems); $this->assertCount($expectedCount, $campaignItems); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); } else { $this->assertEmpty($campaignItems); $this->assertEquals(Campaign::STATUS_ACTIVE, $campaign->status); } } // TODO: @Shoaibi: Medium: Add tests for the other campaign type. }
public function testUnsubscribeContactFromList() { //Empty members from the test marketing list $marketingList = MarketingList::getById(self::$marketingListId); foreach ($marketingList->marketingListMembers as $marketingListMember) { $marketingListMember->delete(); } $marketingList->forget(); $marketingList = MarketingList::getById(self::$marketingListId); $this->assertEquals(0, $marketingList->marketingListMembers->count()); //Subscribe new member $contact = ContactTestHelper::createContactByNameForOwner('jason', Yii::app()->user->userModel); $marketingList->addNewMember($contact->id); $marketingList->forget(); $marketingList = MarketingList::getById(self::$marketingListId); $this->assertEquals(1, $marketingList->marketingListMembers->count()); $this->assertEquals(0, $marketingList->marketingListMembers[0]->unsubscribed); //Try to unsubscribe the contact, it should unsubscribe them $action = new ActionForWorkflowForm('Contact', Workflow::TYPE_ON_SAVE); $action->type = ActionForWorkflowForm::TYPE_UNSUBSCRIBE_FROM_LIST; $attributes = array('marketingList' => array('shouldSetValue' => '1', 'type' => WorkflowActionAttributeForm::TYPE_STATIC, 'value' => self::$marketingListId)); $action->setAttributes(array(ActionForWorkflowForm::ACTION_ATTRIBUTES => $attributes)); $helper = new WorkflowActionProcessingHelper(88, 'some name', $action, $contact, Yii::app()->user->userModel); $helper->processNonUpdateSelfAction(); $marketingList->forget(); $marketingList = MarketingList::getById(self::$marketingListId); $this->assertEquals(1, $marketingList->marketingListMembers->count()); $this->assertEquals(1, $marketingList->marketingListMembers[0]->unsubscribed); //Subscribe contact from list, then unsubscribe $marketingListMembers = MarketingListMember::getAll(); $this->assertEquals(1, count($marketingListMembers)); $marketingListMembers[0]->unsubscribed = false; $marketingListMembers[0]->unrestrictedSave(); $marketingList->forget(); $marketingList = MarketingList::getById(self::$marketingListId); $this->assertEquals(1, $marketingList->marketingListMembers->count()); $this->assertEquals(0, $marketingList->marketingListMembers[0]->unsubscribed); //Try to unsubscribe the contact, it should unsubscribe them $helper = new WorkflowActionProcessingHelper(88, 'some name', $action, $contact, Yii::app()->user->userModel); $helper->processNonUpdateSelfAction(); $marketingList->forget(); $marketingList = MarketingList::getById(self::$marketingListId); $this->assertEquals(1, $marketingList->marketingListMembers->count()); $this->assertEquals(1, $marketingList->marketingListMembers[0]->unsubscribed); }
protected function addNewSubscribers($marketingListId, $contactIds, $scenario = null) { $subscriberInformation = array('subscribedCount' => 0, 'skippedCount' => 0); $marketingList = MarketingList::getById((int) $marketingListId); ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($marketingList); foreach ($contactIds as $contactId) { if ($marketingList->addNewMember($contactId, false, null, $scenario)) { $subscriberInformation['subscribedCount']++; } else { $subscriberInformation['skippedCount']++; } } return $subscriberInformation; }
/** * @depends testRunWithJustDueActiveCampaignsWithMembers */ public function testRunJobDoesNotRegenerateExistingItems() { $data = array('old' => array('subject' => 'Old Subject', 'fromName' => 'Old From Name', 'fromAddress' => '*****@*****.**', 'textContent' => 'Old Text Content', 'htmlContent' => 'Old Html Content'), 'new' => array('subject' => 'New Subject', 'fromName' => 'New From Name', 'fromAddress' => '*****@*****.**', 'textContent' => 'New Text Content', 'htmlContent' => 'New Html Content')); $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 06'); $marketingListId = $marketingList->id; $processed = 0; for ($i = 11; $i <= 15; $i++) { $email = new Email(); $email->emailAddress = "demo{$i}@zurmo.com"; $contact = ContactTestHelper::createContactByNameForOwner('campaignContact 0' . $i, $this->user); $contact->primaryEmail = $email; $this->assertTrue($contact->save()); MarketingListMemberTestHelper::createMarketingListMember($processed, $marketingList, $contact); } $marketingList->forgetAll(); $marketingList = MarketingList::getById($marketingListId); $nowDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time()); $campaign = CampaignTestHelper::createCampaign('campaign', $data['old']['subject'], $data['old']['textContent'], $data['old']['htmlContent'], $data['old']['fromName'], $data['old']['fromAddress'], null, Campaign::STATUS_ACTIVE, $nowDateTime, null, $marketingList); $campaignId = $campaign->id; // we have to do this to ensure when we retrieve the data status is updated from db. $campaign->forgetAll(); $this->assertEmpty(CampaignItem::getAll()); // sleep 1 second to ensure we are giving ample time difference between creating the campaign and calling the job sleep(1); $campaignGenerateDueCampaignItemsJob = new CampaignGenerateDueCampaignItemsJob(); $this->assertTrue($campaignGenerateDueCampaignItemsJob->run()); $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); $allCampaignItems = CampaignItem::getAll(); $this->assertNotEmpty($allCampaignItems); $this->assertCount(5, $allCampaignItems); $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); $campaignQueueMessagesInOutboxJob = new CampaignQueueMessagesInOutboxJob(); $this->assertTrue($campaignQueueMessagesInOutboxJob->run()); $campaignItems = CampaignItem::getByProcessedAndCampaignId(1, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); $oldCampaignItemIds = array(); foreach ($campaignItems as $ci) { $this->assertNotEmpty($ci->id); $this->assertEquals(1, $ci->processed); $this->assertNotEmpty($ci->emailMessage->id); $this->assertNotEmpty($ci->emailMessage->sender->id); $this->assertNotEmpty($ci->emailMessage->content->id); $this->assertNotEmpty($ci->contact->id); $this->assertEquals($data['old']['subject'], $ci->emailMessage->subject); $this->assertEquals($data['old']['fromName'], $ci->emailMessage->sender->fromName); $this->assertEquals($data['old']['fromAddress'], $ci->emailMessage->sender->fromAddress); $this->assertContains($data['old']['textContent'], $ci->emailMessage->content->textContent); $this->assertContains($data['old']['htmlContent'], $ci->emailMessage->content->htmlContent); $oldCampaignItemIds[] = $ci->id; } $campaignItems[count($campaignItems) - 1]->delete(); array_pop($oldCampaignItemIds); $campaign->status = Campaign::STATUS_ACTIVE; foreach ($data['new'] as $property => $value) { $campaign->{$property} = $value; } $this->assertTrue($campaign->save()); $campaign->forgetAll(); $campaignGenerateDueCampaignItemsJob = new CampaignGenerateDueCampaignItemsJob(); $this->assertTrue($campaignGenerateDueCampaignItemsJob->run()); $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); $allCampaignItems = CampaignItem::getAll(); $this->assertNotEmpty($allCampaignItems); $this->assertCount(5, $allCampaignItems); $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(1, $campaignItems); $campaignQueueMessagesInOutboxJob = new CampaignQueueMessagesInOutboxJob(); $this->assertTrue($campaignQueueMessagesInOutboxJob->run()); $campaignItems = CampaignItem::getByProcessedAndCampaignId(1, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); $oldCounter = 0; $newCounter = 0; foreach ($campaignItems as $ci) { $this->assertNotEmpty($ci->id); $this->assertEquals(1, $ci->processed); $this->assertNotEmpty($ci->emailMessage->id); $this->assertNotEmpty($ci->emailMessage->sender->id); $this->assertNotEmpty($ci->emailMessage->content->id); $this->assertNotEmpty($ci->contact->id); $dataIndex = in_array($ci->id, $oldCampaignItemIds) ? 'old' : 'new'; if ($dataIndex == 'old') { $oldCounter++; } else { $newCounter++; } $this->assertEquals($data[$dataIndex]['subject'], $ci->emailMessage->subject); $this->assertEquals($data[$dataIndex]['fromName'], $ci->emailMessage->sender->fromName); $this->assertEquals($data[$dataIndex]['fromAddress'], $ci->emailMessage->sender->fromAddress); $this->assertContains($data[$dataIndex]['textContent'], $ci->emailMessage->content->textContent); $this->assertContains($data[$dataIndex]['htmlContent'], $ci->emailMessage->content->htmlContent); } $this->assertEquals(count($oldCampaignItemIds), $oldCounter); $this->assertEquals(count($campaignItems) - count($oldCampaignItemIds), $newCounter); }