PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/app/protected/modules/campaigns/tests/unit/CampaignItemsUtilTest.php

https://bitbucket.org/zurmo/zurmozoo
PHP | 1088 lines | 947 code | 31 blank | 110 comment | 8 complexity | f6d9422f11b04c4a9825379e3e62dfaa MD5 | raw file
Possible License(s): LGPL-3.0, LGPL-2.1, BSD-2-Clause, AGPL-3.0, BSD-3-Clause, GPL-2.0

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. /*********************************************************************************
  3. * Zurmo is a customer relationship management program developed by
  4. * Zurmo, Inc. Copyright (C) 2013 Zurmo Inc.
  5. *
  6. * Zurmo is free software; you can redistribute it and/or modify it under
  7. * the terms of the GNU Affero General Public License version 3 as published by the
  8. * Free Software Foundation with the addition of the following permission added
  9. * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
  10. * IN WHICH THE COPYRIGHT IS OWNED BY ZURMO, ZURMO DISCLAIMS THE WARRANTY
  11. * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
  12. *
  13. * Zurmo is distributed in the hope that it will be useful, but WITHOUT
  14. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  15. * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
  16. * details.
  17. *
  18. * You should have received a copy of the GNU Affero General Public License along with
  19. * this program; if not, see http://www.gnu.org/licenses or write to the Free
  20. * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  21. * 02110-1301 USA.
  22. *
  23. * You can contact Zurmo, Inc. with a mailing address at 27 North Wacker Drive
  24. * Suite 370 Chicago, IL 60606. or at email address contact@zurmo.com.
  25. *
  26. * The interactive user interfaces in original and modified versions
  27. * of this program must display Appropriate Legal Notices, as required under
  28. * Section 5 of the GNU Affero General Public License version 3.
  29. *
  30. * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
  31. * these Appropriate Legal Notices must retain the display of the Zurmo
  32. * logo and Zurmo copyright notice. If the display of the logo is not reasonably
  33. * feasible for technical reasons, the Appropriate Legal Notices must display the words
  34. * "Copyright Zurmo Inc. 2013. All rights reserved".
  35. ********************************************************************************/
  36. class CampaignItemsUtilTest extends ZurmoBaseTest
  37. {
  38. // We don't need to add separate tests for tracking scenarios here because we have already gained more than
  39. // sufficient coverage in CampaignItemActivityUtilTest and EmailMessageActivityUtilTest for those.
  40. protected $user;
  41. public static function setUpBeforeClass()
  42. {
  43. parent::setUpBeforeClass();
  44. SecurityTestHelper::createSuperAdmin();
  45. if (!RedBeanDatabase::isFrozen())
  46. {
  47. // TODO: @Shoaibi: High: get rid of this for God's sake.
  48. $campaignItem = CampaignItemTestHelper::createCampaignItem(0);
  49. $campaignItem->delete();
  50. }
  51. }
  52. public function setUp()
  53. {
  54. parent::setUp();
  55. $this->user = User::getByUsername('super');
  56. Yii::app()->user->userModel = $this->user;
  57. $this->purgeAllCampaigns();
  58. }
  59. /**
  60. * Do not throw exception. That means it passes
  61. */
  62. public function testProcessDueCampaignItemThrowsExceptionWhenContentHasInvalidMergeTagsForOnlyHtml()
  63. {
  64. $html = "[[FIRST^NAME]], You are receiving this email";
  65. $text = null;
  66. $contact = ContactTestHelper::createContactByNameForOwner('contact 01', $this->user);
  67. $marketingList = MarketingListTestHelper::populateMarketingListByName('marketingList 01');
  68. $campaign = CampaignTestHelper::createCampaign('campaign 01',
  69. 'subject 01',
  70. $text,
  71. $html,
  72. null,
  73. null,
  74. null,
  75. null,
  76. null,
  77. null,
  78. $marketingList,
  79. false);
  80. $processed = 0;
  81. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  82. CampaignItemsUtil::processDueItem($campaignItem);
  83. }
  84. /**
  85. * @depends testProcessDueCampaignItemThrowsExceptionWhenContentHasInvalidMergeTagsForOnlyHtml
  86. * Do not throw exception. That means it passes
  87. */
  88. public function testProcessDueCampaignItemThrowsExceptionWhenContentHasInvalidMergeTagsForOnlyText()
  89. {
  90. $text = "[[FIRST^NAME]], You are receiving this email";
  91. $html = null;
  92. $contact = ContactTestHelper::createContactByNameForOwner('contact 01', $this->user);
  93. $marketingList = MarketingListTestHelper::populateMarketingListByName('marketingList 01');
  94. $campaign = CampaignTestHelper::createCampaign('campaign 01',
  95. 'subject 01',
  96. $text,
  97. $html,
  98. null,
  99. null,
  100. null,
  101. null,
  102. null,
  103. null,
  104. $marketingList,
  105. false);
  106. $processed = 0;
  107. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  108. CampaignItemsUtil::processDueItem($campaignItem);
  109. }
  110. /**
  111. * @depends testProcessDueCampaignItemThrowsExceptionWhenContentHasInvalidMergeTagsForOnlyText
  112. * @expectedException NotFoundException
  113. */
  114. public function testProcessDueCampaignItemThrowsExceptionWhenNoContactIsAvailable()
  115. {
  116. $campaignItem = new CampaignItem();
  117. CampaignItemsUtil::processDueItem($campaignItem);
  118. }
  119. /**
  120. * @depends testProcessDueCampaignItemThrowsExceptionWhenNoContactIsAvailable
  121. * @expectedException NotSupportedException
  122. * @expectedExceptionMessage Provided content contains few invalid merge tags
  123. */
  124. public function testProcessDueCampaignItemThrowsExceptionWhenContentHasInvalidMergeTags()
  125. {
  126. $contact = ContactTestHelper::createContactByNameForOwner('contact 01', $this->user);
  127. $marketingList = MarketingListTestHelper::populateMarketingListByName('marketingList 01');
  128. $campaign = CampaignTestHelper::createCampaign('campaign 01',
  129. 'subject 01',
  130. '[[TEXT^CONTENT]]',
  131. '[[HTML^CONTENT]]',
  132. null,
  133. null,
  134. null,
  135. null,
  136. null,
  137. null,
  138. $marketingList,
  139. false);
  140. $processed = 0;
  141. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  142. CampaignItemsUtil::processDueItem($campaignItem);
  143. }
  144. /**
  145. * @depends testProcessDueCampaignItemThrowsExceptionWhenContentHasInvalidMergeTags
  146. */
  147. public function testProcessDueCampaignItemDoesNotThrowExceptionWhenContactHasNoPrimaryEmail()
  148. {
  149. $contact = ContactTestHelper::createContactByNameForOwner('contact 02', $this->user);
  150. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 02');
  151. $campaign = CampaignTestHelper::createCampaign('campaign 02',
  152. 'subject 02',
  153. 'text content',
  154. 'html content',
  155. null,
  156. null,
  157. null,
  158. null,
  159. null,
  160. 0,
  161. $marketingList);
  162. $processed = 0;
  163. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  164. CampaignItemsUtil::processDueItem($campaignItem);
  165. $this->assertEquals(1, $campaignItem->processed);
  166. $emailMessage = $campaignItem->emailMessage;
  167. $this->assertEquals($marketingList->owner, $emailMessage->owner);
  168. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  169. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  170. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  171. $this->assertNull($emailMessage->subject);
  172. $this->assertNull($emailMessage->content->textContent);
  173. $this->assertNull($emailMessage->content->htmlContent);
  174. $this->assertNull($emailMessage->sender->fromAddress);
  175. $this->assertNull($emailMessage->sender->fromName);
  176. $this->assertEquals(0, $emailMessage->recipients->count());
  177. }
  178. /**
  179. * @depends testProcessDueCampaignItemDoesNotThrowExceptionWhenContactHasNoPrimaryEmail
  180. */
  181. public function testProcessDueCampaignItemDoesNotThrowExceptionWhenContactHasPrimaryEmail()
  182. {
  183. $email = new Email();
  184. $email->emailAddress = 'demo@zurmo.com';
  185. $contact = ContactTestHelper::createContactByNameForOwner('contact 03', $this->user);
  186. $contact->primaryEmail = $email;
  187. $this->assertTrue($contact->save());
  188. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 03');
  189. $campaign = CampaignTestHelper::createCampaign('campaign 03',
  190. 'subject 03',
  191. 'text content',
  192. 'html content',
  193. null,
  194. null,
  195. null,
  196. null,
  197. null,
  198. null,
  199. $marketingList);
  200. $processed = 0;
  201. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  202. CampaignItemsUtil::processDueItem($campaignItem);
  203. $this->assertEquals(1, $campaignItem->processed);
  204. $emailMessage = $campaignItem->emailMessage;
  205. $this->assertEquals($marketingList->owner, $emailMessage->owner);
  206. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  207. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  208. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  209. $this->assertEquals($campaign->subject, $emailMessage->subject);
  210. $this->assertTrue(strpos($emailMessage->content->textContent, $campaign->textContent) !== false);
  211. $this->assertTrue(strpos($emailMessage->content->textContent, '/marketingLists/external/') !== false);
  212. $this->assertEquals(2, substr_count($emailMessage->content->textContent, '/marketingLists/external/'));
  213. $this->assertTrue(strpos($emailMessage->content->htmlContent, $campaign->htmlContent) !== false);
  214. $this->assertTrue(strpos($emailMessage->content->htmlContent, '/marketingLists/external/') !== false);
  215. $this->assertEquals(2, substr_count($emailMessage->content->htmlContent, '/marketingLists/external/'));
  216. $this->assertEquals('support@zurmo.com', $emailMessage->sender->fromAddress);
  217. $this->assertEquals('Support Team', $emailMessage->sender->fromName);
  218. $this->assertEquals(1, $emailMessage->recipients->count());
  219. $recipients = $emailMessage->recipients;
  220. $this->assertEquals(strval($contact), $recipients[0]->toName);
  221. $this->assertEquals($email->emailAddress, $recipients[0]->toAddress);
  222. $this->assertEquals(EmailMessageRecipient::TYPE_TO, $recipients[0]->type);
  223. $this->assertEquals($contact, $recipients[0]->personOrAccount);
  224. $headersArray = array('zurmoItemId' => $campaignItem->id,
  225. 'zurmoItemClass' => get_class($campaignItem),
  226. 'zurmoPersonId' => $contact->getClassId('Person'));
  227. $expectedHeaders = serialize($headersArray);
  228. $this->assertEquals($expectedHeaders, $emailMessage->headers);
  229. }
  230. /**
  231. * @depends testProcessDueCampaignItemDoesNotThrowExceptionWhenContactHasNoPrimaryEmail
  232. */
  233. public function testProcessDueCampaignItemWithCustomFromAddressAndFromName()
  234. {
  235. $email = new Email();
  236. $email->emailAddress = 'demo@zurmo.com';
  237. $contact = ContactTestHelper::createContactByNameForOwner('contact 04', $this->user);
  238. $contact->primaryEmail = $email;
  239. $this->assertTrue($contact->save());
  240. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 04',
  241. 'description',
  242. 'CustomFromName',
  243. 'custom@from.com');
  244. $campaign = CampaignTestHelper::createCampaign('campaign 04',
  245. 'subject 04',
  246. 'text content',
  247. 'html content',
  248. null,
  249. null,
  250. null,
  251. null,
  252. null,
  253. 0,
  254. $marketingList);
  255. $processed = 0;
  256. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  257. CampaignItemsUtil::processDueItem($campaignItem);
  258. $this->assertEquals(1, $campaignItem->processed);
  259. $emailMessage = $campaignItem->emailMessage;
  260. $this->assertEquals($marketingList->owner, $emailMessage->owner);
  261. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  262. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  263. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  264. $this->assertEquals($campaign->subject, $emailMessage->subject);
  265. $this->assertTrue(strpos($emailMessage->content->textContent, $campaign->textContent) !== false);
  266. $this->assertTrue(strpos($emailMessage->content->textContent, '/marketingLists/external/') !== false);
  267. $this->assertEquals(2, substr_count($emailMessage->content->textContent, '/marketingLists/external/'));
  268. $this->assertTrue(strpos($emailMessage->content->htmlContent, $campaign->htmlContent) !== false);
  269. $this->assertTrue(strpos($emailMessage->content->htmlContent, '/marketingLists/external/') !== false);
  270. $this->assertEquals(2, substr_count($emailMessage->content->htmlContent, '/marketingLists/external/'));
  271. $this->assertEquals('support@zurmo.com', $emailMessage->sender->fromAddress);
  272. $this->assertEquals('Support Team', $emailMessage->sender->fromName);
  273. $this->assertEquals(1, $emailMessage->recipients->count());
  274. $recipients = $emailMessage->recipients;
  275. $this->assertEquals(strval($contact), $recipients[0]->toName);
  276. $this->assertEquals($email->emailAddress, $recipients[0]->toAddress);
  277. $this->assertEquals(EmailMessageRecipient::TYPE_TO, $recipients[0]->type);
  278. $this->assertEquals($contact, $recipients[0]->personOrAccount);
  279. $headersArray = array('zurmoItemId' => $campaignItem->id,
  280. 'zurmoItemClass' => get_class($campaignItem),
  281. 'zurmoPersonId' => $contact->getClassId('Person'));
  282. $expectedHeaders = serialize($headersArray);
  283. $this->assertEquals($expectedHeaders, $emailMessage->headers);
  284. }
  285. /**
  286. * @depends testProcessDueCampaignItemWithCustomFromAddressAndFromName
  287. */
  288. public function testProcessDueCampaignItemWithValidMergeTags()
  289. {
  290. $email = new Email();
  291. $email->emailAddress = 'demo@zurmo.com';
  292. $contact = ContactTestHelper::createContactByNameForOwner('contact 05', $this->user);
  293. $contact->primaryEmail = $email;
  294. $this->assertTrue($contact->save());
  295. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 05',
  296. 'description',
  297. 'CustomFromName',
  298. 'custom@from.com');
  299. $campaign = CampaignTestHelper::createCampaign('campaign 05',
  300. 'subject 05',
  301. 'Dr. [[FIRST^NAME]] [[LAST^NAME]]',
  302. '<b>[[LAST^NAME]]</b>, [[FIRST^NAME]]',
  303. null,
  304. null,
  305. null,
  306. null,
  307. null,
  308. null,
  309. $marketingList);
  310. $processed = 0;
  311. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  312. CampaignItemsUtil::processDueItem($campaignItem);
  313. $this->assertEquals(1, $campaignItem->processed);
  314. $emailMessage = $campaignItem->emailMessage;
  315. $this->assertEquals($marketingList->owner, $emailMessage->owner);
  316. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  317. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  318. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  319. $this->assertEquals($campaign->subject, $emailMessage->subject);
  320. $this->assertNotEquals($campaign->textContent, $emailMessage->content->textContent);
  321. $this->assertNotEquals($campaign->htmlContent, $emailMessage->content->htmlContent);
  322. $this->assertTrue(strpos($emailMessage->content->textContent, 'Dr. contact 05 contact 05son') !== false);
  323. $this->assertTrue(strpos($emailMessage->content->textContent, '/marketingLists/external/') !== false);
  324. $this->assertEquals(2, substr_count($emailMessage->content->textContent, '/marketingLists/external/'));
  325. $this->assertTrue(strpos($emailMessage->content->htmlContent, '<b>contact 05son</b>, contact 05') !== false);
  326. $this->assertTrue(strpos($emailMessage->content->htmlContent, '/marketingLists/external/') !== false);
  327. $this->assertEquals(2, substr_count($emailMessage->content->htmlContent, '/marketingLists/external/'));
  328. $this->assertEquals('support@zurmo.com', $emailMessage->sender->fromAddress);
  329. $this->assertEquals('Support Team', $emailMessage->sender->fromName);
  330. $this->assertEquals(1, $emailMessage->recipients->count());
  331. $recipients = $emailMessage->recipients;
  332. $this->assertEquals(strval($contact), $recipients[0]->toName);
  333. $this->assertEquals($email->emailAddress, $recipients[0]->toAddress);
  334. $this->assertEquals(EmailMessageRecipient::TYPE_TO, $recipients[0]->type);
  335. $this->assertEquals($contact, $recipients[0]->personOrAccount);
  336. $headersArray = array('zurmoItemId' => $campaignItem->id,
  337. 'zurmoItemClass' => get_class($campaignItem),
  338. 'zurmoPersonId' => $contact->getClassId('Person'));
  339. $expectedHeaders = serialize($headersArray);
  340. $this->assertEquals($expectedHeaders, $emailMessage->headers);
  341. }
  342. /**
  343. * @depends testProcessDueCampaignItemWithValidMergeTags
  344. */
  345. public function testProcessDueCampaignItemWithAttachments()
  346. {
  347. $email = new Email();
  348. $email->emailAddress = 'demo@zurmo.com';
  349. $contact = ContactTestHelper::createContactByNameForOwner('contact 06', $this->user);
  350. $contact->primaryEmail = $email;
  351. $this->assertTrue($contact->save());
  352. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 06',
  353. 'description',
  354. 'CustomFromName',
  355. 'custom@from.com');
  356. $campaign = CampaignTestHelper::createCampaign('campaign 06',
  357. 'subject 06',
  358. 'Dr. [[FIRST^NAME]] [[LAST^NAME]]',
  359. '<b>[[LAST^NAME]]</b>, [[FIRST^NAME]]',
  360. null,
  361. null,
  362. null,
  363. null,
  364. null,
  365. null,
  366. $marketingList);
  367. $fileNames = array('testImage.png', 'testZip.zip', 'testPDF.pdf');
  368. $files = array();
  369. foreach ($fileNames as $index => $fileName)
  370. {
  371. $file = ZurmoTestHelper::createFileModel($fileName);
  372. $files[$index]['name'] = $fileName;
  373. $files[$index]['type'] = $file->type;
  374. $files[$index]['size'] = $file->size;
  375. $files[$index]['contents'] = $file->fileContent->content;
  376. $campaign->files->add($file);
  377. }
  378. $this->assertTrue($campaign->save());
  379. $processed = 0;
  380. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  381. CampaignItemsUtil::processDueItem($campaignItem);
  382. $this->assertEquals(1, $campaignItem->processed);
  383. $emailMessage = $campaignItem->emailMessage;
  384. $this->assertEquals($marketingList->owner, $emailMessage->owner);
  385. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  386. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  387. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  388. $this->assertEquals($campaign->subject, $emailMessage->subject);
  389. $this->assertNotEquals($campaign->textContent, $emailMessage->content->textContent);
  390. $this->assertNotEquals($campaign->htmlContent, $emailMessage->content->htmlContent);
  391. $this->assertTrue(strpos($emailMessage->content->textContent, 'Dr. contact 06 contact 06son') !== false);
  392. $this->assertTrue(strpos($emailMessage->content->textContent, '/marketingLists/external/') !== false);
  393. $this->assertEquals(2, substr_count($emailMessage->content->textContent, '/marketingLists/external/'));
  394. $this->assertTrue(strpos($emailMessage->content->htmlContent, '<b>contact 06son</b>, contact 06') !== false);
  395. $this->assertTrue(strpos($emailMessage->content->htmlContent, '/marketingLists/external/') !== false);
  396. $this->assertEquals(2, substr_count($emailMessage->content->htmlContent, '/marketingLists/external/'));
  397. $this->assertEquals('support@zurmo.com', $emailMessage->sender->fromAddress);
  398. $this->assertEquals('Support Team', $emailMessage->sender->fromName);
  399. $this->assertEquals(1, $emailMessage->recipients->count());
  400. $recipients = $emailMessage->recipients;
  401. $this->assertEquals(strval($contact), $recipients[0]->toName);
  402. $this->assertEquals($email->emailAddress, $recipients[0]->toAddress);
  403. $this->assertEquals(EmailMessageRecipient::TYPE_TO, $recipients[0]->type);
  404. $this->assertEquals($contact, $recipients[0]->personOrAccount);
  405. $this->assertNotEmpty($emailMessage->files);
  406. $this->assertCount(count($files), $emailMessage->files);
  407. foreach ($files as $index => $file)
  408. {
  409. $this->assertEquals($files[$index]['name'], $emailMessage->files[$index]->name);
  410. $this->assertEquals($files[$index]['type'], $emailMessage->files[$index]->type);
  411. $this->assertEquals($files[$index]['size'], $emailMessage->files[$index]->size);
  412. $this->assertEquals($files[$index]['contents'], $emailMessage->files[$index]->fileContent->content);
  413. }
  414. $headersArray = array('zurmoItemId' => $campaignItem->id,
  415. 'zurmoItemClass' => get_class($campaignItem),
  416. 'zurmoPersonId' => $contact->getClassId('Person'));
  417. $expectedHeaders = serialize($headersArray);
  418. $this->assertEquals($expectedHeaders, $emailMessage->headers);
  419. }
  420. /**
  421. * @depends testProcessDueCampaignItemWithAttachments
  422. */
  423. public function testGenerateCampaignItemsForDueCampaigns()
  424. {
  425. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 07');
  426. $marketingListId = $marketingList->id;
  427. $contact1 = ContactTestHelper::createContactByNameForOwner('campaignContact 01', $this->user);
  428. $contact2 = ContactTestHelper::createContactByNameForOwner('campaignContact 02', $this->user);
  429. $contact3 = ContactTestHelper::createContactByNameForOwner('campaignContact 03', $this->user);
  430. $contact4 = ContactTestHelper::createContactByNameForOwner('campaignContact 04', $this->user);
  431. $contact5 = ContactTestHelper::createContactByNameForOwner('campaignContact 05', $this->user);
  432. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact1);
  433. MarketingListMemberTestHelper::createMarketingListMember(1, $marketingList, $contact2);
  434. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact3);
  435. MarketingListMemberTestHelper::createMarketingListMember(1, $marketingList, $contact4);
  436. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact5);
  437. $marketingList->forgetAll();
  438. $marketingList = MarketingList::getById($marketingListId);
  439. $campaign = CampaignTestHelper::createCampaign('campaign 07',
  440. 'subject 07',
  441. 'text 07',
  442. 'html 07',
  443. null,
  444. null,
  445. null,
  446. null,
  447. null,
  448. null,
  449. $marketingList);
  450. $this->assertNotNull($campaign);
  451. $campaign->forgetAll();
  452. $campaignId = $campaign->id;
  453. $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId);
  454. $this->assertEmpty($campaignItems);
  455. //Process open campaigns.
  456. $this->assertTrue(CampaignItemsUtil::generateCampaignItemsForDueCampaigns(null, 50));
  457. $campaign = Campaign::getById($campaignId);
  458. $this->assertNotNull($campaign);
  459. $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status);
  460. $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId);
  461. $this->assertNotEmpty($campaignItems);
  462. $this->assertCount(5, $campaignItems);
  463. // TODO: @Shoaibi: Medium: Add tests for the other campaign type.
  464. }
  465. /**
  466. * @depends testGenerateCampaignItemsForDueCampaigns
  467. */
  468. public function testGenerateCampaignItemsForDueCampaignsWithCustomBatchSize()
  469. {
  470. $contactIds = array();
  471. $marketingListIds = array();
  472. $campaignIds = array();
  473. for ($index = 6; $index < 9; $index++)
  474. {
  475. $contact = ContactTestHelper::createContactByNameForOwner('campaignContact 0' . $index,
  476. $this->user);
  477. $contactIds[] = $contact->id;
  478. $contact->forgetAll();
  479. }
  480. for ($index = 8; $index < 12; $index++)
  481. {
  482. $suffix = $index;
  483. if ($index < 10)
  484. {
  485. $suffix = "0${suffix}";
  486. }
  487. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList ' . $suffix);
  488. $marketingListId = $marketingList->id;
  489. $marketingListIds[] = $marketingListId;
  490. foreach ($contactIds as $contactId)
  491. {
  492. $contact = Contact::getById($contactId);
  493. $unsubscribed = (rand(10, 20) % 2);
  494. MarketingListMemberTestHelper::createMarketingListMember($unsubscribed, $marketingList, $contact);
  495. }
  496. $marketingList->forgetAll();
  497. $marketingList = MarketingList::getById($marketingListId);
  498. $campaignSuffix = substr($marketingList->name, -2);
  499. $campaign = CampaignTestHelper::createCampaign('campaign ' . $campaignSuffix,
  500. 'subject ' . $campaignSuffix,
  501. 'text ' . $campaignSuffix,
  502. 'html ' . $campaignSuffix,
  503. null,
  504. null,
  505. null,
  506. null,
  507. null,
  508. null,
  509. $marketingList);
  510. $this->assertNotNull($campaign);
  511. $campaignIds[] = $campaign->id;
  512. $campaign->forgetAll();
  513. }
  514. foreach ($campaignIds as $campaignId)
  515. {
  516. $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId);
  517. $this->assertEmpty($campaignItems);
  518. }
  519. $this->assertTrue(CampaignItemsUtil::generateCampaignItemsForDueCampaigns(5));
  520. foreach ($campaignIds as $index => $campaignId)
  521. {
  522. $campaign = Campaign::getById($campaignId);
  523. $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId);
  524. if ($index === 0)
  525. {
  526. $expectedCount = AutoresponderOrCampaignBatchSizeConfigUtil::getBatchSize();
  527. $memberCount = count($campaign->marketingList->marketingListMembers);
  528. if ($memberCount < $expectedCount)
  529. {
  530. $expectedCount = $memberCount;
  531. }
  532. $this->assertNotEmpty($campaignItems);
  533. $this->assertCount($expectedCount, $campaignItems);
  534. $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status);
  535. }
  536. else
  537. {
  538. $this->assertEmpty($campaignItems);
  539. $this->assertEquals(Campaign::STATUS_ACTIVE, $campaign->status);
  540. }
  541. }
  542. $this->assertTrue(CampaignItemsUtil::generateCampaignItemsForDueCampaigns());
  543. foreach ($campaignIds as $index => $campaignId)
  544. {
  545. $campaign = Campaign::getById($campaignId);
  546. $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId);
  547. if ($index < 2)
  548. {
  549. $expectedCount = AutoresponderOrCampaignBatchSizeConfigUtil::getBatchSize();
  550. $memberCount = count($campaign->marketingList->marketingListMembers);
  551. if ($memberCount < $expectedCount)
  552. {
  553. $expectedCount = $memberCount;
  554. }
  555. $this->assertNotEmpty($campaignItems);
  556. $this->assertCount($expectedCount, $campaignItems);
  557. $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status);
  558. }
  559. else
  560. {
  561. $this->assertEmpty($campaignItems);
  562. $this->assertEquals(Campaign::STATUS_ACTIVE, $campaign->status);
  563. }
  564. }
  565. // TODO: @Shoaibi: Medium: Add tests for the other campaign type.
  566. }
  567. /**
  568. * @depends testGenerateCampaignItemsForDueCampaignsWithCustomBatchSize
  569. */
  570. public function testProcessDueCampaignItemWithOptout()
  571. {
  572. $email = new Email();
  573. $email->emailAddress = 'demo@zurmo.com';
  574. $email->optOut = true;
  575. $contact = ContactTestHelper::createContactByNameForOwner('contact 08', $this->user);
  576. $contact->primaryEmail = $email;
  577. $this->assertTrue($contact->save());
  578. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 08',
  579. 'description',
  580. 'CustomFromName',
  581. 'custom@from.com');
  582. $campaign = CampaignTestHelper::createCampaign('campaign 08',
  583. 'subject 08',
  584. 'Dr. [[FIRST^NAME]] [[LAST^NAME]]',
  585. '<b>[[LAST^NAME]]</b>, [[FIRST^NAME]]',
  586. null,
  587. null,
  588. null,
  589. null,
  590. null,
  591. null,
  592. $marketingList);
  593. $processed = 0;
  594. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  595. CampaignItemsUtil::processDueItem($campaignItem);
  596. $this->assertEquals(1, $campaignItem->processed);
  597. $personId = $contact->getClassId('Person');
  598. $activities = CampaignItemActivity::getByTypeAndModelIdAndPersonIdAndUrl(
  599. CampaignItemActivity::TYPE_SKIP,
  600. $campaignItem->id,
  601. $personId);
  602. $this->assertNotEmpty($activities);
  603. $this->assertCount(1, $activities);
  604. }
  605. /**
  606. * @depends testProcessDueCampaignItemWithOptout
  607. */
  608. public function testProcessDueCampaignItemWithReturnPathHeaders()
  609. {
  610. ZurmoConfigurationUtil::setByModuleName('EmailMessagesModule', 'bounceReturnPath', 'bounce@zurmo.com');
  611. $email = new Email();
  612. $email->emailAddress = 'demo@zurmo.com';
  613. $contact = ContactTestHelper::createContactByNameForOwner('contact 09', $this->user);
  614. $contact->primaryEmail = $email;
  615. $this->assertTrue($contact->save());
  616. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 09',
  617. 'description',
  618. 'CustomFromName',
  619. 'custom@from.com');
  620. $campaign = CampaignTestHelper::createCampaign('campaign 09',
  621. 'subject 09',
  622. 'Dr. [[FIRST^NAME]] [[LAST^NAME]]',
  623. '<b>[[LAST^NAME]]</b>, [[FIRST^NAME]]',
  624. null,
  625. null,
  626. null,
  627. null,
  628. null,
  629. null,
  630. $marketingList);
  631. $processed = 0;
  632. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  633. CampaignItemsUtil::processDueItem($campaignItem);
  634. $this->assertEquals(1, $campaignItem->processed);
  635. $emailMessage = $campaignItem->emailMessage;
  636. $this->assertEquals($marketingList->owner, $emailMessage->owner);
  637. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  638. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  639. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  640. $this->assertEquals($campaign->subject, $emailMessage->subject);
  641. $this->assertNotEquals($campaign->textContent, $emailMessage->content->textContent);
  642. $this->assertNotEquals($campaign->htmlContent, $emailMessage->content->htmlContent);
  643. $this->assertTrue(strpos($emailMessage->content->textContent, 'Dr. contact 09 contact 09son') !== false);
  644. $this->assertTrue(strpos($emailMessage->content->textContent, '/marketingLists/external/') !== false);
  645. $this->assertEquals(2, substr_count($emailMessage->content->textContent, '/marketingLists/external/'));
  646. $this->assertTrue(strpos($emailMessage->content->htmlContent, '<b>contact 09son</b>, contact 09') !== false);
  647. $this->assertTrue(strpos($emailMessage->content->htmlContent, '/marketingLists/external/') !== false);
  648. $this->assertEquals(2, substr_count($emailMessage->content->htmlContent, '/marketingLists/external/'));
  649. $this->assertEquals('support@zurmo.com', $emailMessage->sender->fromAddress);
  650. $this->assertEquals('Support Team', $emailMessage->sender->fromName);
  651. $this->assertEquals(1, $emailMessage->recipients->count());
  652. $recipients = $emailMessage->recipients;
  653. $this->assertEquals(strval($contact), $recipients[0]->toName);
  654. $this->assertEquals($email->emailAddress, $recipients[0]->toAddress);
  655. $this->assertEquals(EmailMessageRecipient::TYPE_TO, $recipients[0]->type);
  656. $this->assertEquals($contact, $recipients[0]->personOrAccount);
  657. $headersArray = array('zurmoItemId' => $campaignItem->id,
  658. 'zurmoItemClass' => get_class($campaignItem),
  659. 'zurmoPersonId' => $contact->getClassId('Person'),
  660. 'Return-Path' => 'bounce@zurmo.com');
  661. $expectedHeaders = serialize($headersArray);
  662. $this->assertEquals($expectedHeaders, $emailMessage->headers);
  663. }
  664. /**
  665. * @depends testProcessDueCampaignItemWithReturnPathHeaders
  666. */
  667. public function testProcessDueCampaignItemWithoutHtmlContent()
  668. {
  669. $email = new Email();
  670. $email->emailAddress = 'demo10@zurmo.com';
  671. $contact = ContactTestHelper::createContactByNameForOwner('contact 10', $this->user);
  672. $contact->primaryEmail = $email;
  673. $this->assertTrue($contact->save());
  674. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 10',
  675. 'description',
  676. 'CustomFromName',
  677. 'custom@from.com');
  678. $campaign = CampaignTestHelper::createCampaign('campaign 10',
  679. 'subject 10',
  680. 'Dr. [[FIRST^NAME]] [[LAST^NAME]]',
  681. null,
  682. null,
  683. null,
  684. null,
  685. null,
  686. null,
  687. null,

Large files files are truncated, but you can click here to view the full file