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

/app/protected/modules/reports/tests/unit/ReportDataProviderTest.php

https://bitbucket.org/zurmo/zurmo/
PHP | 302 lines | 244 code | 21 blank | 37 comment | 3 complexity | 98b5d55d576c606b37cc61728fd16069 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 ReportDataProviderTest extends ZurmoBaseTest
  37. {
  38. public static function setUpBeforeClass()
  39. {
  40. parent::setUpBeforeClass();
  41. ContactsModule::loadStartingData();
  42. SecurityTestHelper::createSuperAdmin();
  43. $sally = UserTestHelper::createBasicUser('sally');
  44. $sally->setRight('AccountsModule', AccountsModule::RIGHT_ACCESS_ACCOUNTS);
  45. $sally->setRight('ContactsModule', ContactsModule::RIGHT_ACCESS_CONTACTS);
  46. $sally->setRight('MeetingsModule', MeetingsModule::RIGHT_ACCESS_MEETINGS);
  47. $sally->setRight('OpportunitiesModule', OpportunitiesModule::RIGHT_ACCESS_OPPORTUNITIES);
  48. $sally->setRight('ReportsTestModule', ReportsTestModule::RIGHT_ACCESS_REPORTS_TESTS);
  49. if (!$sally->save())
  50. {
  51. throw new FailedToSaveModelException();
  52. }
  53. $sarah = UserTestHelper::createBasicUser('sarah');
  54. $sarah->setRight('AccountsModule', AccountsModule::RIGHT_ACCESS_ACCOUNTS);
  55. $sarah->setRight('LeadsModule', LeadsModule::RIGHT_ACCESS_LEADS);
  56. $sarah->setRight('MeetingsModule', MeetingsModule::RIGHT_ACCESS_MEETINGS);
  57. $sarah->setRight('OpportunitiesModule', OpportunitiesModule::RIGHT_ACCESS_OPPORTUNITIES);
  58. $sarah->setRight('ReportsTestModule', ReportsTestModule::RIGHT_ACCESS_REPORTS_TESTS);
  59. if (!$sarah->save())
  60. {
  61. throw new FailedToSaveModelException();
  62. }
  63. $nobody = UserTestHelper::createBasicUser('nobody');
  64. if (!$nobody->save())
  65. {
  66. throw new FailedToSaveModelException();
  67. }
  68. }
  69. public static function getDependentTestModelClassNames()
  70. {
  71. return array('ReportModelTestItem', 'ReportModelTestItem2');
  72. }
  73. public function testResolveFiltersForReadPermissionsWithoutAnyExistingFiltersForASuperUser()
  74. {
  75. Yii::app()->user->userModel = User::getByUsername('super');
  76. $report = new Report();
  77. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  78. $report->setModuleClassName('ReportsTestModule');
  79. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  80. $filtersStructure = '';
  81. $filters = array();
  82. $filters = $reportDataProvider->resolveFiltersForReadPermissions($filters, $filtersStructure);
  83. $this->assertEquals(0, count($filters));
  84. $this->assertEquals('', $filtersStructure);
  85. }
  86. public function testResolveFiltersForReadPermissionsWithoutAnyExistingFiltersForANonSuperUser()
  87. {
  88. Yii::app()->user->userModel = User::getByUsername('sally');
  89. $report = new Report();
  90. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  91. $report->setModuleClassName('ReportsTestModule');
  92. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  93. $filtersStructure = '';
  94. $filters = array();
  95. $filters = $reportDataProvider->resolveFiltersForReadPermissions($filters, $filtersStructure);
  96. $this->assertEquals(2, count($filters));
  97. $this->assertEquals('owner__User', $filters[0]->attributeIndexOrDerivedType);
  98. $this->assertEquals('ReadOptimization', $filters[1]->attributeIndexOrDerivedType);
  99. $this->assertEquals('(1 or 2)', $filtersStructure);
  100. }
  101. public function testResolveFiltersForReadPermissionsWithOneDisplayAttributeAndOneFilterForANonSuperUser()
  102. {
  103. Yii::app()->user->userModel = User::getByUsername('sally');
  104. $report = new Report();
  105. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  106. $report->setModuleClassName('ReportsTestModule');
  107. $displayAttribute = new DisplayAttributeForReportForm('ReportsTestModule', 'ReportModelTestItem',
  108. Report::TYPE_ROWS_AND_COLUMNS);
  109. $displayAttribute->attributeIndexOrDerivedType = 'hasOne___name';
  110. $report->addDisplayAttribute($displayAttribute);
  111. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  112. $filtersStructure = '1';
  113. $filter = new FilterForReportForm('ReportsTestModule', 'ReportModelTestItem',
  114. Report::TYPE_ROWS_AND_COLUMNS);
  115. $filter->attributeIndexOrDerivedType = 'string';
  116. $filter->operator = OperatorRules::TYPE_EQUALS;
  117. $filter->value = 'Zurmo';
  118. $filters = array($filter);
  119. $filters = $reportDataProvider->resolveFiltersForReadPermissions($filters, $filtersStructure);
  120. $this->assertEquals(5, count($filters));
  121. $this->assertEquals('owner__User', $filters[1]->attributeIndexOrDerivedType);
  122. $this->assertEquals('ReadOptimization', $filters[2]->attributeIndexOrDerivedType);
  123. $this->assertEquals('hasOne___owner__User', $filters[3]->attributeIndexOrDerivedType);
  124. $this->assertEquals('hasOne___ReadOptimization', $filters[4]->attributeIndexOrDerivedType);
  125. $this->assertEquals('1 and ((2 or 3) and (4 or 5))', $filtersStructure);
  126. }
  127. public function testResolveFiltersForVariableStatesWithoutAnyExistingFiltersForASuperUser()
  128. {
  129. Yii::app()->user->userModel = User::getByUsername('super');
  130. $report = new Report();
  131. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  132. $report->setModuleClassName('ContactsModule');
  133. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  134. $filtersStructure = '';
  135. $filters = array();
  136. $filters = $reportDataProvider->resolveFiltersForVariableStates($filters, $filtersStructure);
  137. $this->assertEquals(0, count($filters));
  138. $this->assertEquals('', $filtersStructure);
  139. }
  140. public function testResolveFiltersForVariableStatesWithoutAnyExistingFiltersForANonSuperUserWhoCanSeeOneState()
  141. {
  142. Yii::app()->user->userModel = User::getByUsername('sally');
  143. $report = new Report();
  144. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  145. $report->setModuleClassName('ContactsModule');
  146. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  147. $filtersStructure = '';
  148. $filters = array();
  149. $filters = $reportDataProvider->resolveFiltersForVariableStates($filters, $filtersStructure);
  150. $stateAdapter = new ContactsStateMetadataAdapter(array('clauses' => array(), 'structure' => ''));
  151. $this->assertTrue(count($stateAdapter->getStateIds()) > 0);
  152. $this->assertEquals(1, count($filters));
  153. $this->assertEquals('state', $filters[0]->attributeIndexOrDerivedType);
  154. $this->assertEquals(OperatorRules::TYPE_ONE_OF, $filters[0]->operator);
  155. $this->assertEquals($stateAdapter->getStateIds(), $filters[0]->value);
  156. $this->assertEquals('1', $filtersStructure);
  157. }
  158. public function testResolveFiltersForVariableStatesWithoutAnyExistingFiltersForANonSuperUserWhoCanSeeAnotherState()
  159. {
  160. Yii::app()->user->userModel = User::getByUsername('sarah');
  161. $report = new Report();
  162. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  163. $report->setModuleClassName('ContactsModule');
  164. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  165. $filtersStructure = '';
  166. $filters = array();
  167. $filters = $reportDataProvider->resolveFiltersForVariableStates($filters, $filtersStructure);
  168. $stateAdapter = new LeadsStateMetadataAdapter(array('clauses' => array(), 'structure' => ''));
  169. $this->assertTrue(count($stateAdapter->getStateIds()) > 0);
  170. $this->assertEquals(1, count($filters));
  171. $this->assertEquals('state', $filters[0]->attributeIndexOrDerivedType);
  172. $this->assertEquals(OperatorRules::TYPE_ONE_OF, $filters[0]->operator);
  173. $this->assertEquals($stateAdapter->getStateIds(), $filters[0]->value);
  174. $this->assertEquals('1', $filtersStructure);
  175. }
  176. /**
  177. * @expectedException PartialRightsForReportSecurityException
  178. **/
  179. public function testPartialRightsForReportSecurityExceptionThrown()
  180. {
  181. Yii::app()->user->userModel = User::getByUsername('nobody');
  182. $report = new Report();
  183. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  184. $report->setModuleClassName('ContactsModule');
  185. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  186. $filtersStructure = '';
  187. $filters = array();
  188. $reportDataProvider->resolveFiltersForVariableStates($filters, $filtersStructure);
  189. }
  190. public function testResolveFiltersForVariableStatesWithOneDisplayAttributeAndOneFilterForANonSuperUserWhoCanSeeOneState()
  191. {
  192. Yii::app()->user->userModel = User::getByUsername('sally');
  193. $report = new Report();
  194. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  195. $report->setModuleClassName('AccountsModule');
  196. $displayAttribute = new DisplayAttributeForReportForm('AccountsModule', 'Account',
  197. Report::TYPE_ROWS_AND_COLUMNS);
  198. $displayAttribute->attributeIndexOrDerivedType = 'contacts___officePhone';
  199. $report->addDisplayAttribute($displayAttribute);
  200. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  201. $filtersStructure = '1';
  202. $filter = new FilterForReportForm('AccountsModule', 'Account',
  203. Report::TYPE_ROWS_AND_COLUMNS);
  204. $filter->attributeIndexOrDerivedType = 'opportunities___contacts___website';
  205. $filter->operator = OperatorRules::TYPE_EQUALS;
  206. $filter->value = 'Zurmo';
  207. $filters = array($filter);
  208. $filters = $reportDataProvider->resolveFiltersForVariableStates($filters, $filtersStructure);
  209. $stateAdapter = new ContactsStateMetadataAdapter(array('clauses' => array(), 'structure' => ''));
  210. $this->assertTrue(count($stateAdapter->getStateIds()) > 0);
  211. $this->assertEquals(3, count($filters));
  212. $this->assertEquals('contacts___state', $filters[1]->attributeIndexOrDerivedType);
  213. $this->assertEquals(OperatorRules::TYPE_ONE_OF, $filters[1]->operator);
  214. $this->assertEquals($stateAdapter->getStateIds(), $filters[1]->value);
  215. $this->assertEquals('opportunities___contacts___state', $filters[2]->attributeIndexOrDerivedType);
  216. $this->assertEquals(OperatorRules::TYPE_ONE_OF, $filters[2]->operator);
  217. $this->assertEquals($stateAdapter->getStateIds(), $filters[2]->value);
  218. $this->assertEquals('1 and (2 and 3)', $filtersStructure);
  219. }
  220. public function testResolveFiltersForVariableStatesWithOneDisplayAttributeAndOneFilterForANonSuperUserWhoCanSeeAnotherState()
  221. {
  222. Yii::app()->user->userModel = User::getByUsername('sarah');
  223. $report = new Report();
  224. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  225. $report->setModuleClassName('AccountsModule');
  226. $displayAttribute = new DisplayAttributeForReportForm('AccountsModule', 'Account',
  227. Report::TYPE_ROWS_AND_COLUMNS);
  228. $displayAttribute->attributeIndexOrDerivedType = 'contacts___officePhone';
  229. $report->addDisplayAttribute($displayAttribute);
  230. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  231. $filtersStructure = '1';
  232. $filter = new FilterForReportForm('AccountsModule', 'Account',
  233. Report::TYPE_ROWS_AND_COLUMNS);
  234. $filter->attributeIndexOrDerivedType = 'opportunities___contacts___website';
  235. $filter->operator = OperatorRules::TYPE_EQUALS;
  236. $filter->value = 'Zurmo';
  237. $filters = array($filter);
  238. $filters = $reportDataProvider->resolveFiltersForVariableStates($filters, $filtersStructure);
  239. $stateAdapter = new LeadsStateMetadataAdapter(array('clauses' => array(), 'structure' => ''));
  240. $this->assertTrue(count($stateAdapter->getStateIds()) > 0);
  241. $this->assertEquals(3, count($filters));
  242. $this->assertEquals('contacts___state', $filters[1]->attributeIndexOrDerivedType);
  243. $this->assertEquals(OperatorRules::TYPE_ONE_OF, $filters[1]->operator);
  244. $this->assertEquals($stateAdapter->getStateIds(), $filters[1]->value);
  245. $this->assertEquals('opportunities___contacts___state', $filters[2]->attributeIndexOrDerivedType);
  246. $this->assertEquals(OperatorRules::TYPE_ONE_OF, $filters[2]->operator);
  247. $this->assertEquals($stateAdapter->getStateIds(), $filters[2]->value);
  248. $this->assertEquals('1 and (2 and 3)', $filtersStructure);
  249. }
  250. public function testSqlQueryWithLinkTypeSpecificOnRelatedModels()
  251. {
  252. $quote = DatabaseCompatibilityUtil::getQuote();
  253. Yii::app()->user->userModel = User::getByUsername('super');
  254. $reportModelTestItem2 = new ReportModelTestItem2();
  255. $reportModelTestItem2->name = 'name';
  256. $this->assertTrue($reportModelTestItem2->save());
  257. $reportModelTestItem = new ReportModelTestItem();
  258. $reportModelTestItem->lastName = 'lastName';
  259. $reportModelTestItem->string = 'string';
  260. $reportModelTestItem->hasOne = $reportModelTestItem2;
  261. $this->assertTrue($reportModelTestItem->save());
  262. $report = new Report();
  263. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  264. $report->setModuleClassName('ReportsTest2Module');
  265. $report->setFiltersStructure('');
  266. $displayAttribute1 = new DisplayAttributeForReportForm('ReportsTest2Module', 'ReportModelTestItem2',
  267. Report::TYPE_ROWS_AND_COLUMNS);
  268. $displayAttribute1->setModelAliasUsingTableAliasName('relatedModel');
  269. $displayAttribute1->attributeIndexOrDerivedType = 'hasMany2___FullName';
  270. $report->addDisplayAttribute($displayAttribute1);
  271. $dataProvider = new RowsAndColumnsReportDataProvider($report);
  272. $content = $dataProvider->makeSqlQueryForDisplay();
  273. $compareContent = "select {$quote}reportmodeltestitem{$quote}.{$quote}id{$quote} reportmodeltestitemid " .
  274. "from {$quote}reportmodeltestitem2{$quote} " .
  275. "left join {$quote}reportmodeltestitem{$quote} on " .
  276. "{$quote}reportmodeltestitem{$quote}.{$quote}hasone_reportmodeltestitem2_id{$quote} " .
  277. "= {$quote}reportmodeltestitem2{$quote}.{$quote}id{$quote} limit 10 offset 0";
  278. $this->assertEquals($compareContent, $content);
  279. }
  280. }
  281. ?>