PageRenderTime 25ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

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

https://bitbucket.org/zurmo/zurmo/
PHP | 991 lines | 857 code | 27 blank | 107 comment | 1 complexity | 6d32f43d2ee94677b38f01245ddcfeb5 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, GPL-2.0, LGPL-3.0, LGPL-2.1, BSD-2-Clause
  1. <?php
  2. /*********************************************************************************
  3. * Zurmo is a customer relationship management program developed by
  4. * Zurmo, Inc. Copyright (C) 2015 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. 2015. All rights reserved".
  35. ********************************************************************************/
  36. class CampaignItemsUtilTest extends AutoresponderOrCampaignBaseTest
  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. }
  46. public function setUp()
  47. {
  48. parent::setUp();
  49. $this->user = User::getByUsername('super');
  50. Yii::app()->user->userModel = $this->user;
  51. Campaign::deleteAll();
  52. }
  53. /**
  54. * Do not throw exception. That means it passes
  55. */
  56. public function testProcessDueCampaignItemThrowsExceptionWhenContentHasInvalidMergeTagsForOnlyHtml()
  57. {
  58. $html = "[[FIRST^NAME]], You are receiving this email";
  59. $text = null;
  60. $contact = ContactTestHelper::createContactByNameForOwner('contact 01', $this->user);
  61. $marketingList = MarketingListTestHelper::populateMarketingListByName('marketingList 01');
  62. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  63. $campaign = CampaignTestHelper::createCampaign('campaign 01',
  64. 'subject 01',
  65. $text,
  66. $html,
  67. null,
  68. null,
  69. null,
  70. null,
  71. null,
  72. null,
  73. $marketingList,
  74. false);
  75. $processed = 0;
  76. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  77. $this->processDueItem($campaignItem);
  78. }
  79. /**
  80. * @depends testProcessDueCampaignItemThrowsExceptionWhenContentHasInvalidMergeTagsForOnlyHtml
  81. * Do not throw exception. That means it passes
  82. */
  83. public function testProcessDueCampaignItemThrowsExceptionWhenContentHasInvalidMergeTagsForOnlyText()
  84. {
  85. $text = "[[FIRST^NAME]], You are receiving this email";
  86. $html = null;
  87. $contact = ContactTestHelper::createContactByNameForOwner('contact 01', $this->user);
  88. $marketingList = MarketingListTestHelper::populateMarketingListByName('marketingList 01');
  89. $campaign = CampaignTestHelper::createCampaign('campaign 01',
  90. 'subject 01',
  91. $text,
  92. $html,
  93. null,
  94. null,
  95. null,
  96. null,
  97. null,
  98. null,
  99. $marketingList,
  100. false);
  101. $processed = 0;
  102. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  103. $this->processDueItem($campaignItem);
  104. }
  105. /**
  106. * @depends testProcessDueCampaignItemThrowsExceptionWhenContentHasInvalidMergeTagsForOnlyText
  107. * @expectedException NotFoundException
  108. */
  109. public function testProcessDueCampaignItemThrowsExceptionWhenNoContactIsAvailable()
  110. {
  111. $campaignItem = new CampaignItem();
  112. $this->processDueItem($campaignItem);
  113. }
  114. /**
  115. * @depends testProcessDueCampaignItemThrowsExceptionWhenNoContactIsAvailable
  116. * @expectedException NotSupportedException
  117. * @expectedExceptionMessage Provided content contains few invalid merge tags
  118. */
  119. public function testProcessDueCampaignItemThrowsExceptionWhenContentHasInvalidMergeTags()
  120. {
  121. $contact = ContactTestHelper::createContactByNameForOwner('contact 01', $this->user);
  122. $marketingList = MarketingListTestHelper::populateMarketingListByName('marketingList 01');
  123. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  124. $campaign = CampaignTestHelper::createCampaign('campaign 01',
  125. 'subject 01',
  126. '[[TEXT^CONTENT]]',
  127. '[[HTML^CONTENT]]',
  128. null,
  129. null,
  130. null,
  131. null,
  132. null,
  133. null,
  134. $marketingList,
  135. false);
  136. $processed = 0;
  137. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  138. $this->processDueItem($campaignItem);
  139. }
  140. /**
  141. * @depends testProcessDueCampaignItemThrowsExceptionWhenContentHasInvalidMergeTags
  142. */
  143. public function testProcessDueCampaignItemDoesNotThrowExceptionWhenContactHasNoPrimaryEmail()
  144. {
  145. $contact = ContactTestHelper::createContactByNameForOwner('contact 02', $this->user);
  146. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 02');
  147. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  148. $campaign = CampaignTestHelper::createCampaign('campaign 02',
  149. 'subject 02',
  150. 'text content',
  151. 'html content',
  152. null,
  153. null,
  154. null,
  155. null,
  156. null,
  157. 0,
  158. $marketingList);
  159. $processed = 0;
  160. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  161. $this->processDueItem($campaignItem);
  162. $this->assertEquals(1, $campaignItem->processed);
  163. $emailMessage = $campaignItem->emailMessage;
  164. $this->assertEquals($marketingList->owner->id, $emailMessage->owner->id);
  165. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  166. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  167. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  168. $this->assertNull($emailMessage->subject);
  169. $this->assertNull($emailMessage->content->textContent);
  170. $this->assertNull($emailMessage->content->htmlContent);
  171. $this->assertNull($emailMessage->sender->fromAddress);
  172. $this->assertNull($emailMessage->sender->fromName);
  173. $this->assertEquals(0, $emailMessage->recipients->count());
  174. //Test with empty primary email address
  175. $contact->primaryEmail->emailAddress = '';
  176. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  177. $this->processDueItem($campaignItem);
  178. $this->assertEquals(1, $campaignItem->processed);
  179. $emailMessage = $campaignItem->emailMessage;
  180. $this->assertEquals($marketingList->owner->id, $emailMessage->owner->id);
  181. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  182. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  183. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  184. $this->assertNull($emailMessage->subject);
  185. $this->assertNull($emailMessage->content->textContent);
  186. $this->assertNull($emailMessage->content->htmlContent);
  187. $this->assertNull($emailMessage->sender->fromAddress);
  188. $this->assertNull($emailMessage->sender->fromName);
  189. $this->assertEquals(0, $emailMessage->recipients->count());
  190. }
  191. /**
  192. * @depends testProcessDueCampaignItemDoesNotThrowExceptionWhenContactHasNoPrimaryEmail
  193. */
  194. public function testProcessDueCampaignItemDoesNotThrowExceptionWhenContactHasPrimaryEmail()
  195. {
  196. $email = new Email();
  197. $email->emailAddress = 'demo@zurmo.com';
  198. $contact = ContactTestHelper::createContactByNameForOwner('contact 03', $this->user);
  199. $contact->primaryEmail = $email;
  200. $this->assertTrue($contact->save());
  201. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 03');
  202. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  203. $campaign = CampaignTestHelper::createCampaign('campaign 03',
  204. 'subject 03',
  205. 'text content',
  206. 'html content',
  207. null,
  208. null,
  209. null,
  210. null,
  211. null,
  212. null,
  213. $marketingList);
  214. $processed = 0;
  215. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  216. $this->processDueItem($campaignItem);
  217. $this->assertEquals(1, $campaignItem->processed);
  218. $emailMessage = $campaignItem->emailMessage;
  219. $this->assertEquals($marketingList->owner->id, $emailMessage->owner->id);
  220. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  221. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  222. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  223. $this->assertEquals($campaign->subject, $emailMessage->subject);
  224. $this->assertContains($campaign->textContent, $emailMessage->content->textContent);
  225. $this->assertContains('/marketingLists/external/', $emailMessage->content->textContent);
  226. $this->assertEquals(2, substr_count($emailMessage->content->textContent, '/marketingLists/external/'));
  227. $this->assertContains($campaign->htmlContent, $emailMessage->content->htmlContent);
  228. $this->assertContains('/marketingLists/external/', $emailMessage->content->htmlContent);
  229. $this->assertEquals(2, substr_count($emailMessage->content->htmlContent, '/marketingLists/external/'));
  230. $this->assertEquals('support@zurmo.com', $emailMessage->sender->fromAddress);
  231. $this->assertEquals('Support Team', $emailMessage->sender->fromName);
  232. $this->assertEquals(1, $emailMessage->recipients->count());
  233. $recipients = $emailMessage->recipients;
  234. $this->assertEquals(strval($contact), $recipients[0]->toName);
  235. $this->assertEquals($email->emailAddress, $recipients[0]->toAddress);
  236. $this->assertEquals(EmailMessageRecipient::TYPE_TO, $recipients[0]->type);
  237. $this->assertEquals($contact->getClassId('Item'), $recipients[0]->personsOrAccounts[0]->id);
  238. $headersArray = array('zurmoItemId' => $campaignItem->id,
  239. 'zurmoItemClass' => get_class($campaignItem),
  240. 'zurmoPersonId' => $contact->getClassId('Person'));
  241. $expectedHeaders = serialize($headersArray);
  242. $this->assertEquals($expectedHeaders, $emailMessage->headers);
  243. }
  244. /**
  245. * @depends testProcessDueCampaignItemDoesNotThrowExceptionWhenContactHasNoPrimaryEmail
  246. */
  247. public function testProcessDueCampaignItemWithCustomFromAddressAndFromName()
  248. {
  249. $email = new Email();
  250. $email->emailAddress = 'demo@zurmo.com';
  251. $contact = ContactTestHelper::createContactByNameForOwner('contact 04', $this->user);
  252. $contact->primaryEmail = $email;
  253. $this->assertTrue($contact->save());
  254. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 04',
  255. 'description',
  256. 'CustomFromName',
  257. 'custom@from.com');
  258. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  259. $campaign = CampaignTestHelper::createCampaign('campaign 04',
  260. 'subject 04',
  261. 'text content',
  262. 'html content',
  263. null,
  264. null,
  265. null,
  266. null,
  267. null,
  268. 0,
  269. $marketingList);
  270. $processed = 0;
  271. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  272. $this->processDueItem($campaignItem);
  273. $this->assertEquals(1, $campaignItem->processed);
  274. $emailMessage = $campaignItem->emailMessage;
  275. $this->assertEquals($marketingList->owner->id, $emailMessage->owner->id);
  276. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  277. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  278. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  279. $this->assertEquals($campaign->subject, $emailMessage->subject);
  280. $this->assertContains($campaign->textContent, $emailMessage->content->textContent);
  281. $this->assertContains('/marketingLists/external/', $emailMessage->content->textContent);
  282. $this->assertEquals(2, substr_count($emailMessage->content->textContent, '/marketingLists/external/'));
  283. $this->assertContains($campaign->htmlContent, $emailMessage->content->htmlContent);
  284. $this->assertContains('/marketingLists/external/', $emailMessage->content->htmlContent);
  285. $this->assertEquals(2, substr_count($emailMessage->content->htmlContent, '/marketingLists/external/'));
  286. $this->assertEquals('support@zurmo.com', $emailMessage->sender->fromAddress);
  287. $this->assertEquals('Support Team', $emailMessage->sender->fromName);
  288. $this->assertEquals(1, $emailMessage->recipients->count());
  289. $recipients = $emailMessage->recipients;
  290. $this->assertEquals(strval($contact), $recipients[0]->toName);
  291. $this->assertEquals($email->emailAddress, $recipients[0]->toAddress);
  292. $this->assertEquals(EmailMessageRecipient::TYPE_TO, $recipients[0]->type);
  293. $this->assertEquals($contact->getClassId('Item'), $recipients[0]->personsOrAccounts[0]->id);
  294. $headersArray = array('zurmoItemId' => $campaignItem->id,
  295. 'zurmoItemClass' => get_class($campaignItem),
  296. 'zurmoPersonId' => $contact->getClassId('Person'));
  297. $expectedHeaders = serialize($headersArray);
  298. $this->assertEquals($expectedHeaders, $emailMessage->headers);
  299. }
  300. /**
  301. * @depends testProcessDueCampaignItemWithCustomFromAddressAndFromName
  302. */
  303. public function testProcessDueCampaignItemWithValidMergeTags()
  304. {
  305. $email = new Email();
  306. $email->emailAddress = 'demo@zurmo.com';
  307. $contact = ContactTestHelper::createContactByNameForOwner('contact 05', $this->user);
  308. $contact->primaryEmail = $email;
  309. $this->assertTrue($contact->save());
  310. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 05',
  311. 'description',
  312. 'CustomFromName',
  313. 'custom@from.com');
  314. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  315. $campaign = CampaignTestHelper::createCampaign('campaign 05',
  316. 'subject 05',
  317. 'Dr. [[FIRST^NAME]] [[LAST^NAME]]',
  318. '<b>[[LAST^NAME]]</b>, [[FIRST^NAME]]',
  319. null,
  320. null,
  321. null,
  322. null,
  323. null,
  324. null,
  325. $marketingList);
  326. $processed = 0;
  327. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  328. $this->processDueItem($campaignItem);
  329. $this->assertEquals(1, $campaignItem->processed);
  330. $emailMessage = $campaignItem->emailMessage;
  331. $this->assertEquals($marketingList->owner->id, $emailMessage->owner->id);
  332. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  333. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  334. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  335. $this->assertEquals($campaign->subject, $emailMessage->subject);
  336. $this->assertNotEquals($campaign->textContent, $emailMessage->content->textContent);
  337. $this->assertNotEquals($campaign->htmlContent, $emailMessage->content->htmlContent);
  338. $this->assertContains('Dr. contact 05 contact 05son', $emailMessage->content->textContent);
  339. $this->assertContains('/marketingLists/external/', $emailMessage->content->textContent);
  340. $this->assertEquals(2, substr_count($emailMessage->content->textContent, '/marketingLists/external/'));
  341. $this->assertContains('<b>contact 05son</b>, contact 05', $emailMessage->content->htmlContent);
  342. $this->assertContains('/marketingLists/external/', $emailMessage->content->htmlContent);
  343. $this->assertEquals(2, substr_count($emailMessage->content->htmlContent, '/marketingLists/external/'));
  344. $this->assertEquals('support@zurmo.com', $emailMessage->sender->fromAddress);
  345. $this->assertEquals('Support Team', $emailMessage->sender->fromName);
  346. $this->assertEquals(1, $emailMessage->recipients->count());
  347. $recipients = $emailMessage->recipients;
  348. $this->assertEquals(strval($contact), $recipients[0]->toName);
  349. $this->assertEquals($email->emailAddress, $recipients[0]->toAddress);
  350. $this->assertEquals(EmailMessageRecipient::TYPE_TO, $recipients[0]->type);
  351. $this->assertEquals($contact->getClassId('Item'), $recipients[0]->personsOrAccounts[0]->id);
  352. $headersArray = array('zurmoItemId' => $campaignItem->id,
  353. 'zurmoItemClass' => get_class($campaignItem),
  354. 'zurmoPersonId' => $contact->getClassId('Person'));
  355. $expectedHeaders = serialize($headersArray);
  356. $this->assertEquals($expectedHeaders, $emailMessage->headers);
  357. }
  358. /**
  359. * @//depends testProcessDueCampaignItemWithValidMergeTags
  360. */
  361. public function testProcessDueCampaignItemWithAttachments()
  362. {
  363. $email = new Email();
  364. $email->emailAddress = 'demo@zurmo.com';
  365. $contact = ContactTestHelper::createContactByNameForOwner('contact 06', $this->user);
  366. $contact->primaryEmail = $email;
  367. $this->assertTrue($contact->save());
  368. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 06',
  369. 'description',
  370. 'CustomFromName',
  371. 'custom@from.com');
  372. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  373. $campaign = CampaignTestHelper::createCampaign('campaign 06',
  374. 'subject 06',
  375. 'Dr. [[FIRST^NAME]] [[LAST^NAME]]',
  376. '<b>[[LAST^NAME]]</b>, [[FIRST^NAME]]',
  377. null,
  378. null,
  379. null,
  380. null,
  381. null,
  382. null,
  383. $marketingList);
  384. $fileNames = array('testImage.png', 'testZip.zip', 'testPDF.pdf');
  385. $files = array();
  386. foreach ($fileNames as $index => $fileName)
  387. {
  388. $file = ZurmoTestHelper::createFileModel($fileName);
  389. $files[$index]['name'] = $fileName;
  390. $files[$index]['type'] = $file->type;
  391. $files[$index]['size'] = $file->size;
  392. $files[$index]['contents'] = $file->fileContent->content;
  393. $campaign->files->add($file);
  394. }
  395. $this->assertTrue($campaign->save());
  396. $processed = 0;
  397. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  398. $this->processDueItem($campaignItem);
  399. $this->assertEquals(1, $campaignItem->processed);
  400. $emailMessage = $campaignItem->emailMessage;
  401. $this->assertEquals($marketingList->owner->id, $emailMessage->owner->id);
  402. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  403. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  404. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  405. $this->assertEquals($campaign->subject, $emailMessage->subject);
  406. $this->assertNotEquals($campaign->textContent, $emailMessage->content->textContent);
  407. $this->assertNotEquals($campaign->htmlContent, $emailMessage->content->htmlContent);
  408. $this->assertContains('Dr. contact 06 contact 06son', $emailMessage->content->textContent);
  409. $this->assertContains('/marketingLists/external/', $emailMessage->content->textContent);
  410. $this->assertEquals(2, substr_count($emailMessage->content->textContent, '/marketingLists/external/'));
  411. $this->assertContains('<b>contact 06son</b>, contact 06', $emailMessage->content->htmlContent);
  412. $this->assertContains('/marketingLists/external/', $emailMessage->content->htmlContent);
  413. $this->assertEquals(2, substr_count($emailMessage->content->htmlContent, '/marketingLists/external/'));
  414. $this->assertEquals('support@zurmo.com', $emailMessage->sender->fromAddress);
  415. $this->assertEquals('Support Team', $emailMessage->sender->fromName);
  416. $this->assertEquals(1, $emailMessage->recipients->count());
  417. $recipients = $emailMessage->recipients;
  418. $this->assertEquals(strval($contact), $recipients[0]->toName);
  419. $this->assertEquals($email->emailAddress, $recipients[0]->toAddress);
  420. $this->assertEquals(EmailMessageRecipient::TYPE_TO, $recipients[0]->type);
  421. $this->assertEquals($contact->getClassId('Item'), $recipients[0]->personsOrAccounts[0]->id);
  422. $this->assertNotEmpty($emailMessage->files);
  423. $this->assertCount(count($files), $emailMessage->files);
  424. foreach ($campaign->files as $index => $file)
  425. {
  426. $this->assertEquals($file->name, $emailMessage->files[$index]->name);
  427. $this->assertEquals($file->type, $emailMessage->files[$index]->type);
  428. $this->assertEquals($file->size, $emailMessage->files[$index]->size);
  429. //CampaingItem should share the Attachments content from Campaign
  430. $this->assertEquals($file->fileContent->content, $emailMessage->files[$index]->fileContent->content);
  431. }
  432. $headersArray = array('zurmoItemId' => $campaignItem->id,
  433. 'zurmoItemClass' => get_class($campaignItem),
  434. 'zurmoPersonId' => $contact->getClassId('Person'));
  435. $expectedHeaders = serialize($headersArray);
  436. $this->assertEquals($expectedHeaders, $emailMessage->headers);
  437. }
  438. /**
  439. * @depends testProcessDueCampaignItemWithAttachments
  440. */
  441. public function testGenerateCampaignItemsForDueCampaigns()
  442. {
  443. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 07');
  444. $marketingListId = $marketingList->id;
  445. for ($i = 0; $i < 5; $i++)
  446. {
  447. $contact = ContactTestHelper::createContactByNameForOwner('campaignContact ' . $i, $this->user);
  448. MarketingListMemberTestHelper::createMarketingListMember($i % 2, $marketingList, $contact);
  449. }
  450. $marketingList->forgetAll();
  451. $marketingList = MarketingList::getById($marketingListId);
  452. $campaign = CampaignTestHelper::createCampaign('campaign 07',
  453. 'subject 07',
  454. 'text 07',
  455. 'html 07',
  456. null,
  457. null,
  458. null,
  459. null,
  460. null,
  461. null,
  462. $marketingList);
  463. $this->assertNotNull($campaign);
  464. $campaign->forgetAll();
  465. $campaignId = $campaign->id;
  466. $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId);
  467. $this->assertEmpty($campaignItems);
  468. //Process open campaigns.
  469. Yii::app()->jobQueue->deleteAll();
  470. $this->assertCount(0, Yii::app()->jobQueue->getAll());
  471. $util = new CampaignItemsUtil();
  472. $this->assertTrue($util->generateCampaignItemsForDueCampaigns());
  473. $jobs = Yii::app()->jobQueue->getAll();
  474. $this->assertCount(1, $jobs);
  475. $this->assertEquals('CampaignQueueMessagesInOutbox', $jobs[5][0]['jobType']);
  476. $campaign = Campaign::getById($campaignId);
  477. $this->assertNotNull($campaign);
  478. $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status);
  479. $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId);
  480. $this->assertNotEmpty($campaignItems);
  481. $this->assertCount(5, $campaignItems);
  482. // TODO: @Shoaibi: Low: Add tests for the other campaign type.
  483. }
  484. /**
  485. * @depends testGenerateCampaignItemsForDueCampaigns
  486. */
  487. public function testProcessDueCampaignItemWithOptout()
  488. {
  489. $email = new Email();
  490. $email->emailAddress = 'demo@zurmo.com';
  491. $email->optOut = true;
  492. $contact = ContactTestHelper::createContactByNameForOwner('contact 08', $this->user);
  493. $contact->primaryEmail = $email;
  494. $this->assertTrue($contact->save());
  495. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 08',
  496. 'description',
  497. 'CustomFromName',
  498. 'custom@from.com');
  499. $campaign = CampaignTestHelper::createCampaign('campaign 08',
  500. 'subject 08',
  501. 'Dr. [[FIRST^NAME]] [[LAST^NAME]]',
  502. '<b>[[LAST^NAME]]</b>, [[FIRST^NAME]]',
  503. null,
  504. null,
  505. null,
  506. null,
  507. null,
  508. null,
  509. $marketingList);
  510. $processed = 0;
  511. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  512. $this->processDueItem($campaignItem);
  513. $this->assertEquals(1, $campaignItem->processed);
  514. $personId = $contact->getClassId('Person');
  515. $activities = CampaignItemActivity::getByTypeAndModelIdAndPersonIdAndUrl(
  516. CampaignItemActivity::TYPE_SKIP,
  517. $campaignItem->id,
  518. $personId);
  519. $this->assertNotEmpty($activities);
  520. $this->assertCount(1, $activities);
  521. }
  522. /**
  523. * @depends testProcessDueCampaignItemWithOptout
  524. */
  525. public function testProcessDueCampaignItemWithReturnPathHeaders()
  526. {
  527. ZurmoConfigurationUtil::setByModuleName('EmailMessagesModule', 'bounceReturnPath', 'bounce@zurmo.com');
  528. $email = new Email();
  529. $email->emailAddress = 'demo@zurmo.com';
  530. $contact = ContactTestHelper::createContactByNameForOwner('contact 09', $this->user);
  531. $contact->primaryEmail = $email;
  532. $this->assertTrue($contact->save());
  533. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 09',
  534. 'description',
  535. 'CustomFromName',
  536. 'custom@from.com');
  537. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  538. $campaign = CampaignTestHelper::createCampaign('campaign 09',
  539. 'subject 09',
  540. 'Dr. [[FIRST^NAME]] [[LAST^NAME]]',
  541. '<b>[[LAST^NAME]]</b>, [[FIRST^NAME]]',
  542. null,
  543. null,
  544. null,
  545. null,
  546. null,
  547. null,
  548. $marketingList);
  549. $processed = 0;
  550. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  551. $this->processDueItem($campaignItem);
  552. $this->assertEquals(1, $campaignItem->processed);
  553. $emailMessage = $campaignItem->emailMessage;
  554. $this->assertEquals($marketingList->owner->id, $emailMessage->owner->id);
  555. $marketingListPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($marketingList);
  556. $emailMessagePermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem($emailMessage);
  557. $this->assertEquals($marketingListPermissions, $emailMessagePermissions);
  558. $this->assertEquals($campaign->subject, $emailMessage->subject);
  559. $this->assertNotEquals($campaign->textContent, $emailMessage->content->textContent);
  560. $this->assertNotEquals($campaign->htmlContent, $emailMessage->content->htmlContent);
  561. $this->assertContains('Dr. contact 09 contact 09son', $emailMessage->content->textContent);
  562. $this->assertContains('/marketingLists/external/', $emailMessage->content->textContent);
  563. $this->assertEquals(2, substr_count($emailMessage->content->textContent, '/marketingLists/external/'));
  564. $this->assertContains('<b>contact 09son</b>, contact 09', $emailMessage->content->htmlContent);
  565. $this->assertContains('/marketingLists/external/', $emailMessage->content->htmlContent);
  566. $this->assertEquals(2, substr_count($emailMessage->content->htmlContent, '/marketingLists/external/'));
  567. $this->assertEquals('support@zurmo.com', $emailMessage->sender->fromAddress);
  568. $this->assertEquals('Support Team', $emailMessage->sender->fromName);
  569. $this->assertEquals(1, $emailMessage->recipients->count());
  570. $recipients = $emailMessage->recipients;
  571. $this->assertEquals(strval($contact), $recipients[0]->toName);
  572. $this->assertEquals($email->emailAddress, $recipients[0]->toAddress);
  573. $this->assertEquals(EmailMessageRecipient::TYPE_TO, $recipients[0]->type);
  574. $this->assertEquals($contact->getClassId('Item'), $recipients[0]->personsOrAccounts[0]->id);
  575. $headersArray = array('zurmoItemId' => $campaignItem->id,
  576. 'zurmoItemClass' => get_class($campaignItem),
  577. 'zurmoPersonId' => $contact->getClassId('Person'),
  578. 'Return-Path' => 'bounce@zurmo.com');
  579. $expectedHeaders = serialize($headersArray);
  580. $this->assertEquals($expectedHeaders, $emailMessage->headers);
  581. }
  582. /**
  583. * @depends testProcessDueCampaignItemWithReturnPathHeaders
  584. */
  585. public function testProcessDueCampaignItemWithoutHtmlContent()
  586. {
  587. $email = new Email();
  588. $email->emailAddress = 'demo10@zurmo.com';
  589. $contact = ContactTestHelper::createContactByNameForOwner('contact 10', $this->user);
  590. $contact->primaryEmail = $email;
  591. $this->assertTrue($contact->save());
  592. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 10',
  593. 'description',
  594. 'CustomFromName',
  595. 'custom@from.com');
  596. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  597. $campaign = CampaignTestHelper::createCampaign('campaign 10',
  598. 'subject 10',
  599. 'Dr. [[FIRST^NAME]] [[LAST^NAME]]',
  600. null,
  601. null,
  602. null,
  603. false,
  604. null,
  605. null,
  606. null,
  607. $marketingList);
  608. $processed = 0;
  609. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  610. $this->processDueItem($campaignItem);
  611. $emailMessage = $campaignItem->emailMessage;
  612. $this->assertNotNull($emailMessage->content->textContent);
  613. $this->assertNull ($emailMessage->content->htmlContent);
  614. }
  615. /**
  616. * @depends testProcessDueCampaignItemWithoutHtmlContent
  617. */
  618. public function testProcessDueCampaignItemWithoutTextContent()
  619. {
  620. $email = new Email();
  621. $email->emailAddress = 'demo11@zurmo.com';
  622. $contact = ContactTestHelper::createContactByNameForOwner('contact 11', $this->user);
  623. $contact->primaryEmail = $email;
  624. $this->assertTrue($contact->save());
  625. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 11',
  626. 'description',
  627. 'CustomFromName',
  628. 'custom@from.com');
  629. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  630. $campaign = CampaignTestHelper::createCampaign('campaign 11',
  631. 'subject 11',
  632. null,
  633. '<b>[[LAST^NAME]]</b>, [[FIRST^NAME]]',
  634. null,
  635. null,
  636. null,
  637. null,
  638. null,
  639. null,
  640. $marketingList);
  641. $processed = 0;
  642. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  643. $this->processDueItem($campaignItem);
  644. $emailMessage = $campaignItem->emailMessage;
  645. $this->assertNull ($emailMessage->content->textContent);
  646. $this->assertNotNull($emailMessage->content->htmlContent);
  647. }
  648. /**
  649. * @depends testProcessDueCampaignItemWithoutTextContent
  650. */
  651. public function testProcessDueCampaignItemWithoutRichTextSupport()
  652. {
  653. $email = new Email();
  654. $email->emailAddress = 'demo12@zurmo.com';
  655. $contact = ContactTestHelper::createContactByNameForOwner('contact 12', $this->user);
  656. $contact->primaryEmail = $email;
  657. $this->assertTrue($contact->save());
  658. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 12',
  659. 'description',
  660. 'CustomFromName',
  661. 'custom@from.com');
  662. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  663. $campaign = CampaignTestHelper::createCampaign('campaign 12',
  664. 'subject 12',
  665. 'Dr. [[FIRST^NAME]] [[LAST^NAME]]',
  666. '<b>[[LAST^NAME]]</b>, [[FIRST^NAME]]',
  667. null,
  668. null,
  669. false,
  670. null,
  671. null,
  672. null,
  673. $marketingList);
  674. $processed = 0;
  675. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  676. $this->processDueItem($campaignItem);
  677. $emailMessage = $campaignItem->emailMessage;
  678. $this->assertNotNull($emailMessage->content->textContent);
  679. $this->assertNull ($emailMessage->content->htmlContent);
  680. }
  681. /**
  682. * @depends testProcessDueCampaignItemWithoutRichTextSupport
  683. */
  684. public function testProcessDueCampaignItemWithModelUrlMergeTag()
  685. {
  686. $email = new Email();
  687. $email->emailAddress = 'demo13@zurmo.com';
  688. $contact = ContactTestHelper::createContactByNameForOwner('contact 13', $this->user);
  689. $contact->primaryEmail = $email;
  690. $this->assertTrue($contact->save());
  691. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 13',
  692. 'description',
  693. 'CustomFromName',
  694. 'custom@from.com');
  695. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  696. $campaign = CampaignTestHelper::createCampaign('campaign 13',
  697. 'subject 13',
  698. 'Url: [[MODEL^URL]]',
  699. 'Click <a href="[[MODEL^URL]]">here</a>',
  700. null,
  701. null,
  702. null,
  703. null,
  704. null,
  705. null,
  706. $marketingList);
  707. $processed = 0;
  708. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  709. $this->processDueItem($campaignItem);
  710. $emailMessage = $campaignItem->emailMessage;
  711. $this->assertNotNull ($emailMessage->content->textContent);
  712. $this->assertNotNull($emailMessage->content->htmlContent);
  713. $this->assertContains('/contacts/default/details?id=' . $contact->id, $emailMessage->content->textContent);
  714. $this->assertContains('/contacts/default/details?id=' . $contact->id, $emailMessage->content->htmlContent);
  715. }
  716. /**
  717. * @depends testProcessDueCampaignItemWithModelUrlMergeTag
  718. */
  719. public function testProcessDueCampaignItemSenderIsSetFromCampaign()
  720. {
  721. $email = new Email();
  722. $email->emailAddress = 'demo14@zurmo.com';
  723. $contact = ContactTestHelper::createContactByNameForOwner('contact 14', $this->user);
  724. $contact->primaryEmail = $email;
  725. $this->assertTrue($contact->save());
  726. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 14',
  727. 'description',
  728. null,
  729. null);
  730. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  731. $campaign = CampaignTestHelper::createCampaign('campaign 12',
  732. 'subject 12',
  733. 'Dr. [[FIRST^NAME]] [[LAST^NAME]]',
  734. '<b>[[LAST^NAME]]</b>, [[FIRST^NAME]]',
  735. 'testFromName',
  736. 'test@zurmo.com',
  737. null,
  738. null,
  739. null,
  740. null,
  741. $marketingList);
  742. $processed = 0;
  743. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  744. $this->processDueItem($campaignItem);
  745. $emailMessage = $campaignItem->emailMessage;
  746. $this->assertEquals('testFromName', $emailMessage->sender->fromName);
  747. $this->assertEquals('test@zurmo.com', $emailMessage->sender->fromAddress);
  748. }
  749. /**
  750. * @depends testProcessDueCampaignItemSenderIsSetFromCampaign
  751. */
  752. public function testProcessDueCampaignItemWithUnsubscribeUrlMergeTag()
  753. {
  754. $email = new Email();
  755. $email->emailAddress = 'demo15@zurmo.com';
  756. $contact = ContactTestHelper::createContactByNameForOwner('contact 15', $this->user);
  757. $contact->primaryEmail = $email;
  758. $this->assertTrue($contact->save());
  759. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 15',
  760. 'description',
  761. null,
  762. null);
  763. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  764. $campaign = CampaignTestHelper::createCampaign('campaign 13',
  765. 'subject 13',
  766. GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag(),
  767. GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag(),
  768. 'testFromName',
  769. 'test@zurmo.com',
  770. null,
  771. null,
  772. null,
  773. null,
  774. $marketingList);
  775. $processed = 0;
  776. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  777. $this->processDueItem($campaignItem);
  778. $textContent = $campaignItem->emailMessage->content->textContent;
  779. $htmlContent = $campaignItem->emailMessage->content->htmlContent;
  780. $this->assertNotEquals($campaign->textContent, $textContent);
  781. $this->assertNotEquals($campaign->htmlContent, $htmlContent);
  782. $this->assertContains('localhost', $textContent);
  783. $this->assertEquals(1, substr_count($textContent, '/marketingLists/external/unsubscribe?hash='));
  784. $this->assertContains('localhost', $htmlContent);
  785. $this->assertEquals(1, substr_count($htmlContent, '/marketingLists/external/unsubscribe?hash='));
  786. $this->assertContains('<img width="1" height="1" src="localhost', $htmlContent);
  787. $this->assertContains('/tracking/default/track?id=', $htmlContent);
  788. $this->assertNotContains('/marketingLists/external/manageSubscriptions', $htmlContent);
  789. }
  790. /**
  791. * @depends testProcessDueCampaignItemWithUnsubscribeUrlMergeTag
  792. */
  793. public function testProcessDueCampaignItemWithManageSubscriptionsUrlMergeTag()
  794. {
  795. $email = new Email();
  796. $email->emailAddress = 'demo16@zurmo.com';
  797. $contact = ContactTestHelper::createContactByNameForOwner('contact 16', $this->user);
  798. $contact->primaryEmail = $email;
  799. $this->assertTrue($contact->save());
  800. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 16',
  801. 'description',
  802. null,
  803. null);
  804. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  805. $campaign = CampaignTestHelper::createCampaign('campaign 14',
  806. 'subject 14',
  807. GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag(),
  808. GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag(),
  809. 'testFromName',
  810. 'test@zurmo.com',
  811. null,
  812. null,
  813. null,
  814. null,
  815. $marketingList);
  816. $processed = 0;
  817. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  818. $this->processDueItem($campaignItem);
  819. $textContent = $campaignItem->emailMessage->content->textContent;
  820. $htmlContent = $campaignItem->emailMessage->content->htmlContent;
  821. $this->assertNotEquals($campaign->textContent, $textContent);
  822. $this->assertNotEquals($campaign->htmlContent, $htmlContent);
  823. $this->assertContains('localhost', $textContent);
  824. $this->assertEquals(1, substr_count($textContent, '/marketingLists/external/manageSubscriptions?hash='));
  825. $this->assertContains('localhost', $htmlContent);
  826. $this->assertEquals(1, substr_count($htmlContent, '/marketingLists/external/manageSubscriptions?hash='));
  827. $this->assertContains('<img width="1" height="1" src="localhost', $htmlContent);
  828. $this->assertContains('/tracking/default/track?id=', $htmlContent);
  829. $this->assertNotContains('/marketingLists/external/unsubscribe', $htmlContent);
  830. }
  831. /**
  832. * @depends testProcessDueCampaignItemWithManageSubscriptionsUrlMergeTag
  833. */
  834. public function testProcessDueCampaignItemWithUnsubscribeAndManageSubscriptionsUrlMergeTags()
  835. {
  836. $email = new Email();
  837. $email->emailAddress = 'demo17@zurmo.com';
  838. $contact = ContactTestHelper::createContactByNameForOwner('contact 17', $this->user);
  839. $contact->primaryEmail = $email;
  840. $this->assertTrue($contact->save());
  841. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 17',
  842. 'description',
  843. null,
  844. null);
  845. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  846. $campaign = CampaignTestHelper::createCampaign('campaign 15',
  847. 'subject 15',
  848. GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag() . ', ' . // Not Coding Standard
  849. GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag(),
  850. GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag() . ', ' . // Not Coding Standard
  851. GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag(),
  852. 'testFromName',
  853. 'test@zurmo.com',
  854. null,
  855. null,
  856. null,
  857. null,
  858. $marketingList);
  859. $processed = 0;
  860. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  861. $this->processDueItem($campaignItem);
  862. $textContent = $campaignItem->emailMessage->content->textContent;
  863. $htmlContent = $campaignItem->emailMessage->content->htmlContent;
  864. $this->assertNotEquals($campaign->textContent, $textContent);
  865. $this->assertNotEquals($campaign->htmlContent, $htmlContent);
  866. $this->assertContains('localhost', $textContent);
  867. $this->assertEquals(1, substr_count($textContent, '/marketingLists/external/unsubscribe?hash='));
  868. $this->assertContains('localhost', $htmlContent);
  869. $this->assertEquals(1, substr_count($htmlContent, '/marketingLists/external/unsubscribe?hash='));
  870. $this->assertContains('<img width="1" height="1" src="localhost', $htmlContent);
  871. $this->assertContains('/tracking/default/track?id=', $htmlContent);
  872. $this->assertContains(', localhost', $textContent);
  873. $this->assertEquals(1, substr_count($textContent, '/marketingLists/external/manageSubscriptions?hash='));
  874. $this->assertContains(', localhost', $htmlContent);
  875. $this->assertEquals(1, substr_count($htmlContent, '/marketingLists/external/manageSubscriptions?hash='));
  876. $this->assertContains('<img width="1" height="1" src="localhost', $htmlContent);
  877. $this->assertContains('/tracking/default/track?id=', $htmlContent);
  878. }
  879. /**
  880. * @depends testProcessDueCampaignItemWithUnsubscribeAndManageSubscriptionsUrlMergeTags
  881. */
  882. public function testProcessDueCampaignItemWithoutUnsubscribeAndManageSubscriptionsUrlMergeTags()
  883. {
  884. $email = new Email();
  885. $email->emailAddress = 'demo18@zurmo.com';
  886. $contact = ContactTestHelper::createContactByNameForOwner('contact 18', $this->user);
  887. $contact->primaryEmail = $email;
  888. $this->assertTrue($contact->save());
  889. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 18',
  890. 'description',
  891. null,
  892. null);
  893. MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
  894. $campaign = CampaignTestHelper::createCampaign('campaign 16',
  895. 'subject 16',
  896. 'Plain Text',
  897. 'HTML',
  898. 'testFromName',
  899. 'test@zurmo.com',
  900. null,
  901. null,
  902. null,
  903. null,
  904. $marketingList);
  905. $processed = 0;
  906. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  907. $this->processDueItem($campaignItem);
  908. $textContent = $campaignItem->emailMessage->content->textContent;
  909. $htmlContent = $campaignItem->emailMessage->content->htmlContent;
  910. $this->assertNotEquals($campaign->textContent, $textContent);
  911. $this->assertNotEquals($campaign->htmlContent, $htmlContent);
  912. $this->assertContains('Plain Text', $textContent);
  913. $this->assertContains('/marketingLists/external/unsubscribe?hash=', $textContent);
  914. $this->assertEquals(1, substr_count($textContent, '/marketingLists/external/unsubscribe?hash='));
  915. $this->assertContains('/marketingLists/external/manageSubscriptions?hash=', $textContent);
  916. $this->assertEquals(1, substr_count($textContent, '/marketingLists/external/manageSubscriptions?hash='));
  917. $this->assertContains('HTML<br /><br /><a href="localhost/', $htmlContent);
  918. $this->assertContains('<img width="1" height="1" src="localhost', $htmlContent);
  919. $this->assertContains('/tracking/default/track?id=', $htmlContent);
  920. $this->assertEquals(1, substr_count($htmlContent, '/tracking/default/track?id='));
  921. $this->assertContains('/marketingLists/external/unsubscribe?hash=', $htmlContent);
  922. $this->assertEquals(1, substr_count($htmlContent, '/marketingLists/external/unsubscribe?hash='));
  923. $this->assertEquals(2, substr_count($htmlContent, '<br /><a href="localhost/'));
  924. $this->assertContains('/marketingLists/external/manageSubscriptions?hash=', $htmlContent);
  925. $this->assertEquals(1, substr_count($htmlContent, '/marketingLists/external/manageSubscriptions?hash='));
  926. }
  927. public function testProcessDueCampaignItemContactUnsubscribed()
  928. {
  929. $email = new Email();
  930. $email->emailAddress = 'demo@zurmo.com';
  931. $email->optOut = false;
  932. $contact = ContactTestHelper::createContactByNameForOwner('contact 17', $this->user);
  933. $contact->primaryEmail = $email;
  934. $this->assertTrue($contact->save());
  935. $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 17',
  936. 'description',
  937. 'CustomFromName',
  938. 'custom@from.com');
  939. MarketingListMemberTestHelper::createMarketingListMember(true, $marketingList, $contact);
  940. $campaign = CampaignTestHelper::createCampaign('campaign 17',
  941. 'subject 17',
  942. 'Dear. Sir',
  943. 'Dear. Sir',
  944. null,
  945. null,
  946. null,
  947. null,
  948. null,
  949. null,
  950. $marketingList);
  951. $processed = 0;
  952. $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
  953. $this->processDueItem($campaignItem);
  954. $this->assertEquals(1, $campaignItem->processed);
  955. $personId = $contact->getClassId('Person');
  956. $activities = CampaignItemActivity::getByTypeAndModelIdAndPersonIdAndUrl(
  957. CampaignItemActivity::TYPE_SKIP,
  958. $campaignItem->id,
  959. $personId);
  960. $this->assertNotEmpty($activities);
  961. $this->assertCount(1, $activities);
  962. }
  963. }
  964. ?>