Merge pull request #16085 from seamuslee001/dev_core_1466
[civicrm-core.git] / tests / phpunit / CRM / Report / Form / ContactSummaryTest.php
CommitLineData
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 */
17class 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}