PageRenderTime 44ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

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

https://bitbucket.org/ddonthula/zurmofeb
PHP | 254 lines | 210 code | 17 blank | 27 comment | 3 complexity | e4aab86c72082db15b0cc12ce84be8fa MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, BSD-2-Clause, GPL-3.0, BSD-3-Clause, LGPL-3.0
  1. <?php
  2. /*********************************************************************************
  3. * Zurmo is a customer relationship management program developed by
  4. * Zurmo, Inc. Copyright (C) 2012 Zurmo Inc.
  5. *
  6. * Zurmo is free software; you can redistribute it and/or modify it under
  7. * the terms of the GNU 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 General Public License for more
  16. * details.
  17. *
  18. * You should have received a copy of the GNU 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 113 McHenry Road Suite 207,
  24. * Buffalo Grove, IL 60089, USA. or at email address contact@zurmo.com.
  25. ********************************************************************************/
  26. class ReportDataProviderTest extends ZurmoBaseTest
  27. {
  28. public static function setUpBeforeClass()
  29. {
  30. parent::setUpBeforeClass();
  31. ContactsModule::loadStartingData();
  32. SecurityTestHelper::createSuperAdmin();
  33. $sally = UserTestHelper::createBasicUser('sally');
  34. $sally->setRight('AccountsModule', AccountsModule::RIGHT_ACCESS_ACCOUNTS);
  35. $sally->setRight('ContactsModule', ContactsModule::RIGHT_ACCESS_CONTACTS);
  36. $sally->setRight('MeetingsModule', MeetingsModule::RIGHT_ACCESS_MEETINGS);
  37. $sally->setRight('OpportunitiesModule', OpportunitiesModule::RIGHT_ACCESS_OPPORTUNITIES);
  38. $sally->setRight('ReportsTestModule', ReportsTestModule::RIGHT_ACCESS_REPORTS_TESTS);
  39. if(!$sally->save())
  40. {
  41. throw new FailedToSaveModelException();
  42. }
  43. $sarah = UserTestHelper::createBasicUser('sarah');
  44. $sarah->setRight('AccountsModule', AccountsModule::RIGHT_ACCESS_ACCOUNTS);
  45. $sarah->setRight('LeadsModule', LeadsModule::RIGHT_ACCESS_LEADS);
  46. $sarah->setRight('MeetingsModule', MeetingsModule::RIGHT_ACCESS_MEETINGS);
  47. $sarah->setRight('OpportunitiesModule', OpportunitiesModule::RIGHT_ACCESS_OPPORTUNITIES);
  48. $sarah->setRight('ReportsTestModule', ReportsTestModule::RIGHT_ACCESS_REPORTS_TESTS);
  49. if(!$sarah->save())
  50. {
  51. throw new FailedToSaveModelException();
  52. }
  53. $nobody = UserTestHelper::createBasicUser('nobody');
  54. if(!$nobody->save())
  55. {
  56. throw new FailedToSaveModelException();
  57. }
  58. }
  59. public function testResolveFiltersForReadPermissionsWithoutAnyExistingFiltersForASuperUser()
  60. {
  61. Yii::app()->user->userModel = User::getByUsername('super');
  62. $report = new Report();
  63. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  64. $report->setModuleClassName('ReportsTestModule');
  65. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  66. $filtersStructure = '';
  67. $filters = array();
  68. $filters = $reportDataProvider->resolveFiltersForReadPermissions($filters, $filtersStructure);
  69. $this->assertEquals(0, count($filters));
  70. $this->assertEquals('', $filtersStructure);
  71. }
  72. public function testResolveFiltersForReadPermissionsWithoutAnyExistingFiltersForANonSuperUser()
  73. {
  74. Yii::app()->user->userModel = User::getByUsername('sally');
  75. $report = new Report();
  76. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  77. $report->setModuleClassName('ReportsTestModule');
  78. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  79. $filtersStructure = '';
  80. $filters = array();
  81. $filters = $reportDataProvider->resolveFiltersForReadPermissions($filters, $filtersStructure);
  82. $this->assertEquals(2, count($filters));
  83. $this->assertEquals('owner__User', $filters[0]->attributeIndexOrDerivedType);
  84. $this->assertEquals('ReadOptimization', $filters[1]->attributeIndexOrDerivedType);
  85. $this->assertEquals('(1 or 2)', $filtersStructure);
  86. }
  87. public function testResolveFiltersForReadPermissionsWithOneDisplayAttributeAndOneFilterForANonSuperUser()
  88. {
  89. Yii::app()->user->userModel = User::getByUsername('sally');
  90. $report = new Report();
  91. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  92. $report->setModuleClassName('ReportsTestModule');
  93. $displayAttribute = new DisplayAttributeForReportForm('ReportsTestModule', 'ReportModelTestItem',
  94. Report::TYPE_ROWS_AND_COLUMNS);
  95. $displayAttribute->attributeIndexOrDerivedType = 'hasOne___name';
  96. $report->addDisplayAttribute($displayAttribute);
  97. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  98. $filtersStructure = '1';
  99. $filter = new FilterForReportForm('ReportsTestModule', 'ReportModelTestItem',
  100. Report::TYPE_ROWS_AND_COLUMNS);
  101. $filter->attributeIndexOrDerivedType = 'string';
  102. $filter->operator = OperatorRules::TYPE_EQUALS;
  103. $filter->value = 'Zurmo';
  104. $filters = array($filter);
  105. $filters = $reportDataProvider->resolveFiltersForReadPermissions($filters, $filtersStructure);
  106. $this->assertEquals(5, count($filters));
  107. $this->assertEquals('owner__User', $filters[1]->attributeIndexOrDerivedType);
  108. $this->assertEquals('ReadOptimization', $filters[2]->attributeIndexOrDerivedType);
  109. $this->assertEquals('hasOne___owner__User', $filters[3]->attributeIndexOrDerivedType);
  110. $this->assertEquals('hasOne___ReadOptimization', $filters[4]->attributeIndexOrDerivedType);
  111. $this->assertEquals('1 and ((2 or 3) and (4 or 5))', $filtersStructure);
  112. }
  113. public function testResolveFiltersForVariableStatesWithoutAnyExistingFiltersForASuperUser()
  114. {
  115. Yii::app()->user->userModel = User::getByUsername('super');
  116. $report = new Report();
  117. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  118. $report->setModuleClassName('ContactsModule');
  119. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  120. $filtersStructure = '';
  121. $filters = array();
  122. $filters = $reportDataProvider->resolveFiltersForVariableStates($filters, $filtersStructure);
  123. $this->assertEquals(0, count($filters));
  124. $this->assertEquals('', $filtersStructure);
  125. }
  126. public function testResolveFiltersForVariableStatesWithoutAnyExistingFiltersForANonSuperUserWhoCanSeeOneState()
  127. {
  128. Yii::app()->user->userModel = User::getByUsername('sally');
  129. $report = new Report();
  130. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  131. $report->setModuleClassName('ContactsModule');
  132. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  133. $filtersStructure = '';
  134. $filters = array();
  135. $filters = $reportDataProvider->resolveFiltersForVariableStates($filters, $filtersStructure);
  136. $stateAdapter = new ContactsStateMetadataAdapter(array('clauses' => array(), 'structure' => ''));
  137. $this->assertTrue(count($stateAdapter->getStateIds()) > 0);
  138. $this->assertEquals(1, count($filters));
  139. $this->assertEquals('state', $filters[0]->attributeIndexOrDerivedType);
  140. $this->assertEquals(OperatorRules::TYPE_ONE_OF, $filters[0]->operator);
  141. $this->assertEquals($stateAdapter->getStateIds(), $filters[0]->value);
  142. $this->assertEquals('1', $filtersStructure);
  143. }
  144. public function testResolveFiltersForVariableStatesWithoutAnyExistingFiltersForANonSuperUserWhoCanSeeAnotherState()
  145. {
  146. Yii::app()->user->userModel = User::getByUsername('sarah');
  147. $report = new Report();
  148. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  149. $report->setModuleClassName('ContactsModule');
  150. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  151. $filtersStructure = '';
  152. $filters = array();
  153. $filters = $reportDataProvider->resolveFiltersForVariableStates($filters, $filtersStructure);
  154. $stateAdapter = new LeadsStateMetadataAdapter(array('clauses' => array(), 'structure' => ''));
  155. $this->assertTrue(count($stateAdapter->getStateIds()) > 0);
  156. $this->assertEquals(1, count($filters));
  157. $this->assertEquals('state', $filters[0]->attributeIndexOrDerivedType);
  158. $this->assertEquals(OperatorRules::TYPE_ONE_OF, $filters[0]->operator);
  159. $this->assertEquals($stateAdapter->getStateIds(), $filters[0]->value);
  160. $this->assertEquals('1', $filtersStructure);
  161. }
  162. /**
  163. * @expectedException PartialRightsForReportSecurityException
  164. **/
  165. public function testPartialRightsForReportSecurityExceptionThrown()
  166. {
  167. Yii::app()->user->userModel = User::getByUsername('nobody');
  168. $report = new Report();
  169. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  170. $report->setModuleClassName('ContactsModule');
  171. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  172. $filtersStructure = '';
  173. $filters = array();
  174. $reportDataProvider->resolveFiltersForVariableStates($filters, $filtersStructure);
  175. }
  176. public function testResolveFiltersForVariableStatesWithOneDisplayAttributeAndOneFilterForANonSuperUserWhoCanSeeOneState()
  177. {
  178. Yii::app()->user->userModel = User::getByUsername('sally');
  179. $report = new Report();
  180. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  181. $report->setModuleClassName('AccountsModule');
  182. $displayAttribute = new DisplayAttributeForReportForm('AccountsModule', 'Account',
  183. Report::TYPE_ROWS_AND_COLUMNS);
  184. $displayAttribute->attributeIndexOrDerivedType = 'contacts___officePhone';
  185. $report->addDisplayAttribute($displayAttribute);
  186. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  187. $filtersStructure = '1';
  188. $filter = new FilterForReportForm('AccountsModule', 'Account',
  189. Report::TYPE_ROWS_AND_COLUMNS);
  190. $filter->attributeIndexOrDerivedType = 'opportunities___contacts___website';
  191. $filter->operator = OperatorRules::TYPE_EQUALS;
  192. $filter->value = 'Zurmo';
  193. $filters = array($filter);
  194. $filters = $reportDataProvider->resolveFiltersForVariableStates($filters, $filtersStructure);
  195. $stateAdapter = new ContactsStateMetadataAdapter(array('clauses' => array(), 'structure' => ''));
  196. $this->assertTrue(count($stateAdapter->getStateIds()) > 0);
  197. $this->assertEquals(3, count($filters));
  198. $this->assertEquals('contacts___state', $filters[1]->attributeIndexOrDerivedType);
  199. $this->assertEquals(OperatorRules::TYPE_ONE_OF, $filters[1]->operator);
  200. $this->assertEquals($stateAdapter->getStateIds(), $filters[1]->value);
  201. $this->assertEquals('opportunities___contacts___state', $filters[2]->attributeIndexOrDerivedType);
  202. $this->assertEquals(OperatorRules::TYPE_ONE_OF, $filters[2]->operator);
  203. $this->assertEquals($stateAdapter->getStateIds(), $filters[2]->value);
  204. $this->assertEquals('1 and (2 and 3)', $filtersStructure);
  205. }
  206. public function testResolveFiltersForVariableStatesWithOneDisplayAttributeAndOneFilterForANonSuperUserWhoCanSeeAnotherState()
  207. {
  208. Yii::app()->user->userModel = User::getByUsername('sarah');
  209. $report = new Report();
  210. $report->setType(Report::TYPE_ROWS_AND_COLUMNS);
  211. $report->setModuleClassName('AccountsModule');
  212. $displayAttribute = new DisplayAttributeForReportForm('AccountsModule', 'Account',
  213. Report::TYPE_ROWS_AND_COLUMNS);
  214. $displayAttribute->attributeIndexOrDerivedType = 'contacts___officePhone';
  215. $report->addDisplayAttribute($displayAttribute);
  216. $reportDataProvider = new RowsAndColumnsReportDataProvider($report);
  217. $filtersStructure = '1';
  218. $filter = new FilterForReportForm('AccountsModule', 'Account',
  219. Report::TYPE_ROWS_AND_COLUMNS);
  220. $filter->attributeIndexOrDerivedType = 'opportunities___contacts___website';
  221. $filter->operator = OperatorRules::TYPE_EQUALS;
  222. $filter->value = 'Zurmo';
  223. $filters = array($filter);
  224. $filters = $reportDataProvider->resolveFiltersForVariableStates($filters, $filtersStructure);
  225. $stateAdapter = new LeadsStateMetadataAdapter(array('clauses' => array(), 'structure' => ''));
  226. $this->assertTrue(count($stateAdapter->getStateIds()) > 0);
  227. $this->assertEquals(3, count($filters));
  228. $this->assertEquals('contacts___state', $filters[1]->attributeIndexOrDerivedType);
  229. $this->assertEquals(OperatorRules::TYPE_ONE_OF, $filters[1]->operator);
  230. $this->assertEquals($stateAdapter->getStateIds(), $filters[1]->value);
  231. $this->assertEquals('opportunities___contacts___state', $filters[2]->attributeIndexOrDerivedType);
  232. $this->assertEquals(OperatorRules::TYPE_ONE_OF, $filters[2]->operator);
  233. $this->assertEquals($stateAdapter->getStateIds(), $filters[2]->value);
  234. $this->assertEquals('1 and (2 and 3)', $filtersStructure);
  235. }
  236. }
  237. ?>