Merge pull request #11525 from eileenmcnaughton/deprecated
[civicrm-core.git] / tests / phpunit / CRM / Core / BAO / AddressTest.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
81621fee 4 | CiviCRM version 4.7 |
6a488035 5 +--------------------------------------------------------------------+
15a4309a 6 | Copyright CiviCRM LLC (c) 2004-2017 |
6a488035
TO
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
d25dd0ee 26 */
6a488035 27
e9479dcf
EM
28/**
29 * Class CRM_Core_BAO_AddressTest
acb109b7 30 * @group headless
e9479dcf 31 */
6a488035 32class CRM_Core_BAO_AddressTest extends CiviUnitTestCase {
00be9182 33 public function setUp() {
6a488035
TO
34 parent::setUp();
35
36 $this->quickCleanup(array('civicrm_contact', 'civicrm_address'));
37 }
38
39 /**
100fef9d 40 * Create() method (create and update modes)
6a488035 41 */
00be9182 42 public function testCreate() {
f2040bc6 43 $contactId = $this->individualCreate();
6a488035
TO
44
45 $params = array();
46 $params['address']['1'] = array(
47 'street_address' => 'Oberoi Garden',
48 'supplemental_address_1' => 'Attn: Accounting',
49 'supplemental_address_2' => 'Powai',
207f62c6 50 'supplemental_address_3' => 'Somewhere',
6a488035
TO
51 'city' => 'Athens',
52 'postal_code' => '01903',
53 'state_province_id' => '1000',
54 'country_id' => '1228',
55 'geo_code_1' => '18.219023',
56 'geo_code_2' => '-105.00973',
57 'location_type_id' => '1',
58 'is_primary' => '1',
59 'is_billing' => '0',
60 );
61
62 $params['contact_id'] = $contactId;
63
6a488035
TO
64 $fixAddress = TRUE;
65
66 CRM_Core_BAO_Address::create($params, $fixAddress, $entity = NULL);
67 $addressId = $this->assertDBNotNull('CRM_Core_DAO_Address', 'Oberoi Garden', 'id', 'street_address',
68 'Database check for created address.'
69 );
70
71 // Now call add() to modify an existing address
72
73 $params = array();
74 $params['address']['1'] = array(
75 'id' => $addressId,
76 'street_address' => '120 Terminal Road',
77 'supplemental_address_1' => 'A-wing:3037',
78 'supplemental_address_2' => 'Bandra',
207f62c6 79 'supplemental_address_3' => 'Somewhere',
6a488035
TO
80 'city' => 'Athens',
81 'postal_code' => '01903',
82 'state_province_id' => '1000',
83 'country_id' => '1228',
84 'geo_code_1' => '18.219023',
85 'geo_code_2' => '-105.00973',
86 'location_type_id' => '1',
87 'is_primary' => '1',
88 'is_billing' => '0',
89 );
90 $params['contact_id'] = $contactId;
91
6a488035
TO
92 $block = CRM_Core_BAO_Address::create($params, $fixAddress, $entity = NULL);
93
93ac19cd 94 $this->assertDBNotNull('CRM_Core_DAO_Address', $contactId, 'id', 'contact_id',
6a488035
TO
95 'Database check for updated address by contactId.'
96 );
93ac19cd 97 $this->assertDBNotNull('CRM_Core_DAO_Address', '120 Terminal Road', 'id', 'street_address',
6a488035
TO
98 'Database check for updated address by street_name.'
99 );
93ac19cd 100 $this->contactDelete($contactId);
6a488035
TO
101 }
102
103 /**
104 * Add() method ( )
105 */
00be9182 106 public function testAdd() {
f2040bc6 107 $contactId = $this->individualCreate();
6a488035
TO
108
109 $fixParams = array(
110 'street_address' => 'E 906N Pine Pl W',
111 'supplemental_address_1' => 'Editorial Dept',
112 'supplemental_address_2' => '',
207f62c6 113 'supplemental_address_3' => '',
6a488035
TO
114 'city' => 'El Paso',
115 'postal_code' => '88575',
116 'postal_code_suffix' => '',
117 'state_province_id' => '1001',
118 'country_id' => '1228',
119 'geo_code_1' => '31.694842',
120 'geo_code_2' => '-106.29998',
121 'location_type_id' => '1',
122 'is_primary' => '1',
123 'is_billing' => '0',
124 'contact_id' => $contactId,
125 );
126
127 $addAddress = CRM_Core_BAO_Address::add($fixParams, $fixAddress = TRUE);
128
129 $addParams = $this->assertDBNotNull('CRM_Core_DAO_Address', $contactId, 'id', 'contact_id',
130 'Database check for created contact address.'
131 );
132
133 $this->assertEquals($addAddress->street_address, 'E 906N Pine Pl W', 'In line' . __LINE__);
134 $this->assertEquals($addAddress->supplemental_address_1, 'Editorial Dept', 'In line' . __LINE__);
135 $this->assertEquals($addAddress->city, 'El Paso', 'In line' . __LINE__);
136 $this->assertEquals($addAddress->postal_code, '88575', 'In line' . __LINE__);
137 $this->assertEquals($addAddress->geo_code_1, '31.694842', 'In line' . __LINE__);
138 $this->assertEquals($addAddress->geo_code_2, '-106.29998', 'In line' . __LINE__);
139 $this->assertEquals($addAddress->country_id, '1228', 'In line' . __LINE__);
93ac19cd 140 $this->contactDelete($contactId);
6a488035
TO
141 }
142
143 /**
144 * AllAddress() method ( )
145 */
00be9182 146 public function testallAddress() {
f2040bc6 147 $contactId = $this->individualCreate();
6a488035
TO
148
149 $fixParams = array(
150 'street_address' => 'E 906N Pine Pl W',
151 'supplemental_address_1' => 'Editorial Dept',
152 'supplemental_address_2' => '',
207f62c6 153 'supplemental_address_3' => '',
6a488035
TO
154 'city' => 'El Paso',
155 'postal_code' => '88575',
156 'postal_code_suffix' => '',
157 'state_province_id' => '1001',
158 'country_id' => '1228',
159 'geo_code_1' => '31.694842',
160 'geo_code_2' => '-106.29998',
161 'location_type_id' => '1',
162 'is_primary' => '1',
163 'is_billing' => '0',
164 'contact_id' => $contactId,
165 );
166
167 CRM_Core_BAO_Address::add($fixParams, $fixAddress = TRUE);
168
169 $addParams = $this->assertDBNotNull('CRM_Core_DAO_Address', $contactId, 'id', 'contact_id',
170 'Database check for created contact address.'
171 );
172 $fixParams = array(
173 'street_address' => 'SW 719B Beech Dr NW',
174 'supplemental_address_1' => 'C/o OPDC',
175 'supplemental_address_2' => '',
207f62c6 176 'supplemental_address_3' => '',
6a488035
TO
177 'city' => 'Neillsville',
178 'postal_code' => '54456',
179 'postal_code_suffix' => '',
180 'state_province_id' => '1001',
181 'country_id' => '1228',
182 'geo_code_1' => '44.553719',
183 'geo_code_2' => '-90.61457',
184 'location_type_id' => '2',
185 'is_primary' => '',
186 'is_billing' => '1',
187 'contact_id' => $contactId,
188 );
189
190 CRM_Core_BAO_Address::add($fixParams, $fixAddress = TRUE);
191
192 $addParams = $this->assertDBNotNull('CRM_Core_DAO_Address', $contactId, 'id', 'contact_id',
193 'Database check for created contact address.'
194 );
195
196 $allAddress = CRM_Core_BAO_Address::allAddress($contactId);
197
198 $this->assertEquals(count($allAddress), 2, 'Checking number of returned addresses.');
199
93ac19cd 200 $this->contactDelete($contactId);
6a488035
TO
201 }
202
203 /**
204 * AllAddress() method ( ) with null value
205 */
00be9182 206 public function testnullallAddress() {
f2040bc6 207 $contactId = $this->individualCreate();
6a488035
TO
208
209 $fixParams = array(
210 'street_address' => 'E 906N Pine Pl W',
211 'supplemental_address_1' => 'Editorial Dept',
212 'supplemental_address_2' => '',
207f62c6 213 'supplemental_address_3' => '',
6a488035
TO
214 'city' => 'El Paso',
215 'postal_code' => '88575',
216 'postal_code_suffix' => '',
217 'state_province_id' => '1001',
218 'country_id' => '1228',
219 'geo_code_1' => '31.694842',
220 'geo_code_2' => '-106.29998',
221 'location_type_id' => '1',
222 'is_primary' => '1',
223 'is_billing' => '0',
224 'contact_id' => $contactId,
225 );
226
227 CRM_Core_BAO_Address::add($fixParams, $fixAddress = TRUE);
228
229 $addParams = $this->assertDBNotNull('CRM_Core_DAO_Address', $contactId, 'id', 'contact_id',
230 'Database check for created contact address.'
231 );
232
233 $contact_Id = NULL;
234
235 $allAddress = CRM_Core_BAO_Address::allAddress($contact_Id);
236
237 $this->assertEquals($allAddress, NULL, 'Checking null for returned addresses.');
238
93ac19cd 239 $this->contactDelete($contactId);
6a488035
TO
240 }
241
242 /**
100fef9d 243 * GetValues() method (get Address fields)
6a488035 244 */
00be9182 245 public function testGetValues() {
f2040bc6 246 $contactId = $this->individualCreate();
6a488035
TO
247
248 $params = array();
249 $params['address']['1'] = array(
250 'street_address' => 'Oberoi Garden',
251 'supplemental_address_1' => 'Attn: Accounting',
252 'supplemental_address_2' => 'Powai',
207f62c6 253 'supplemental_address_3' => 'Somewhere',
6a488035
TO
254 'city' => 'Athens',
255 'postal_code' => '01903',
256 'state_province_id' => '1000',
257 'country_id' => '1228',
258 'geo_code_1' => '18.219023',
259 'geo_code_2' => '-105.00973',
260 'location_type_id' => '1',
261 'is_primary' => '1',
262 'is_billing' => '0',
263 );
264
265 $params['contact_id'] = $contactId;
266
267 $fixAddress = TRUE;
268
269 CRM_Core_BAO_Address::create($params, $fixAddress, $entity = NULL);
270
271 $addressId = $this->assertDBNotNull('CRM_Core_DAO_Address', $contactId, 'id', 'contact_id',
272 'Database check for created address.'
273 );
274
275 $entityBlock = array('contact_id' => $contactId);
276 $address = CRM_Core_BAO_Address::getValues($entityBlock);
277 $this->assertEquals($address[1]['id'], $addressId);
278 $this->assertEquals($address[1]['contact_id'], $contactId);
279 $this->assertEquals($address[1]['street_address'], 'Oberoi Garden');
93ac19cd 280 $this->contactDelete($contactId);
6a488035
TO
281 }
282
283 /**
100fef9d 284 * ParseStreetAddress() method (get street address parsed)
6a488035 285 */
00be9182 286 public function testParseStreetAddress() {
6a488035
TO
287
288 // valid Street address to be parsed ( without locale )
289 $street_address = "54A Excelsior Ave. Apt 1C";
290 $parsedStreetAddress = CRM_Core_BAO_Address::parseStreetAddress($street_address);
291 $this->assertEquals($parsedStreetAddress['street_name'], 'Excelsior Ave.');
292 $this->assertEquals($parsedStreetAddress['street_unit'], 'Apt 1C');
293 $this->assertEquals($parsedStreetAddress['street_number'], '54');
294 $this->assertEquals($parsedStreetAddress['street_number_suffix'], 'A');
295
296 // valid Street address to be parsed ( $locale = 'en_US' )
92915c55
TO
297 $street_address = "54A Excelsior Ave. Apt 1C";
298 $locale = 'en_US';
6a488035
TO
299 $parsedStreetAddress = CRM_Core_BAO_Address::parseStreetAddress($street_address, $locale);
300 $this->assertEquals($parsedStreetAddress['street_name'], 'Excelsior Ave.');
301 $this->assertEquals($parsedStreetAddress['street_unit'], 'Apt 1C');
302 $this->assertEquals($parsedStreetAddress['street_number'], '54');
303 $this->assertEquals($parsedStreetAddress['street_number_suffix'], 'A');
304
305 // invalid Street address ( $locale = 'en_US' )
92915c55
TO
306 $street_address = "West St. Apt 1";
307 $locale = 'en_US';
6a488035
TO
308 $parsedStreetAddress = CRM_Core_BAO_Address::parseStreetAddress($street_address, $locale);
309 $this->assertEquals($parsedStreetAddress['street_name'], 'West St.');
310 $this->assertEquals($parsedStreetAddress['street_unit'], 'Apt 1');
311 $this->assertNotContains('street_number', $parsedStreetAddress);
312 $this->assertNotContains('street_number_suffix', $parsedStreetAddress);
313
314 // valid Street address to be parsed ( $locale = 'fr_CA' )
92915c55
TO
315 $street_address = "2-123CA Main St";
316 $locale = 'fr_CA';
6a488035
TO
317 $parsedStreetAddress = CRM_Core_BAO_Address::parseStreetAddress($street_address, $locale);
318 $this->assertEquals($parsedStreetAddress['street_name'], 'Main St');
319 $this->assertEquals($parsedStreetAddress['street_unit'], '2');
320 $this->assertEquals($parsedStreetAddress['street_number'], '123');
321 $this->assertEquals($parsedStreetAddress['street_number_suffix'], 'CA');
322
323 // invalid Street address ( $locale = 'fr_CA' )
92915c55
TO
324 $street_address = "123 Main St";
325 $locale = 'fr_CA';
6a488035
TO
326 $parsedStreetAddress = CRM_Core_BAO_Address::parseStreetAddress($street_address, $locale);
327 $this->assertEquals($parsedStreetAddress['street_name'], 'Main St');
328 $this->assertEquals($parsedStreetAddress['street_number'], '123');
329 $this->assertNotContains('street_unit', $parsedStreetAddress);
330 $this->assertNotContains('street_number_suffix', $parsedStreetAddress);
331 }
96025800 332
4d5f5c22
D
333 /**
334 * CRM-21214 - Ensure all child addresses are updated correctly - 1.
335 * 1. First, create three contacts: A, B, and C
336 * 2. Create an address for contact A
337 * 3. Use contact A's address for contact B
338 * 4. Use contact B's address for contact C
339 * 5. Change contact A's address
340 * Address of Contact C should reflect contact A's address change
341 * Also, Contact C's address' master_id should be Contact A's address id.
342 */
343 public function testSharedAddressChaining1() {
344 $contactIdA = $this->individualCreate(array(), 0);
345 $contactIdB = $this->individualCreate(array(), 1);
346 $contactIdC = $this->individualCreate(array(), 2);
347
348 $addressParamsA = array(
349 'street_address' => '123 Fake St.',
350 'location_type_id' => '1',
351 'is_primary' => '1',
352 'contact_id' => $contactIdA,
353 );
354 $addAddressA = CRM_Core_BAO_Address::add($addressParamsA, FALSE);
355
356 $addressParamsB = array(
357 'street_address' => '123 Fake St.',
358 'location_type_id' => '1',
359 'is_primary' => '1',
360 'master_id' => $addAddressA->id,
361 'contact_id' => $contactIdB,
362 );
363 $addAddressB = CRM_Core_BAO_Address::add($addressParamsB, FALSE);
364
365 $addressParamsC = array(
366 'street_address' => '123 Fake St.',
367 'location_type_id' => '1',
368 'is_primary' => '1',
369 'master_id' => $addAddressB->id,
370 'contact_id' => $contactIdC,
371 );
372 $addAddressC = CRM_Core_BAO_Address::add($addressParamsC, FALSE);
373
374 $updatedAddressParamsA = array(
375 'id' => $addAddressA->id,
376 'street_address' => '1313 New Address Lane',
377 'location_type_id' => '1',
378 'is_primary' => '1',
379 'contact_id' => $contactIdA,
380 );
381 $updatedAddressA = CRM_Core_BAO_Address::add($updatedAddressParamsA, FALSE);
382
383 // CRM-21214 - Has Address C been updated with Address A's new values?
384 $newAddressC = new CRM_Core_DAO_Address();
385 $newAddressC->id = $addAddressC->id;
386 $newAddressC->find(TRUE);
387 $newAddressC->fetch(TRUE);
388
389 $this->assertEquals($updatedAddressA->street_address, $newAddressC->street_address);
390 $this->assertEquals($updatedAddressA->id, $newAddressC->master_id);
391 }
392
393 /**
394 * CRM-21214 - Ensure all child addresses are updated correctly - 2.
395 * 1. First, create three contacts: A, B, and C
396 * 2. Create an address for contact A and B
397 * 3. Use contact A's address for contact C
398 * 4. Use contact B's address for contact A
399 * 5. Change contact B's address
400 * Address of Contact C should reflect contact B's address change
401 * Also, Contact C's address' master_id should be Contact B's address id.
402 */
403 public function testSharedAddressChaining2() {
404 $contactIdA = $this->individualCreate(array(), 0);
405 $contactIdB = $this->individualCreate(array(), 1);
406 $contactIdC = $this->individualCreate(array(), 2);
407
408 $addressParamsA = array(
409 'street_address' => '123 Fake St.',
410 'location_type_id' => '1',
411 'is_primary' => '1',
412 'contact_id' => $contactIdA,
413 );
414 $addAddressA = CRM_Core_BAO_Address::add($addressParamsA, FALSE);
415
416 $addressParamsB = array(
417 'street_address' => '123 Fake St.',
418 'location_type_id' => '1',
419 'is_primary' => '1',
420 'contact_id' => $contactIdB,
421 );
422 $addAddressB = CRM_Core_BAO_Address::add($addressParamsB, FALSE);
423
424 $addressParamsC = array(
425 'street_address' => '123 Fake St.',
426 'location_type_id' => '1',
427 'is_primary' => '1',
428 'master_id' => $addAddressA->id,
429 'contact_id' => $contactIdC,
430 );
431 $addAddressC = CRM_Core_BAO_Address::add($addressParamsC, FALSE);
432
433 $updatedAddressParamsA = array(
434 'id' => $addAddressA->id,
435 'street_address' => '123 Fake St.',
436 'location_type_id' => '1',
437 'is_primary' => '1',
438 'master_id' => $addAddressB->id,
439 'contact_id' => $contactIdA,
440 );
441 $updatedAddressA = CRM_Core_BAO_Address::add($updatedAddressParamsA, FALSE);
442
443 $updatedAddressParamsB = array(
444 'id' => $addAddressB->id,
445 'street_address' => '1313 New Address Lane',
446 'location_type_id' => '1',
447 'is_primary' => '1',
448 'contact_id' => $contactIdB,
449 );
450 $updatedAddressB = CRM_Core_BAO_Address::add($updatedAddressParamsB, FALSE);
451
452 // CRM-21214 - Has Address C been updated with Address B's new values?
453 $newAddressC = new CRM_Core_DAO_Address();
454 $newAddressC->id = $addAddressC->id;
455 $newAddressC->find(TRUE);
456 $newAddressC->fetch(TRUE);
457
458 $this->assertEquals($updatedAddressB->street_address, $newAddressC->street_address);
459 $this->assertEquals($updatedAddressB->id, $newAddressC->master_id);
460 }
461
462 /**
463 * CRM-21214 - Ensure all child addresses are updated correctly - 3.
464 * 1. First, create a contact: A
465 * 2. Create an address for contact A
466 * 3. Use contact A's address for contact A's address
467 * An error should be given, and master_id should remain the same.
468 */
469 public function testSharedAddressChaining3() {
470 $contactIdA = $this->individualCreate(array(), 0);
4d5f5c22
D
471
472 $addressParamsA = array(
473 'street_address' => '123 Fake St.',
474 'location_type_id' => '1',
475 'is_primary' => '1',
476 'contact_id' => $contactIdA,
477 );
478 $addAddressA = CRM_Core_BAO_Address::add($addressParamsA, FALSE);
479
480 $updatedAddressParamsA = array(
481 'id' => $addAddressA->id,
482 'street_address' => '123 Fake St.',
483 'location_type_id' => '1',
484 'is_primary' => '1',
485 'master_id' => $addAddressA->id,
486 'contact_id' => $contactIdA,
487 );
488 $updatedAddressA = CRM_Core_BAO_Address::add($updatedAddressParamsA, FALSE);
489
490 // CRM-21214 - AdressA shouldn't be master of itself.
93eadfba 491 $this->assertEmpty($updatedAddressA->master_id);
4d5f5c22
D
492 }
493
6a488035 494}