PageRenderTime 48ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/app/protected/modules/emailMessages/tests/unit/EmailMessageActivityUtilTest.php

https://bitbucket.org/zurmo/zurmo/
PHP | 500 lines | 397 code | 23 blank | 80 comment | 2 complexity | 115910b598ff5e80ab9e1921a16910c7 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 EmailMessageActivityUtilTest extends ZurmoBaseTest
  37. {
  38. public static function setUpBeforeClass()
  39. {
  40. parent::setUpBeforeClass();
  41. SecurityTestHelper::createSuperAdmin();
  42. SecurityTestHelper::createUsers();
  43. }
  44. public function setUp()
  45. {
  46. parent::setUp();
  47. Yii::app()->user->userModel = User::getByUsername('super');
  48. }
  49. /**
  50. * @expectedException NotSupportedException
  51. */
  52. public function testResolveQueryStringFromUrlAndCreateNewActivityThrowsExceptionForNonHexadecimalHash()
  53. {
  54. $hash = 'Bo9iemeigh6muath8chu2leThohn8Abimoh5rebaihei4aiM1uFoThaith9eng1sei8aisuHu1ugoophiewo3ohphie1ieloo';
  55. $result = EmailMessageActivityUtil::resolveQueryStringArrayForHash($hash);
  56. }
  57. /**
  58. * @depends testResolveQueryStringFromUrlAndCreateNewActivityThrowsExceptionForNonHexadecimalHash
  59. * @expectedException NotSupportedException
  60. */
  61. public function testResolveQueryStringFromUrlAndCreateNewActivityThrowsExceptionForIndecipherableHexadecimalHash()
  62. {
  63. $hash = 'DEDF8F6C80D20528130EBBFBD293E49C9E2F0CBFDE8995FFE4EEAD8EC8F00B70';
  64. $result = EmailMessageActivityUtil::resolveQueryStringArrayForHash($hash);
  65. }
  66. /**
  67. * @depends testResolveQueryStringFromUrlAndCreateNewActivityThrowsExceptionForIndecipherableHexadecimalHash
  68. * @expectedException NotSupportedException
  69. */
  70. public function testResolveQueryStringFromUrlAndCreateNewActivityThrowsExceptionForDecipherableHexadecimalHashWithMissingParameters()
  71. {
  72. $queryStringArray = array(
  73. 'keyOne' => 'valueOne',
  74. 'keyTwo' => 'valueTwo',
  75. 'keyThree' => 'ValueThree',
  76. );
  77. $hash = StringUtil::resolveHashForQueryStringArray($queryStringArray);
  78. $result = EmailMessageActivityUtil::resolveQueryStringArrayForHash($hash);
  79. }
  80. /**
  81. * @depends testResolveQueryStringFromUrlAndCreateNewActivityThrowsExceptionForDecipherableHexadecimalHashWithMissingParameters
  82. */
  83. public function testResolveQueryStringFromUrlAndCreateNewActivityDoesNotThrowsExceptionForMissingUrlParameter()
  84. {
  85. $queryStringArray = array(
  86. 'modelId' => 1,
  87. 'modelType' => 'ModelClassName',
  88. 'personId' => 2,
  89. );
  90. $hash = StringUtil::resolveHashForQueryStringArray($queryStringArray);
  91. $result = EmailMessageActivityUtil::resolveQueryStringArrayForHash($hash);
  92. $this->assertTrue(is_array($result));
  93. $this->assertCount(5, $result);
  94. $this->assertArrayHasKey('modelId', $result);
  95. $this->assertArrayHasKey('modelType', $result);
  96. $this->assertArrayHasKey('personId', $result);
  97. $this->assertArrayHasKey('url', $result);
  98. $this->assertArrayHasKey('type', $result);
  99. $this->assertEquals($queryStringArray['modelId'], $result['modelId']);
  100. $this->assertEquals($queryStringArray['modelType'], $result['modelType']);
  101. $this->assertEquals($queryStringArray['personId'], $result['personId']);
  102. $this->assertNull($result['url']);
  103. $this->assertNull($result['type']);
  104. }
  105. public function testReturnTrueWithNoTracking()
  106. {
  107. $content = 'Sample Content with no links';
  108. $result = static::resolveContent($content, false, false);
  109. $this->assertTrue($result);
  110. $this->assertNotEquals('Sample Content with no links', $content);
  111. $this->assertContains('Sample Content with no links', $content);
  112. $this->assertContains('/marketingLists/external/', $content);
  113. $this->assertEquals(2, substr_count($content, '/marketingLists/external/'));
  114. }
  115. /**
  116. * @depends testReturnTrueWithNoTracking
  117. */
  118. public function testTextContentDoesNotChangeWhenNoLinksArePresent()
  119. {
  120. $content = 'Sample Content with no links';
  121. $result = static::resolveContent($content, true, false);
  122. $this->assertTrue($result);
  123. $this->assertContains('Sample Content with no links', $content);
  124. $this->assertContains('/marketingLists/external/', $content);
  125. $this->assertEquals(2, substr_count($content, '/marketingLists/external/'));
  126. }
  127. /**
  128. * @depends testTextContentDoesNotChangeWhenNoLinksArePresent
  129. */
  130. public function testReturnsFalseWithFewTrackingUrlsInPlaceAlready()
  131. {
  132. $content = '/tracking/default/track';
  133. $result = static::resolveContent($content, true, false);
  134. $this->assertFalse($result);
  135. }
  136. /**
  137. * @depends testReturnsFalseWithFewTrackingUrlsInPlaceAlready
  138. */
  139. public function testTextContentLinksAreConvertedToTracked()
  140. {
  141. $content = <<<LNK
  142. Link: http://www.zurmo.com
  143. Another: http://zurmo.org
  144. www.yahoo.com
  145. LNK;
  146. $result = static::resolveContent($content, true, false);
  147. $this->assertTrue($result);
  148. $this->assertNotContains('http://www.zurmo.com', $content);
  149. $this->assertNotContains('http://www.zurmo.org', $content);
  150. $this->assertNotContains('www.yahoo.com', $content);
  151. $this->assertContains('/tracking/default/track?id=', $content);
  152. $this->assertEquals(3, substr_count($content, '/tracking/default/track?id='));
  153. $this->assertContains('/marketingLists/external/', $content);
  154. $this->assertEquals(2, substr_count($content, '/marketingLists/external/'));
  155. }
  156. /**
  157. * @depends testTextContentLinksAreConvertedToTracked
  158. */
  159. public function testTextContentLinkConversionIgnoresHref()
  160. {
  161. $content = 'Link: http://www.zurmo.com , <a href="http://www.zurmo.org">Zurmo</a>';
  162. $result = static::resolveContent($content, true, false);
  163. $this->assertTrue($result);
  164. $this->assertNotContains('http://www.zurmo.com', $content);
  165. $this->assertContains('<a href="http://www.zurmo.org">', $content);
  166. $this->assertContains('/tracking/default/track?id=', $content);
  167. $this->assertEquals(1, substr_count($content, '/tracking/default/track?id='));
  168. $this->assertContains('/marketingLists/external/', $content);
  169. $this->assertEquals(2, substr_count($content, '/marketingLists/external/'));
  170. }
  171. /**
  172. * @depends testTextContentLinkConversionIgnoresHref
  173. */
  174. public function testHtmlContentWithoutAnyLinksAndNoDOMStructureStillGetsEmailOpenTracking()
  175. {
  176. $content = 'Sample content';
  177. $result = static::resolveContent($content);
  178. $this->assertTrue($result);
  179. $this->assertNotEquals('Sample content', $content);
  180. $this->assertContains('Sample content', $content);
  181. $this->assertContains('<img width="1" height="1" src="', $content);
  182. $this->assertContains('/tracking/default/track?id=', $content);
  183. $this->assertEquals(1, substr_count($content, '/tracking/default/track?id='));
  184. $this->assertContains('/marketingLists/external/', $content);
  185. $this->assertEquals(2, substr_count($content, '/marketingLists/external/'));
  186. }
  187. /**
  188. * @depends testHtmlContentWithoutAnyLinksAndNoDOMStructureStillGetsEmailOpenTracking
  189. */
  190. public function testHtmlContentWithMultipleClosingBodyTagsGetOnlyOneEmailOpenTracking()
  191. {
  192. $content = 'Sample content</body></body></body>';
  193. $result = static::resolveContent($content);
  194. $this->assertTrue($result);
  195. $this->assertNotEquals('Sample content', $content);
  196. $this->assertContains('Sample content', $content);
  197. $this->assertContains('</body></body>', $content);
  198. $this->assertContains('<img width="1" height="1" src="', $content);
  199. $this->assertEquals(1, substr_count($content, '<img width="1" height="1" src="'));
  200. $this->assertContains('/tracking/default/track?id=', $content);
  201. $this->assertEquals(1, substr_count($content, '/tracking/default/track?id='));
  202. $this->assertContains('/marketingLists/external/', $content);
  203. $this->assertEquals(2, substr_count($content, '/marketingLists/external/'));
  204. }
  205. /**
  206. * @depends testHtmlContentWithMultipleClosingBodyTagsGetOnlyOneEmailOpenTracking
  207. */
  208. public function testHtmlContentWithoutAnyLinksAndSomeDOMStructureStillGetsEmailOpenTracking()
  209. {
  210. $content = '<html><head><title>Page title</title></head><body><p>Sample Content</p></body></html>';
  211. $originalContent = $content;
  212. $result = static::resolveContent($content);
  213. $this->assertTrue($result);
  214. $this->assertNotEquals($originalContent, $content);
  215. $this->assertContains('<p>Sample Content</p>', $content);
  216. $this->assertContains('<p>Sample Content</p><br /><img width="1" height="1" src="', $content);
  217. $this->assertContains('/tracking/default/track?id=', $content);
  218. $this->assertEquals(1, substr_count($content, '/tracking/default/track?id='));
  219. $this->assertContains('/marketingLists/external/', $content);
  220. $this->assertEquals(2, substr_count($content, '/marketingLists/external/'));
  221. }
  222. /**
  223. * @depends testHtmlContentWithoutAnyLinksAndSomeDOMStructureStillGetsEmailOpenTracking
  224. */
  225. public function testHtmlContentWithPlainLinkGetsTracking()
  226. {
  227. $content = <<<HTML
  228. <html>
  229. <head>
  230. <title>
  231. Page Title
  232. </title>
  233. </head>
  234. <body>
  235. <p>Sample Content With Links</p>
  236. <p>Plain Link: http://www.zurmo.com</p>
  237. </body>
  238. </html>
  239. HTML;
  240. $originalContent = $content;
  241. $result = static::resolveContent($content);
  242. $this->assertTrue($result);
  243. $this->assertNotEquals($originalContent, $content);
  244. $this->assertContains('<p>Sample Content With Links</p>', $content);
  245. $this->assertNotContains('<p>Plain Link: http://www.zurmo.com</p>', $content);
  246. $this->assertContains('<img width="1" height="1" src="', $content);
  247. $this->assertContains('/tracking/default/track?id=', $content);
  248. $this->assertEquals(2, substr_count($content, '/tracking/default/track?id='));
  249. $this->assertContains('/marketingLists/external/', $content);
  250. $this->assertEquals(2, substr_count($content, '/marketingLists/external/'));
  251. }
  252. /**
  253. * @depends testHtmlContentWithPlainLinkGetsTracking
  254. */
  255. public function testHtmlContentWithValidHrefAndPlainLinkGetsTracking()
  256. {
  257. $content = <<<HTML
  258. <html>
  259. <head>
  260. <title>
  261. Page Title
  262. </title>
  263. </head>
  264. <body>
  265. <p>Sample Content With Links</p>
  266. <p>Plain Link1: http://www.zurmo1.com</p>
  267. <p>Plain Link2:http://www.zurmo2.com</p>
  268. <p>Plain Link3: http://www.zurmo3.com </p>
  269. <p>Plain Link4:
  270. http://www.zurmo4.com</p>
  271. <p>Plain Link5:
  272. http://www.zurmo5.com</p>
  273. <p>Plain Link6:
  274. http://www.zurmo6.com </p>
  275. <p>Plain Link7:
  276. http://www.zurmo7.com </p>
  277. <p>Link1: <a href="http://www.zurmo.org">Zurmo</a></p>
  278. <p>Link2: <a href='http://www.sourceforge1.org'>SourceForge</a></p>
  279. <p>Link3: <a href='http://www.sourceforge2.org'>http://www.sourceforge2.org</a></p>
  280. <p>Link4: <a href='http://www.sourceforge3.org'> http://www.sourceforge3.org</a></p>
  281. <p>Link5: <a href='http://www.sourceforge4.org'>http://www.sourceforge4.org </a></p>
  282. <p>Link6: <a href='http://www.sourceforge5.org'> http://www.sourceforge5.org </a></p>
  283. <p>Link7: <a target='_blank' href='http://www.sourceforge6.org' style='color:red;'> http://www.sourceforge6.org </a></p>
  284. <p>Link8: http://www.sourceforge8.org</a></p>
  285. <p>Link9: http://www.sourceforge9.org </a></p>
  286. <p>Link10:
  287. <a href="http://www.sourceforge10.org">http://www.sourceforge10.org</a></p>
  288. <p>Link11: <a
  289. href='http://www.sourceforge11.org'>http://www.sourceforge11.org</a></p>
  290. <p>Link12: <a href='http://www.sourceforge12.org'>
  291. http://www.sourceforge12.org</a></p>
  292. <p>Link13: <a href='http://www.sourceforge13.org'>
  293. http://www.sourceforge13.org</a></p>
  294. <p>Link14: <a href='http://www.sourceforge14.org'>
  295. http://www.sourceforge14.org </a></p>
  296. <p>Link15: <a href='#localanchor'>New</a></p>
  297. <p>Link16: <a href='http://www.sourceforge16.org/projects#promoted'>Promoted Projects</a></p>
  298. <img src='http://zurmo.org/wp-content/themes/Zurmo/images/Zurmo-logo.png' alt='Zurmo Logo' />
  299. <link rel="apple-touch-icon" sizes="144x144" href="http://www.zurmo.com/icon.png">
  300. <link rel="stylesheet" type="text/css" href="http://www.zurmo.com/css/keyframes.css">
  301. <link rel="stylesheet" type="text/css" href="http://www.zurmo.com/zurmo/app/index.php/min/serve/g/css/lm/1366956624">
  302. <script type="text/javascript" src="http://www.zurmo.com/zurmo/app/index.php/min/serve/g/js/lm/1366697759"></script>
  303. <script type="text/javascript" src="http://www.zurmo.com/zurmo/app/index.php/min/serve/g/js/lm/1366697751.js"></script>
  304. </body>
  305. </html>
  306. HTML;
  307. $originalContent = $content;
  308. $result = static::resolveContent($content);
  309. $this->assertTrue($result);
  310. $this->assertNotEquals($originalContent, $content);
  311. $this->assertEquals(19, substr_count($content, '/tracking/default/track?id='));
  312. $this->assertContains('<p>Sample Content With Links</p>', $content);
  313. $this->assertContains('http://www.zurmo1.com', $content);
  314. $this->assertEquals(1, substr_count($content, 'http://www.zurmo1.com'));
  315. $this->assertContains('http://www.zurmo2.com', $content);
  316. $this->assertEquals(1, substr_count($content, 'http://www.zurmo2.com'));
  317. $this->assertContains('http://www.zurmo3.com', $content);
  318. $this->assertEquals(1, substr_count($content, 'http://www.zurmo3.com'));
  319. $this->assertContains('http://www.zurmo4.com', $content);
  320. $this->assertEquals(1, substr_count($content, 'http://www.zurmo4.com'));
  321. $this->assertContains('http://www.zurmo5.com', $content);
  322. $this->assertEquals(1, substr_count($content, 'http://www.zurmo5.com'));
  323. $this->assertContains('http://www.zurmo6.com', $content);
  324. $this->assertEquals(1, substr_count($content, 'http://www.zurmo6.com'));
  325. $this->assertContains('http://www.zurmo7.com', $content);
  326. $this->assertEquals(1, substr_count($content, 'http://www.zurmo7.com'));
  327. $this->assertNotContains('http://www.zurmo.org', $content);
  328. $this->assertContains("SourceForge", $content);
  329. $this->assertNotContains(" href='http://www.sourceforge1.org'", $content);
  330. $this->assertNotContains(" href='http://www.sourceforge2.org'", $content);
  331. $this->assertNotContains(" href='http://www.sourceforge3.org'", $content);
  332. $this->assertNotContains(" href='http://www.sourceforge4.org'", $content);
  333. $this->assertNotContains(" href='http://www.sourceforge5.org'", $content);
  334. $this->assertNotContains(" href='http://www.sourceforge6.org'", $content);
  335. $this->assertContains("http://www.sourceforge2.org", $content);
  336. $this->assertContains("http://www.sourceforge3.org", $content);
  337. $this->assertContains("http://www.sourceforge4.org", $content);
  338. $this->assertContains("http://www.sourceforge5.org", $content);
  339. $this->assertContains("http://www.sourceforge6.org", $content);
  340. $this->assertEquals(1, substr_count($content, 'http://www.sourceforge2.org'));
  341. $this->assertEquals(1, substr_count($content, 'http://www.sourceforge3.org'));
  342. $this->assertEquals(1, substr_count($content, 'http://www.sourceforge4.org'));
  343. $this->assertEquals(1, substr_count($content, 'http://www.sourceforge5.org'));
  344. $this->assertEquals(1, substr_count($content, 'http://www.sourceforge6.org'));
  345. $this->assertContains("http://www.sourceforge8.org", $content);
  346. $this->assertContains("http://www.sourceforge9.org", $content);
  347. $this->assertEquals(1, substr_count($content, 'http://www.sourceforge8.org'));
  348. $this->assertEquals(1, substr_count($content, 'http://www.sourceforge9.org'));
  349. $this->assertNotContains(" href='http://www.sourceforge1.org'", $content);
  350. $this->assertContains("http://www.sourceforge10.org", $content);
  351. $this->assertEquals(1, substr_count($content, 'http://www.sourceforge10.org'));
  352. $this->assertContains('Link10:' . "\n" . '<a href="', $content);
  353. $this->assertEquals(1, substr_count($content, 'Link10:' . "\n" . '<a href="'));
  354. $this->assertContains("Link7: <a target='_blank' ", $content);
  355. $this->assertEquals(1, substr_count($content, "Link7: <a target='_blank' "));
  356. $this->assertContains(" style='color:red;'> ", $content);
  357. $this->assertEquals(1, substr_count($content, " style='color:red;'> "));
  358. $this->assertContains("http://www.sourceforge11.org", $content);
  359. $this->assertEquals(2, substr_count($content, 'http://www.sourceforge11.org'));
  360. $this->assertNotContains(" href='http://www.sourceforge12.org'", $content);
  361. $this->assertNotContains(" href='http://www.sourceforge13.org'", $content);
  362. $this->assertNotContains(" href='http://www.sourceforge14.org'", $content);
  363. $this->assertContains("http://www.sourceforge12.org", $content);
  364. $this->assertContains("http://www.sourceforge13.org", $content);
  365. $this->assertContains("http://www.sourceforge14.org", $content);
  366. $this->assertContains("<p>Link15: <a href='#localanchor'>New</a></p>", $content);
  367. $this->assertNotContains("http://www.sourceforge16.org/projects#promoted", $content);
  368. $this->assertContains("http://zurmo.org/wp-content/themes/Zurmo/images/Zurmo-logo.png", $content);
  369. $this->assertEquals(1, substr_count($content,
  370. 'http://zurmo.org/wp-content/themes/Zurmo/images/Zurmo-logo.png'));
  371. $this->assertContains("http://www.zurmo.com/icon.png", $content);
  372. $this->assertEquals(1, substr_count($content, 'http://www.zurmo.com/icon.png'));
  373. $this->assertContains("http://www.zurmo.com/css/keyframes.css", $content);
  374. $this->assertEquals(1, substr_count($content, 'http://www.zurmo.com/css/keyframes.css'));
  375. $this->assertContains("http://www.zurmo.com/zurmo/app/index.php/min/serve/g/css/lm/1366956624", $content);
  376. $this->assertEquals(1, substr_count($content,
  377. 'http://www.zurmo.com/zurmo/app/index.php/min/serve/g/css/lm/1366956624'));
  378. $this->assertContains("http://www.zurmo.com/zurmo/app/index.php/min/serve/g/js/lm/1366697759", $content);
  379. $this->assertEquals(1,
  380. substr_count($content, 'http://www.zurmo.com/zurmo/app/index.php/min/serve/g/js/lm/1366697759'));
  381. $this->assertContains("http://www.zurmo.com/zurmo/app/index.php/min/serve/g/js/lm/1366697751.js", $content);
  382. $this->assertEquals(1,
  383. substr_count($content, 'http://www.zurmo.com/zurmo/app/index.php/min/serve/g/js/lm/1366697751.js'));
  384. $this->assertContains('<img width="1" height="1" src=', $content);
  385. $this->assertEquals(1, substr_count($content, '<img width="1" height="1" src='));
  386. $this->assertContains('/marketingLists/external/', $content);
  387. $this->assertEquals(2, substr_count($content, '/marketingLists/external/'));
  388. }
  389. public function testResolveQueryStringArrayForHashWithAndWithoutUrlInQueryString()
  390. {
  391. // test without url
  392. $modelId = 1;
  393. $modelType = 'AutoresponderItem';
  394. $personId = 10;
  395. $className = 'EmailMessageActivityUtil';
  396. $resolveBaseQueryStringArrayFunction = static::getProtectedMethod('ContentTrackingUtil', 'resolveBaseQueryStringArray');
  397. $withoutUrlQueryStringArray = $resolveBaseQueryStringArrayFunction->invokeArgs(null,
  398. array($modelId,
  399. $modelType,
  400. $personId));
  401. $this->assertNotEmpty($withoutUrlQueryStringArray);
  402. $this->assertCount(3, $withoutUrlQueryStringArray);
  403. $this->assertArrayHasKey('modelId', $withoutUrlQueryStringArray);
  404. $this->assertArrayHasKey('modelType', $withoutUrlQueryStringArray);
  405. $this->assertArrayHasKey('personId', $withoutUrlQueryStringArray);
  406. $withoutUrlQueryStringArrayHash = StringUtil::resolveHashForQueryStringArray($withoutUrlQueryStringArray);
  407. $withoutUrlQueryStringArrayDecoded = $className::resolveQueryStringArrayForHash($withoutUrlQueryStringArrayHash);
  408. $this->assertTrue(is_array($withoutUrlQueryStringArrayDecoded));
  409. $this->assertCount(5, $withoutUrlQueryStringArrayDecoded);
  410. $this->assertArrayHasKey('modelId', $withoutUrlQueryStringArrayDecoded);
  411. $this->assertArrayHasKey('modelType', $withoutUrlQueryStringArrayDecoded);
  412. $this->assertArrayHasKey('personId', $withoutUrlQueryStringArrayDecoded);
  413. $this->assertArrayHasKey('url', $withoutUrlQueryStringArrayDecoded);
  414. $this->assertArrayHasKey('type', $withoutUrlQueryStringArrayDecoded);
  415. $this->assertEquals($withoutUrlQueryStringArray['modelId'], $withoutUrlQueryStringArrayDecoded['modelId']);
  416. $this->assertEquals($withoutUrlQueryStringArray['modelType'], $withoutUrlQueryStringArrayDecoded['modelType']);
  417. $this->assertEquals($withoutUrlQueryStringArray['personId'], $withoutUrlQueryStringArrayDecoded['personId']);
  418. $this->assertNull($withoutUrlQueryStringArrayDecoded['url']);
  419. $this->assertNull($withoutUrlQueryStringArrayDecoded['type']);
  420. // try same thing with url in the query string array.
  421. $withUrlQueryStringArray = CMap::mergeArray($withoutUrlQueryStringArray,
  422. array('url' => 'http://www.zurmo.com',
  423. 'type' => null));
  424. $withUrlQueryStringArrayHash = StringUtil::resolveHashForQueryStringArray($withUrlQueryStringArray);
  425. $withUrlQueryStringArrayDecoded = $className::resolveQueryStringArrayForHash($withUrlQueryStringArrayHash);
  426. $this->assertEquals($withUrlQueryStringArray, $withUrlQueryStringArrayDecoded);
  427. }
  428. public function testTextContentGetsCustomFooterAppended()
  429. {
  430. GlobalMarketingFooterUtil::setContentByType('PlainTextFooter', false);
  431. $content = 'This is some text content';
  432. $result = static::resolveContent($content, true, false);
  433. $this->assertTrue($result);
  434. $this->assertContains('This is some text content', $content);
  435. $this->assertContains('PlainTextFooter', $content);
  436. $this->assertNotContains('/marketingLists/external/', $content);
  437. }
  438. /**
  439. * @depends testTextContentGetsCustomFooterAppended
  440. */
  441. public function testHtmlContentGetsCustomFooterAppended()
  442. {
  443. GlobalMarketingFooterUtil::setContentByType('RichTextFooter', true);
  444. $content = 'This is some html content';
  445. $result = static::resolveContent($content, true, true);
  446. $this->assertTrue($result);
  447. $this->assertContains('This is some html content', $content);
  448. $this->assertContains('RichTextFooter', $content);
  449. $this->assertNotContains('/marketingLists/external/', $content);
  450. }
  451. protected static function resolveContent(& $content, $tracking = true, $isHtmlContent = true)
  452. {
  453. return (GlobalMarketingFooterUtil::resolveContentGlobalFooter($content, $isHtmlContent) &&
  454. static::resolveContentForMergeTags($content) &&
  455. (!($tracking) || ($tracking && ContentTrackingUtil::resolveContentForTracking($content, 1, 'AutoresponderItem',
  456. 1, $isHtmlContent)))
  457. );
  458. }
  459. protected static function resolveContentForMergeTags(& $content)
  460. {
  461. $language = null;
  462. $errorOnFirstMissing = MergeTagsToModelAttributesAdapter::ERROR_ON_FIRST_INVALID_TAG;
  463. $templateType = EmailTemplate::TYPE_CONTACT;
  464. $invalidTags = array();
  465. $textMergeTagsUtil = MergeTagsUtilFactory::make($templateType, $language, $content);
  466. $params = GlobalMarketingFooterUtil::resolveFooterMergeTagsArray(1, 2, 3,
  467. 'AutoresponderITem', true,
  468. false);
  469. $content = $textMergeTagsUtil->resolveMergeTags(Yii::app()->user->userModel,
  470. $invalidTags,
  471. $language,
  472. $errorOnFirstMissing,
  473. $params);
  474. return ($content !== false);
  475. }
  476. }
  477. ?>