Commit | Line | Data |
---|---|---|
8fc33241 | 1 | <?php |
2 | /* | |
3 | +--------------------------------------------------------------------+ | |
7d61e75f | 4 | | Copyright CiviCRM LLC. All rights reserved. | |
8fc33241 | 5 | | | |
7d61e75f TO |
6 | | This work is published under the GNU AGPLv3 license with some | |
7 | | permitted exceptions and without any warranty. For full license | | |
8 | | and copyright information, see https://civicrm.org/licensing | | |
8fc33241 | 9 | +--------------------------------------------------------------------+ |
10 | */ | |
11 | ||
12 | /** | |
13 | * Test Contact Summary report outcome | |
14 | * | |
15 | * @package CiviCRM | |
16 | */ | |
17 | class CRM_Report_Form_ContactSummaryTest extends CiviReportTestCase { | |
9099cab3 | 18 | protected $_tablesToTruncate = [ |
8fc33241 | 19 | 'civicrm_contact', |
20 | 'civicrm_email', | |
21 | 'civicrm_phone', | |
22 | 'civicrm_address', | |
9099cab3 | 23 | ]; |
8fc33241 | 24 | |
25 | public function setUp() { | |
26 | parent::setUp(); | |
27 | $this->quickCleanup($this->_tablesToTruncate); | |
28 | } | |
29 | ||
30 | public function tearDown() { | |
31 | parent::tearDown(); | |
32 | } | |
33 | ||
34 | /** | |
35 | * Ensure the new Odd/Event street number sort column works correctly | |
36 | */ | |
37 | public function testOddEvenStreetNumber() { | |
ea39e229 SL |
38 | $customLocationType = $this->callAPISuccess('LocationType', 'create', [ |
39 | 'name' => 'Custom Location Type', | |
40 | 'display_name' => 'CiviTest Custom Location Type', | |
41 | 'is_active' => 1, | |
42 | ]); | |
8fc33241 | 43 | // Create 5 contacts where: |
44 | // Contact A - Odd Street number - 3 | |
45 | // Contact B - Odd Street number - 5 | |
46 | // Contact C - Even Street number - 2 | |
47 | // Contact D - Even Street number - 4 | |
48 | // Contact E - No Street number | |
49 | $contactIDs = [ | |
50 | 'odd_street_number_1' => $this->individualCreate([ | |
51 | 'api.Address.create' => [ | |
52 | 'location_type_id' => 1, | |
53 | 'is_primary' => 1, | |
54 | 'street_number' => 3, | |
39b959db | 55 | ], |
8fc33241 | 56 | ]), |
57 | 'odd_street_number_2' => $this->individualCreate([ | |
58 | 'api.Address.create' => [ | |
59 | 'location_type_id' => 1, | |
60 | 'is_primary' => 1, | |
61 | 'street_number' => 5, | |
39b959db | 62 | ], |
8fc33241 | 63 | ]), |
64 | 'even_street_number_1' => $this->individualCreate([ | |
65 | 'api.Address.create' => [ | |
66 | 'location_type_id' => 1, | |
67 | 'is_primary' => 1, | |
68 | 'street_number' => 2, | |
39b959db | 69 | ], |
8fc33241 | 70 | ]), |
71 | 'even_street_number_2' => $this->individualCreate([ | |
72 | 'api.Address.create' => [ | |
73 | 'location_type_id' => 1, | |
74 | 'is_primary' => 1, | |
75 | 'street_number' => 4, | |
39b959db | 76 | ], |
8fc33241 | 77 | ]), |
78 | 'no_street_number' => $this->individualCreate(), | |
79 | ]; | |
ea39e229 SL |
80 | // Create a non primary address to check that we are only outputting primary contact details. |
81 | $this->callAPISuccess('Address', 'create', [ | |
82 | 'contact_id' => $contactIDs['even_street_number_2'], | |
83 | 'location_type_id' => $customLocationType['id'], | |
84 | 'is_primary' => 0, | |
85 | 'street_number' => 6, | |
86 | ]); | |
8fc33241 | 87 | $input = [ |
88 | 'fields' => [ | |
89 | 'address_street_number', | |
90 | 'address_odd_street_number', | |
91 | ], | |
92 | ]; | |
93 | $obj = $this->getReportObject('CRM_Report_Form_Contact_Summary', $input); | |
94 | ||
95 | $expectedCases = [ | |
96 | // CASE A: Sorting by odd street number in desc order + street number in desc order | |
97 | [ | |
98 | 'order_bys' => [ | |
99 | [ | |
100 | 'column' => 'address_odd_street_number', | |
101 | 'order' => 'DESC', | |
102 | ], | |
103 | [ | |
104 | 'column' => 'address_street_number', | |
105 | 'order' => 'DESC', | |
106 | ], | |
107 | ], | |
108 | 'expected_contact_ids' => [ | |
109 | $contactIDs['odd_street_number_2'], | |
110 | $contactIDs['odd_street_number_1'], | |
111 | $contactIDs['even_street_number_2'], | |
112 | $contactIDs['even_street_number_1'], | |
113 | $contactIDs['no_street_number'], | |
114 | ], | |
115 | 'expected_orderby_clause' => 'ORDER BY (address_civireport.street_number % 2) DESC, address_civireport.street_number DESC', | |
116 | ], | |
117 | // CASE B: Sorting by odd street number in asc order + street number in desc order | |
118 | [ | |
119 | 'order_bys' => [ | |
120 | [ | |
121 | 'column' => 'address_odd_street_number', | |
122 | 'order' => 'ASC', | |
123 | ], | |
124 | [ | |
125 | 'column' => 'address_street_number', | |
126 | 'order' => 'DESC', | |
127 | ], | |
128 | ], | |
129 | 'expected_contact_ids' => [ | |
130 | $contactIDs['no_street_number'], | |
131 | $contactIDs['even_street_number_2'], | |
132 | $contactIDs['even_street_number_1'], | |
133 | $contactIDs['odd_street_number_2'], | |
134 | $contactIDs['odd_street_number_1'], | |
135 | ], | |
136 | 'expected_orderby_clause' => 'ORDER BY (address_civireport.street_number % 2) ASC, address_civireport.street_number DESC', | |
137 | ], | |
138 | // CASE C: Sorting by odd street number in desc order + street number in asc order | |
139 | [ | |
140 | 'order_bys' => [ | |
141 | [ | |
142 | 'column' => 'address_odd_street_number', | |
143 | 'order' => 'DESC', | |
144 | ], | |
145 | [ | |
146 | 'column' => 'address_street_number', | |
147 | 'order' => 'ASC', | |
148 | ], | |
149 | ], | |
150 | 'expected_contact_ids' => [ | |
151 | $contactIDs['odd_street_number_1'], | |
152 | $contactIDs['odd_street_number_2'], | |
153 | $contactIDs['even_street_number_1'], | |
154 | $contactIDs['even_street_number_2'], | |
155 | $contactIDs['no_street_number'], | |
156 | ], | |
157 | 'expected_orderby_clause' => 'ORDER BY (address_civireport.street_number % 2) DESC, address_civireport.street_number ASC', | |
158 | ], | |
159 | // CASE A: Sorting by odd street number in asc order + street number in asc order | |
160 | [ | |
161 | 'order_bys' => [ | |
162 | [ | |
163 | 'column' => 'address_odd_street_number', | |
164 | 'order' => 'ASC', | |
165 | ], | |
166 | [ | |
167 | 'column' => 'address_street_number', | |
168 | 'order' => 'ASC', | |
169 | ], | |
170 | ], | |
171 | 'expected_contact_ids' => [ | |
172 | $contactIDs['no_street_number'], | |
173 | $contactIDs['even_street_number_1'], | |
174 | $contactIDs['even_street_number_2'], | |
175 | $contactIDs['odd_street_number_1'], | |
176 | $contactIDs['odd_street_number_2'], | |
177 | ], | |
178 | 'expected_orderby_clause' => 'ORDER BY (address_civireport.street_number % 2) ASC, address_civireport.street_number ASC', | |
179 | ], | |
180 | ]; | |
181 | ||
182 | foreach ($expectedCases as $case) { | |
183 | $obj->setParams(array_merge($obj->getParams(), ['order_bys' => $case['order_bys']])); | |
184 | $sql = $obj->buildQuery(); | |
185 | $rows = CRM_Core_DAO::executeQuery($sql)->fetchAll(); | |
186 | ||
187 | // check the order of contact IDs | |
188 | $this->assertEquals($case['expected_contact_ids'], CRM_Utils_Array::collect('civicrm_contact_id', $rows)); | |
189 | // check the order clause | |
190 | $this->assertEquals(TRUE, !empty(strstr($sql, $case['expected_orderby_clause']))); | |
ea39e229 SL |
191 | // Ensure that we are only fetching primary fields. |
192 | foreach ($rows as $row) { | |
193 | if ($row['civicrm_contact_id'] == $contactIDs['even_street_number_2']) { | |
194 | $this->assertEquals(4, $row['civicrm_address_address_street_number']); | |
195 | } | |
196 | } | |
8fc33241 | 197 | } |
ea39e229 | 198 | $this->callAPISuccess('LocationType', 'Delete', ['id' => $customLocationType['id']]); |
8fc33241 | 199 | } |
200 | ||
cab1863a SL |
201 | /** |
202 | * Test that Loation Type prints out a sensible piece of data | |
203 | */ | |
204 | public function testLocationTypeIdHandling() { | |
205 | $customLocationType = $this->callAPISuccess('LocationType', 'create', [ | |
206 | 'name' => 'Custom Location Type', | |
207 | 'display_name' => 'CiviTest Custom Location Type', | |
208 | 'is_active' => 1, | |
209 | ]); | |
210 | $this->individualCreate([ | |
211 | 'api.Address.create' => [ | |
212 | 'location_type_id' => $customLocationType['id'], | |
213 | 'is_primary' => 1, | |
214 | 'street_number' => 3, | |
215 | ], | |
216 | ]); | |
217 | $input = [ | |
218 | 'fields' => [ | |
219 | 'address_street_number', | |
220 | 'address_odd_street_number', | |
221 | 'address_location_type_id', | |
222 | ], | |
223 | ]; | |
224 | $obj = $this->getReportObject('CRM_Report_Form_Contact_Summary', $input); | |
225 | $obj->setParams($obj->getParams()); | |
226 | $sql = $obj->buildQuery(TRUE); | |
227 | $rows = []; | |
228 | $obj->buildRows($sql, $rows); | |
229 | $obj->formatDisplay($rows); | |
230 | $this->assertEquals('CiviTest Custom Location Type', $rows[0]['civicrm_address_address_location_type_id']); | |
231 | } | |
232 | ||
8fc33241 | 233 | } |