3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
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 |
9 +--------------------------------------------------------------------+
13 * Test Contact Summary report outcome
17 class CRM_Report_Form_ContactSummaryTest
extends CiviReportTestCase
{
18 protected $_tablesToTruncate = [
25 public function setUp() {
27 $this->quickCleanup($this->_tablesToTruncate
);
30 public function tearDown() {
35 * Ensure the new Odd/Event street number sort column works correctly
37 public function testOddEvenStreetNumber() {
38 $customLocationType = $this->callAPISuccess('LocationType', 'create', [
39 'name' => 'Custom Location Type',
40 'display_name' => 'CiviTest Custom Location Type',
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
50 'odd_street_number_1' => $this->individualCreate([
51 'api.Address.create' => [
52 'location_type_id' => 1,
57 'odd_street_number_2' => $this->individualCreate([
58 'api.Address.create' => [
59 'location_type_id' => 1,
64 'even_street_number_1' => $this->individualCreate([
65 'api.Address.create' => [
66 'location_type_id' => 1,
71 'even_street_number_2' => $this->individualCreate([
72 'api.Address.create' => [
73 'location_type_id' => 1,
78 'no_street_number' => $this->individualCreate(),
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'],
89 'address_street_number',
90 'address_odd_street_number',
93 $obj = $this->getReportObject('CRM_Report_Form_Contact_Summary', $input);
96 // CASE A: Sorting by odd street number in desc order + street number in desc order
100 'column' => 'address_odd_street_number',
104 'column' => 'address_street_number',
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'],
115 'expected_orderby_clause' => 'ORDER BY (address_civireport.street_number % 2) DESC, address_civireport.street_number DESC',
117 // CASE B: Sorting by odd street number in asc order + street number in desc order
121 'column' => 'address_odd_street_number',
125 'column' => 'address_street_number',
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'],
136 'expected_orderby_clause' => 'ORDER BY (address_civireport.street_number % 2) ASC, address_civireport.street_number DESC',
138 // CASE C: Sorting by odd street number in desc order + street number in asc order
142 'column' => 'address_odd_street_number',
146 'column' => 'address_street_number',
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'],
157 'expected_orderby_clause' => 'ORDER BY (address_civireport.street_number % 2) DESC, address_civireport.street_number ASC',
159 // CASE A: Sorting by odd street number in asc order + street number in asc order
163 'column' => 'address_odd_street_number',
167 'column' => 'address_street_number',
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'],
178 'expected_orderby_clause' => 'ORDER BY (address_civireport.street_number % 2) ASC, address_civireport.street_number ASC',
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();
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'])));
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']);
198 $this->callAPISuccess('LocationType', 'Delete', ['id' => $customLocationType['id']]);
202 * Test that Loation Type prints out a sensible piece of data
204 public function testLocationTypeIdHandling() {
205 $customLocationType = $this->callAPISuccess('LocationType', 'create', [
206 'name' => 'Custom Location Type',
207 'display_name' => 'CiviTest Custom Location Type',
210 $this->individualCreate([
211 'api.Address.create' => [
212 'location_type_id' => $customLocationType['id'],
214 'street_number' => 3,
219 'address_street_number',
220 'address_odd_street_number',
221 'address_location_type_id',
224 $obj = $this->getReportObject('CRM_Report_Form_Contact_Summary', $input);
225 $obj->setParams($obj->getParams());
226 $sql = $obj->buildQuery(TRUE);
228 $obj->buildRows($sql, $rows);
229 $obj->formatDisplay($rows);
230 $this->assertEquals('CiviTest Custom Location Type', $rows[0]['civicrm_address_address_location_type_id']);