PageRenderTime 55ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/app/protected/modules/export/tests/unit/ExportJobTest.php

https://bitbucket.org/zurmo/zurmo/
PHP | 787 lines | 558 code | 132 blank | 97 comment | 2 complexity | d145a43fc14f967a1a6ac9d8a247319e 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 ExportJobTest extends ZurmoBaseTest
  37. {
  38. protected static $asynchronousPageSize;
  39. protected static $asynchronousMaximumModelsToProcess;
  40. public static function setUpBeforeClass()
  41. {
  42. parent::setUpBeforeClass();
  43. SecurityTestHelper::createSuperAdmin();
  44. SecurityTestHelper::createUsers();
  45. static::$asynchronousPageSize = ExportModule::$asynchronousPageSize;
  46. static::$asynchronousMaximumModelsToProcess = ExportModule::$asynchronousMaximumModelsToProcess;
  47. }
  48. public function setUp()
  49. {
  50. parent::setUp();
  51. Yii::app()->jobQueue->deleteAll();
  52. }
  53. public function tearDown()
  54. {
  55. ExportModule::$asynchronousPageSize = static::$asynchronousPageSize;
  56. ExportModule::$asynchronousMaximumModelsToProcess = static::$asynchronousMaximumModelsToProcess;
  57. }
  58. public function testExportByModelIds()
  59. {
  60. $super = User::getByUsername('super');
  61. Yii::app()->user->userModel = $super;
  62. $numberOfUserNotifications = Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel);
  63. $numberOfEmailMessages = EmailMessage::getCount();
  64. $idsToExport = array();
  65. $account1 = new Account();
  66. $account1->owner = $super;
  67. $account1->name = 'Test Account';
  68. $account1->officePhone = '1234567890';
  69. $this->assertTrue($account1->save());
  70. $account2 = new Account();
  71. $account2->owner = $super;
  72. $account2->name = 'Test Account 2';
  73. $account2->officePhone = '1234567899';
  74. $this->assertTrue($account2->save());
  75. $idsToExport[] = $account2->id;
  76. $account3 = new Account();
  77. $account3->owner = $super;
  78. $account3->name = 'Test Account 3';
  79. $account3->officePhone = '987654321';
  80. $this->assertTrue($account3->save());
  81. $idsToExport[] = $account3->id;
  82. $account4 = new Account();
  83. $account4->owner = $super;
  84. $account4->name = 'Test Account 4';
  85. $account4->officePhone = '198765432';
  86. $this->assertTrue($account4->save());
  87. $exportItem = new ExportItem();
  88. $exportItem->isCompleted = 0;
  89. $exportItem->exportFileType = 'csv';
  90. $exportItem->exportFileName = 'test';
  91. $exportItem->modelClassName = 'Account';
  92. $exportItem->serializedData = serialize($idsToExport);
  93. $this->assertTrue($exportItem->save());
  94. $id = $exportItem->id;
  95. $exportItem->forget();
  96. unset($exportItem);
  97. //Delete queued jobs from test exportItems created above
  98. Yii::app()->jobQueue->deleteAll();
  99. $job = new ExportJob();
  100. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  101. $this->assertTrue($job->run());
  102. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  103. $exportItem = ExportItem::getById($id);
  104. $fileModel = $exportItem->exportFileModel;
  105. $this->assertEquals(1, $exportItem->isCompleted);
  106. $this->assertEquals('csv', $exportItem->exportFileType);
  107. $this->assertEquals('test', $exportItem->exportFileName);
  108. $this->assertTrue($fileModel instanceOf ExportFileModel);
  109. // Get csv string via regular csv export process(directly, not in background)
  110. // We suppose that csv generated thisway is corrected, this function itself
  111. // is tested in another test.
  112. $data = array();
  113. $modelToExportAdapter = new ModelToExportAdapter($account2);
  114. $headerData = $modelToExportAdapter->getHeaderData();
  115. $data[] = $modelToExportAdapter->getData();
  116. $modelToExportAdapter = new ModelToExportAdapter($account3);
  117. $data[] = $modelToExportAdapter->getData();
  118. $output = ExportItemToCsvFileUtil::export($data, $headerData, 'test.csv', false);
  119. $this->assertEquals($output, $fileModel->fileContent->content);
  120. // Check if user got notification message, and if its type is ExportProcessCompleted
  121. $this->assertEquals($numberOfUserNotifications + 1,
  122. Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel));
  123. //Check no email notification was sent to super because super has no email address
  124. $this->assertEquals($numberOfEmailMessages, EmailMessage::getCount());
  125. }
  126. /**
  127. * @depends testExportByModelIds
  128. */
  129. public function testExportRedBeanDataProviderWithSinglePageOfData()
  130. {
  131. $super = User::getByUsername('super');
  132. $super->primaryEmail->emailAddress = 'super@zurmo.com';
  133. $this->assertTrue($super->save());
  134. Yii::app()->user->userModel = $super;
  135. $numberOfUserNotifications = Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel);
  136. $numberOfEmailMessages = EmailMessage::getCount();
  137. $account = new Account(false);
  138. $searchForm = new AccountsSearchForm($account);
  139. $dataProvider = ExportTestHelper::makeRedBeanDataProvider(
  140. $searchForm,
  141. 'Account',
  142. 0,
  143. Yii::app()->user->userModel->id
  144. );
  145. $totalItems = $dataProvider->getTotalItemCount();
  146. $this->assertEquals(4, $totalItems);
  147. $exportItem = new ExportItem();
  148. $exportItem->isCompleted = 0;
  149. $exportItem->exportFileType = 'csv';
  150. $exportItem->exportFileName = 'test2';
  151. $exportItem->modelClassName = 'Account';
  152. $exportItem->serializedData = serialize($dataProvider);
  153. $this->assertTrue($exportItem->save());
  154. $id = $exportItem->id;
  155. $exportItem->forget();
  156. unset($exportItem);
  157. //Delete queued jobs from test exportItems created above
  158. Yii::app()->jobQueue->deleteAll();
  159. $job = new ExportJob();
  160. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  161. $this->assertTrue($job->run());
  162. //A new ProcessOutboundEmail was created to send the notification email
  163. $this->assertEquals(1, count(Yii::app()->jobQueue->getAll()));
  164. $exportItem = ExportItem::getById($id);
  165. $fileModel = $exportItem->exportFileModel;
  166. $this->assertEquals(1, $exportItem->isCompleted);
  167. $this->assertEquals('csv', $exportItem->exportFileType);
  168. $this->assertEquals('test2', $exportItem->exportFileName);
  169. $this->assertTrue($fileModel instanceOf ExportFileModel);
  170. // Get csv string via regular csv export process(directly, not in background)
  171. // We suppose that csv generated thisway is corrected, this function itself
  172. // is tested in another test.
  173. $data = array();
  174. $rows = $dataProvider->getData();
  175. $modelToExportAdapter = new ModelToExportAdapter($rows[0]);
  176. $headerData = $modelToExportAdapter->getHeaderData();
  177. foreach ($rows as $model)
  178. {
  179. $modelToExportAdapter = new ModelToExportAdapter($model);
  180. $data[] = $modelToExportAdapter->getData();
  181. }
  182. $output = ExportItemToCsvFileUtil::export($data, $headerData, 'test2.csv', false);
  183. $this->assertEquals($output, $fileModel->fileContent->content);
  184. // Check if user got notification message, and if its type is ExportProcessCompleted
  185. $this->assertEquals($numberOfUserNotifications + 1,
  186. Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel));
  187. //Check one email notification was sent to super
  188. $this->assertEquals($numberOfEmailMessages + 1, EmailMessage::getCount());
  189. }
  190. /**
  191. * @depends testExportByModelIds
  192. */
  193. public function testExportRedBeanDataProviderWithMultiplePagesOfData()
  194. {
  195. $super = User::getByUsername('super');
  196. Yii::app()->user->userModel = $super;
  197. //Disabling email notification
  198. NotificationTestHelper::setNotificationSettingsForUser($super, 'ExportProcessCompleted', true, false);
  199. $numberOfUserNotifications = Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel);
  200. $numberOfEmailMessages = EmailMessage::getCount();
  201. $account = new Account(false);
  202. $searchForm = new AccountsSearchForm($account);
  203. $dataProvider = ExportTestHelper::makeRedBeanDataProvider(
  204. $searchForm,
  205. 'Account',
  206. 0,
  207. Yii::app()->user->userModel->id
  208. );
  209. $totalItems = $dataProvider->getTotalItemCount();
  210. $this->assertEquals(4, $totalItems);
  211. $exportItem = new ExportItem();
  212. $exportItem->isCompleted = 0;
  213. $exportItem->exportFileType = 'csv';
  214. $exportItem->exportFileName = 'test3';
  215. $exportItem->modelClassName = 'Account';
  216. $exportItem->serializedData = serialize($dataProvider);
  217. $this->assertTrue($exportItem->save());
  218. $id = $exportItem->id;
  219. $exportItem->forget();
  220. unset($exportItem);
  221. ExportModule::$asynchronousPageSize = 2;
  222. //Delete queued jobs from test exportItems created above
  223. Yii::app()->jobQueue->deleteAll();
  224. $job = new ExportJob();
  225. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  226. $this->assertTrue($job->run());
  227. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  228. $exportItem = ExportItem::getById($id);
  229. $fileModel = $exportItem->exportFileModel;
  230. $this->assertEquals(1, $exportItem->isCompleted);
  231. $this->assertEquals('csv', $exportItem->exportFileType);
  232. $this->assertEquals('test3', $exportItem->exportFileName);
  233. $this->assertTrue($fileModel instanceOf ExportFileModel);
  234. // Get csv string via regular csv export process(directly, not in background)
  235. // We suppose that csv generated thisway is corrected, this function itself
  236. // is tested in another test.
  237. $data = array();
  238. $rows = $dataProvider->getData();
  239. $modelToExportAdapter = new ModelToExportAdapter($rows[0]);
  240. $headerData = $modelToExportAdapter->getHeaderData();
  241. foreach ($rows as $model)
  242. {
  243. $modelToExportAdapter = new ModelToExportAdapter($model);
  244. $data[] = $modelToExportAdapter->getData();
  245. }
  246. $output = ExportItemToCsvFileUtil::export($data, $headerData, 'test3.csv', false);
  247. $this->assertEquals($output, $fileModel->fileContent->content);
  248. // Check if user got notification message, and if its type is ExportProcessCompleted
  249. $this->assertEquals($numberOfUserNotifications + 1,
  250. Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel));
  251. //Check no email notification was sent to super because he has disabled it
  252. $this->assertEquals($numberOfEmailMessages, EmailMessage::getCount());
  253. }
  254. /**
  255. * @depends testExportByModelIds
  256. */
  257. public function testExportRedBeanDataProviderGoesOverMaximumProcessingCountLimit()
  258. {
  259. $super = User::getByUsername('super');
  260. Yii::app()->user->userModel = $super;
  261. $numberOfUserNotifications = Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel);
  262. $account = new Account(false);
  263. $searchForm = new AccountsSearchForm($account);
  264. $dataProvider = ExportTestHelper::makeRedBeanDataProvider(
  265. $searchForm,
  266. 'Account',
  267. 0,
  268. Yii::app()->user->userModel->id
  269. );
  270. $totalItems = $dataProvider->getTotalItemCount();
  271. $this->assertEquals(4, $totalItems);
  272. $exportItem = new ExportItem();
  273. $exportItem->isCompleted = 0;
  274. $exportItem->exportFileType = 'csv';
  275. $exportItem->exportFileName = 'test4';
  276. $exportItem->modelClassName = 'Account';
  277. $exportItem->serializedData = serialize($dataProvider);
  278. $this->assertTrue($exportItem->save());
  279. $id = $exportItem->id;
  280. $exportItem->forget();
  281. unset($exportItem);
  282. //Delete queued jobs from test exportItems created above
  283. Yii::app()->jobQueue->deleteAll();
  284. ExportModule::$asynchronousPageSize = 2;
  285. ExportModule::$asynchronousMaximumModelsToProcess = 3;
  286. $job = new ExportJob();
  287. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  288. $this->assertTrue($job->run());
  289. $queuedJobs = Yii::app()->jobQueue->getAll();
  290. $this->assertEquals(1, count($queuedJobs));
  291. $this->assertEquals('Export', $queuedJobs[5][0]['jobType']);
  292. $exportItem = ExportItem::getById($id);
  293. $fileModel = $exportItem->exportFileModel;
  294. $this->assertEquals(0, $exportItem->isCompleted);
  295. $this->assertEquals(2, $exportItem->processOffset);
  296. $this->assertEquals('csv', $exportItem->exportFileType);
  297. $this->assertEquals('test4', $exportItem->exportFileName);
  298. $this->assertTrue($fileModel instanceOf ExportFileModel);
  299. // Get csv string via regular csv export process(directly, not in background)
  300. // We suppose that csv generated thisway is corrected, this function itself
  301. // is tested in another test.
  302. $data = array();
  303. $rows = $dataProvider->getData();
  304. $modelToExportAdapter = new ModelToExportAdapter($rows[0]);
  305. $headerData = $modelToExportAdapter->getHeaderData();
  306. //Only 2 rows were processed in the first run
  307. $modelToExportAdapter = new ModelToExportAdapter($rows[0]);
  308. $data[] = $modelToExportAdapter->getData();
  309. $modelToExportAdapter = new ModelToExportAdapter($rows[1]);
  310. $data[] = $modelToExportAdapter->getData();
  311. $output = ExportItemToCsvFileUtil::export($data, $headerData, 'test4.csv', false);
  312. $this->assertEquals($output, $fileModel->fileContent->content);
  313. // Check that user got no notification message
  314. $this->assertEquals($numberOfUserNotifications,
  315. Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel));
  316. //Second run will finish the job
  317. $this->assertTrue($job->run());
  318. $queuedJobs = Yii::app()->jobQueue->getAll();
  319. $this->assertEquals(1, count($queuedJobs));
  320. $this->assertEquals('Export', $queuedJobs[5][0]['jobType']);
  321. //Third run is need to mark the exportItem as complete
  322. $this->assertTrue($job->run());
  323. $queuedJobs = Yii::app()->jobQueue->getAll();
  324. $this->assertEquals(1, count($queuedJobs));
  325. $this->assertEquals('Export', $queuedJobs[5][0]['jobType']);
  326. $exportItem = ExportItem::getById($id);
  327. $fileModel = $exportItem->exportFileModel;
  328. $this->assertEquals(1, $exportItem->isCompleted);
  329. $this->assertEquals(4, $exportItem->processOffset);
  330. $this->assertEquals('csv', $exportItem->exportFileType);
  331. $this->assertEquals('test4', $exportItem->exportFileName);
  332. $this->assertTrue($fileModel instanceOf ExportFileModel);
  333. //The last 2 rows were processed
  334. $modelToExportAdapter = new ModelToExportAdapter($rows[2]);
  335. $data[] = $modelToExportAdapter->getData();
  336. $modelToExportAdapter = new ModelToExportAdapter($rows[3]);
  337. $data[] = $modelToExportAdapter->getData();
  338. $output = ExportItemToCsvFileUtil::export($data, $headerData, 'test4.csv', false);
  339. $this->assertEquals($output, $fileModel->fileContent->content);
  340. // Check if user got notification message, and if its type is ExportProcessCompleted
  341. $this->assertEquals($numberOfUserNotifications + 1,
  342. Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel));
  343. }
  344. /**
  345. * @depends testExportByModelIds
  346. */
  347. public function testExportRedBeanDataProviderGoesOverMaximumProcessingCountLimitGlobally()
  348. {
  349. $super = User::getByUsername('super');
  350. Yii::app()->user->userModel = $super;
  351. $numberOfUserNotifications = Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel);
  352. $account = new Account(false);
  353. $searchForm = new AccountsSearchForm($account);
  354. $dataProvider = ExportTestHelper::makeRedBeanDataProvider(
  355. $searchForm,
  356. 'Account',
  357. 0,
  358. Yii::app()->user->userModel->id
  359. );
  360. $totalItems = $dataProvider->getTotalItemCount();
  361. $this->assertEquals(4, $totalItems);
  362. $exportItem = new ExportItem();
  363. $exportItem->isCompleted = 0;
  364. $exportItem->exportFileType = 'csv';
  365. $exportItem->exportFileName = 'test5';
  366. $exportItem->modelClassName = 'Account';
  367. $exportItem->serializedData = serialize($dataProvider);
  368. $this->assertTrue($exportItem->save());
  369. $id1 = $exportItem->id;
  370. $exportItem = new ExportItem();
  371. $exportItem->isCompleted = 0;
  372. $exportItem->exportFileType = 'csv';
  373. $exportItem->exportFileName = 'test6';
  374. $exportItem->modelClassName = 'Account';
  375. $exportItem->serializedData = serialize($dataProvider);
  376. $this->assertTrue($exportItem->save());
  377. $id2 = $exportItem->id;
  378. $exportItem->forget();
  379. unset($exportItem);
  380. //Delete queued jobs from test exportItems created above
  381. Yii::app()->jobQueue->deleteAll();
  382. ExportModule::$asynchronousMaximumModelsToProcess = 6;
  383. $job = new ExportJob();
  384. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  385. $this->assertTrue($job->run());
  386. $queuedJobs = Yii::app()->jobQueue->getAll();
  387. $this->assertEquals(1, count($queuedJobs));
  388. $this->assertEquals('Export', $queuedJobs[5][0]['jobType']);
  389. $exportItem = ExportItem::getById($id1);
  390. $fileModel = $exportItem->exportFileModel;
  391. $this->assertEquals(1, $exportItem->isCompleted);
  392. $this->assertEquals(0, $exportItem->processOffset);
  393. $this->assertEquals('csv', $exportItem->exportFileType);
  394. $this->assertEquals('test5', $exportItem->exportFileName);
  395. $this->assertTrue($fileModel instanceOf ExportFileModel);
  396. $data = array();
  397. $rows = $dataProvider->getData();
  398. $modelToExportAdapter = new ModelToExportAdapter($rows[0]);
  399. $headerData = $modelToExportAdapter->getHeaderData();
  400. foreach ($rows as $model)
  401. {
  402. $modelToExportAdapter = new ModelToExportAdapter($model);
  403. $data[] = $modelToExportAdapter->getData();
  404. }
  405. $output = ExportItemToCsvFileUtil::export($data, $headerData, 'test5.csv', false);
  406. $this->assertEquals($output, $fileModel->fileContent->content);
  407. // Check if user got notification message, and if its type is ExportProcessCompleted
  408. $this->assertEquals($numberOfUserNotifications + 1,
  409. Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel));
  410. //The second item was not processed
  411. $exportItem = ExportItem::getById($id2);
  412. $fileModel = $exportItem->exportFileModel;
  413. $this->assertNull($fileModel->fileContent->content);
  414. $this->assertTrue($job->run());
  415. $queuedJobs = Yii::app()->jobQueue->getAll();
  416. $this->assertEquals(1, count($queuedJobs));
  417. $this->assertEquals('Export', $queuedJobs[5][0]['jobType']);
  418. //The second item is processed
  419. $exportItem = ExportItem::getById($id2);
  420. $fileModel = $exportItem->exportFileModel;
  421. $this->assertEquals(1, $exportItem->isCompleted);
  422. $this->assertEquals(0, $exportItem->processOffset);
  423. $this->assertEquals('csv', $exportItem->exportFileType);
  424. $this->assertEquals('test6', $exportItem->exportFileName);
  425. $this->assertTrue($fileModel instanceOf ExportFileModel);
  426. $output = ExportItemToCsvFileUtil::export($data, $headerData, 'test6.csv', false);
  427. $this->assertEquals($output, $fileModel->fileContent->content);
  428. // Check if user got notification message, and if its type is ExportProcessCompleted
  429. $this->assertEquals($numberOfUserNotifications + 2,
  430. Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel));
  431. }
  432. public function testSecurityExceptionThrownDuringExport()
  433. {
  434. $super = User::getByUsername('super');
  435. Yii::app()->user->userModel = $super;
  436. SecurityTestHelper::createAccounts();
  437. $billy = User::getByUsername('billy');
  438. Yii::app()->user->userModel = $billy;
  439. AllPermissionsOptimizationUtil::rebuild();
  440. $numberOfUserNotifications = Notification::getCountByTypeAndUser('ExportProcessCompleted', $billy);
  441. $account = new Account(false);
  442. $searchForm = new AccountsSearchForm($account);
  443. $dataProvider = ExportTestHelper::makeRedBeanDataProvider(
  444. $searchForm,
  445. 'Account',
  446. 0,
  447. $billy->id
  448. );
  449. $totalItems = $dataProvider->getTotalItemCount();
  450. $this->assertEquals(3, $totalItems);
  451. $exportItem = new ExportItem();
  452. $exportItem->isCompleted = 0;
  453. $exportItem->exportFileType = 'csv';
  454. $exportItem->exportFileName = 'test7';
  455. $exportItem->modelClassName = 'Account';
  456. $exportItem->serializedData = serialize($dataProvider);
  457. $exportItem->owner = $billy;
  458. $this->assertTrue($exportItem->save());
  459. $id = $exportItem->id;
  460. $exportItem->forget();
  461. unset($exportItem);
  462. //Delete queued jobs from test exportItems created above
  463. Yii::app()->jobQueue->deleteAll();
  464. $accounts = Account::getByName('Microsoft');
  465. $account = $accounts[0];
  466. $account->owner = $super;
  467. $this->assertTrue($account->save());
  468. $job = new ExportJob();
  469. //ReadPermissionSubscriptionUpdate should get added to jobQueue
  470. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  471. $this->assertTrue($job->run());
  472. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  473. $exportItem = ExportItem::getById($id);
  474. $fileModel = $exportItem->exportFileModel;
  475. $this->assertEquals(1, $exportItem->isCompleted);
  476. $this->assertEquals('csv', $exportItem->exportFileType);
  477. $this->assertEquals('test7', $exportItem->exportFileName);
  478. $this->assertTrue($fileModel instanceOf ExportFileModel);
  479. $data = array();
  480. $rows = $dataProvider->getData();
  481. $modelToExportAdapter = new ModelToExportAdapter($rows[0]);
  482. $headerData = $modelToExportAdapter->getHeaderData();
  483. foreach ($rows as $model)
  484. {
  485. //billy lost access to Microsoft account
  486. if ($model->id != $account->id)
  487. {
  488. $modelToExportAdapter = new ModelToExportAdapter($model);
  489. $data[] = $modelToExportAdapter->getData();
  490. }
  491. }
  492. $output = ExportItemToCsvFileUtil::export($data, $headerData, 'test7.csv', false);
  493. $this->assertEquals($output, $fileModel->fileContent->content);
  494. }
  495. /**
  496. * @depends testExportByModelIds
  497. */
  498. public function testExportReportWithSinglePageOfData()
  499. {
  500. $super = User::getByUsername('super');
  501. Yii::app()->user->userModel = $super;
  502. $numberOfUserNotifications = Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel);
  503. $report = new Report();
  504. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  505. $report->setModuleClassName('AccountsModule');
  506. $report->setFiltersStructure('');
  507. $displayAttribute = new DisplayAttributeForReportForm('AccountsModule', 'Account',
  508. Report::TYPE_ROWS_AND_COLUMNS);
  509. $displayAttribute->setModelAliasUsingTableAliasName('model1');
  510. $displayAttribute->attributeIndexOrDerivedType = 'name';
  511. $report->addDisplayAttribute($displayAttribute);
  512. $dataProvider = new RowsAndColumnsReportDataProvider($report);
  513. $exportItem = new ExportItem();
  514. $exportItem->isCompleted = 0;
  515. $exportItem->exportFileType = 'csv';
  516. $exportItem->exportFileName = 'rowAndColumnsTest1';
  517. $exportItem->modelClassName = 'SavedReport';
  518. $exportItem->serializedData = ExportUtil::getSerializedDataForExport($dataProvider);
  519. $this->assertTrue($exportItem->save());
  520. $id = $exportItem->id;
  521. $exportItem->forget();
  522. unset($exportItem);
  523. //Delete queued jobs from test exportItems created above
  524. Yii::app()->jobQueue->deleteAll();
  525. $job = new ExportJob();
  526. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  527. $this->assertTrue($job->run());
  528. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  529. $exportItem = ExportItem::getById($id);
  530. $fileModel = $exportItem->exportFileModel;
  531. $this->assertEquals(1, $exportItem->isCompleted);
  532. $this->assertEquals(0, $exportItem->processOffset);
  533. $this->assertEquals('csv', $exportItem->exportFileType);
  534. $this->assertEquals('rowAndColumnsTest1', $exportItem->exportFileName);
  535. $this->assertTrue($fileModel instanceOf ExportFileModel);
  536. $accounts = Account::getAll();
  537. $headerData = array('Name');
  538. $data = array();
  539. foreach ($accounts as $account)
  540. {
  541. $data[] = array($account->name);
  542. }
  543. $output = ExportItemToCsvFileUtil::export($data, $headerData, 'rowAndColumnsTest1.csv', false);
  544. $this->assertEquals($output, $fileModel->fileContent->content);
  545. // Check if user got notification message, and if its type is ExportProcessCompleted
  546. $this->assertEquals($numberOfUserNotifications + 1,
  547. Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel));
  548. }
  549. /**
  550. * @depends testExportByModelIds
  551. */
  552. public function testExportReportWithMultiplePagesOfData()
  553. {
  554. $super = User::getByUsername('super');
  555. Yii::app()->user->userModel = $super;
  556. $numberOfUserNotifications = Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel);
  557. $report = new Report();
  558. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  559. $report->setModuleClassName('AccountsModule');
  560. $report->setFiltersStructure('');
  561. $displayAttribute = new DisplayAttributeForReportForm('AccountsModule', 'Account',
  562. Report::TYPE_ROWS_AND_COLUMNS);
  563. $displayAttribute->setModelAliasUsingTableAliasName('model1');
  564. $displayAttribute->attributeIndexOrDerivedType = 'name';
  565. $report->addDisplayAttribute($displayAttribute);
  566. $dataProvider = new RowsAndColumnsReportDataProvider($report);
  567. $exportItem = new ExportItem();
  568. $exportItem->isCompleted = 0;
  569. $exportItem->exportFileType = 'csv';
  570. $exportItem->exportFileName = 'rowAndColumnsTest2';
  571. $exportItem->modelClassName = 'SavedReport';
  572. $exportItem->serializedData = ExportUtil::getSerializedDataForExport($dataProvider);
  573. $this->assertTrue($exportItem->save());
  574. $id = $exportItem->id;
  575. $exportItem->forget();
  576. unset($exportItem);
  577. //Delete queued jobs from test exportItems created above
  578. Yii::app()->jobQueue->deleteAll();
  579. ExportModule::$asynchronousPageSize = 2;
  580. $job = new ExportJob();
  581. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  582. $this->assertTrue($job->run());
  583. $this->assertEquals(0, count(Yii::app()->jobQueue->getAll()));
  584. $exportItem = ExportItem::getById($id);
  585. $fileModel = $exportItem->exportFileModel;
  586. $this->assertEquals(1, $exportItem->isCompleted);
  587. $this->assertEquals(0, $exportItem->processOffset);
  588. $this->assertEquals('csv', $exportItem->exportFileType);
  589. $this->assertEquals('rowAndColumnsTest2', $exportItem->exportFileName);
  590. $this->assertTrue($fileModel instanceOf ExportFileModel);
  591. $accounts = Account::getAll();
  592. $headerData = array('Name');
  593. $data = array();
  594. foreach ($accounts as $account)
  595. {
  596. $data[] = array($account->name);
  597. }
  598. $output = ExportItemToCsvFileUtil::export($data, $headerData, 'rowAndColumnsTest2.csv', false);
  599. $this->assertEquals($output, $fileModel->fileContent->content);
  600. // Check if user got notification message, and if its type is ExportProcessCompleted
  601. $this->assertEquals($numberOfUserNotifications + 1,
  602. Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel));
  603. //Matrix report should not paginate
  604. $report = new Report();
  605. $report->setType(Report::TYPE_MATRIX);
  606. $report->setModuleClassName('AccountsModule');
  607. $report->setFiltersStructure('');
  608. $displayAttribute = new DisplayAttributeForReportForm('AccountsModule', 'Account',
  609. Report::TYPE_MATRIX);
  610. $displayAttribute->setModelAliasUsingTableAliasName('model1');
  611. $displayAttribute->attributeIndexOrDerivedType = 'Count';
  612. $report->addDisplayAttribute($displayAttribute);
  613. $groupBy = new GroupByForReportForm('AccountsModule', 'Account',
  614. Report::TYPE_MATRIX);
  615. $groupBy->attributeIndexOrDerivedType = 'name';
  616. $groupBy->axis = 'y';
  617. $report->addGroupBy($groupBy);
  618. $groupBy = new GroupByForReportForm('AccountsModule', 'Account',
  619. Report::TYPE_MATRIX);
  620. $groupBy->attributeIndexOrDerivedType = 'officePhone';
  621. $report->addGroupBy($groupBy);
  622. $dataProvider = new MatrixReportDataProvider($report);
  623. $exportItem = new ExportItem();
  624. $exportItem->isCompleted = 0;
  625. $exportItem->exportFileType = 'csv';
  626. $exportItem->exportFileName = 'matrixTest1';
  627. $exportItem->modelClassName = 'SavedReport';
  628. $exportItem->serializedData = ExportUtil::getSerializedDataForExport($dataProvider);
  629. $this->assertTrue($exportItem->save());
  630. $id = $exportItem->id;
  631. $exportItem->forget();
  632. unset($exportItem);
  633. //Delete queued jobs from test exportItems created above
  634. Yii::app()->jobQueue->deleteAll();
  635. ExportModule::$asynchronousPageSize = 2;
  636. $job = new ExportJob();
  637. $this->assertTrue($job->run());
  638. $exportItem = ExportItem::getById($id);
  639. $fileModel = $exportItem->exportFileModel;
  640. $this->assertEquals(1, $exportItem->isCompleted);
  641. $this->assertEquals(0, $exportItem->processOffset);
  642. $this->assertEquals('csv', $exportItem->exportFileType);
  643. $this->assertEquals('matrixTest1', $exportItem->exportFileName);
  644. $this->assertTrue($fileModel instanceOf ExportFileModel);
  645. $fileContent = $fileModel->fileContent->content;
  646. $this->assertContains('Test Account', $fileContent);
  647. $this->assertContains('Test Account 2', $fileContent);
  648. $this->assertContains('Test Account 3', $fileContent);
  649. $this->assertContains('Test Account 4', $fileContent);
  650. // Check if user got notification message, and if its type is ExportProcessCompleted
  651. $this->assertEquals($numberOfUserNotifications + 2,
  652. Notification::getCountByTypeAndUser('ExportProcessCompleted', Yii::app()->user->userModel));
  653. }
  654. }
  655. ?>