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 * Class CRM_Core_BAO_AddressTest
16 class CRM_Core_BAO_AddressTest
extends CiviUnitTestCase
{
18 public function setUp() {
21 $this->quickCleanup(['civicrm_contact', 'civicrm_address']);
25 * Create() method (create and update modes)
27 public function testCreate() {
28 $contactId = $this->individualCreate();
31 $params['address']['1'] = [
32 'street_address' => 'Oberoi Garden',
33 'supplemental_address_1' => 'Attn: Accounting',
34 'supplemental_address_2' => 'Powai',
35 'supplemental_address_3' => 'Somewhere',
37 'postal_code' => '01903',
38 'state_province_id' => '1000',
39 'country_id' => '1228',
40 'geo_code_1' => '18.219023',
41 'geo_code_2' => '-105.00973',
42 'location_type_id' => '1',
47 $params['contact_id'] = $contactId;
51 CRM_Core_BAO_Address
::create($params, $fixAddress, $entity = NULL);
52 $addressId = $this->assertDBNotNull('CRM_Core_DAO_Address', 'Oberoi Garden', 'id', 'street_address',
53 'Database check for created address.'
56 // Now call add() to modify an existing address
59 $params['address']['1'] = [
61 'street_address' => '120 Terminal Road',
62 'supplemental_address_1' => 'A-wing:3037',
63 'supplemental_address_2' => 'Bandra',
64 'supplemental_address_3' => 'Somewhere',
66 'postal_code' => '01903',
67 'state_province_id' => '1000',
68 'country_id' => '1228',
69 'geo_code_1' => '18.219023',
70 'geo_code_2' => '-105.00973',
71 'location_type_id' => '1',
75 $params['contact_id'] = $contactId;
77 $block = CRM_Core_BAO_Address
::create($params, $fixAddress, $entity = NULL);
79 $this->assertDBNotNull('CRM_Core_DAO_Address', $contactId, 'id', 'contact_id',
80 'Database check for updated address by contactId.'
82 $this->assertDBNotNull('CRM_Core_DAO_Address', '120 Terminal Road', 'id', 'street_address',
83 'Database check for updated address by street_name.'
85 $this->contactDelete($contactId);
91 public function testAdd() {
92 $contactId = $this->individualCreate();
95 'street_address' => 'E 906N Pine Pl W',
96 'supplemental_address_1' => 'Editorial Dept',
97 'supplemental_address_2' => '',
98 'supplemental_address_3' => '',
100 'postal_code' => '88575',
101 'postal_code_suffix' => '',
102 'state_province_id' => '1001',
103 'country_id' => '1228',
104 'geo_code_1' => '31.694842',
105 'geo_code_2' => '-106.29998',
106 'location_type_id' => '1',
109 'contact_id' => $contactId,
112 $addAddress = CRM_Core_BAO_Address
::add($fixParams, $fixAddress = TRUE);
114 $addParams = $this->assertDBNotNull('CRM_Core_DAO_Address', $contactId, 'id', 'contact_id',
115 'Database check for created contact address.'
118 $this->assertEquals($addAddress->street_address
, 'E 906N Pine Pl W', 'In line' . __LINE__
);
119 $this->assertEquals($addAddress->supplemental_address_1
, 'Editorial Dept', 'In line' . __LINE__
);
120 $this->assertEquals($addAddress->city
, 'El Paso', 'In line' . __LINE__
);
121 $this->assertEquals($addAddress->postal_code
, '88575', 'In line' . __LINE__
);
122 $this->assertEquals($addAddress->geo_code_1
, '31.694842', 'In line' . __LINE__
);
123 $this->assertEquals($addAddress->geo_code_2
, '-106.29998', 'In line' . __LINE__
);
124 $this->assertEquals($addAddress->country_id
, '1228', 'In line' . __LINE__
);
125 $this->contactDelete($contactId);
129 * AllAddress() method ( )
131 public function testallAddress() {
132 $contactId = $this->individualCreate();
135 'street_address' => 'E 906N Pine Pl W',
136 'supplemental_address_1' => 'Editorial Dept',
137 'supplemental_address_2' => '',
138 'supplemental_address_3' => '',
140 'postal_code' => '88575',
141 'postal_code_suffix' => '',
142 'state_province_id' => '1001',
143 'country_id' => '1228',
144 'geo_code_1' => '31.694842',
145 'geo_code_2' => '-106.29998',
146 'location_type_id' => '1',
149 'contact_id' => $contactId,
152 CRM_Core_BAO_Address
::add($fixParams, $fixAddress = TRUE);
154 $addParams = $this->assertDBNotNull('CRM_Core_DAO_Address', $contactId, 'id', 'contact_id',
155 'Database check for created contact address.'
158 'street_address' => 'SW 719B Beech Dr NW',
159 'supplemental_address_1' => 'C/o OPDC',
160 'supplemental_address_2' => '',
161 'supplemental_address_3' => '',
162 'city' => 'Neillsville',
163 'postal_code' => '54456',
164 'postal_code_suffix' => '',
165 'state_province_id' => '1001',
166 'country_id' => '1228',
167 'geo_code_1' => '44.553719',
168 'geo_code_2' => '-90.61457',
169 'location_type_id' => '2',
172 'contact_id' => $contactId,
175 CRM_Core_BAO_Address
::add($fixParams, $fixAddress = TRUE);
177 $addParams = $this->assertDBNotNull('CRM_Core_DAO_Address', $contactId, 'id', 'contact_id',
178 'Database check for created contact address.'
181 $allAddress = CRM_Core_BAO_Address
::allAddress($contactId);
183 $this->assertEquals(count($allAddress), 2, 'Checking number of returned addresses.');
185 $this->contactDelete($contactId);
189 * AllAddress() method ( ) with null value
191 public function testnullallAddress() {
192 $contactId = $this->individualCreate();
195 'street_address' => 'E 906N Pine Pl W',
196 'supplemental_address_1' => 'Editorial Dept',
197 'supplemental_address_2' => '',
198 'supplemental_address_3' => '',
200 'postal_code' => '88575',
201 'postal_code_suffix' => '',
202 'state_province_id' => '1001',
203 'country_id' => '1228',
204 'geo_code_1' => '31.694842',
205 'geo_code_2' => '-106.29998',
206 'location_type_id' => '1',
209 'contact_id' => $contactId,
212 CRM_Core_BAO_Address
::add($fixParams, $fixAddress = TRUE);
214 $addParams = $this->assertDBNotNull('CRM_Core_DAO_Address', $contactId, 'id', 'contact_id',
215 'Database check for created contact address.'
220 $allAddress = CRM_Core_BAO_Address
::allAddress($contact_Id);
222 $this->assertEquals($allAddress, NULL, 'Checking null for returned addresses.');
224 $this->contactDelete($contactId);
228 * GetValues() method (get Address fields)
230 public function testGetValues() {
231 $contactId = $this->individualCreate();
234 $params['address']['1'] = [
235 'street_address' => 'Oberoi Garden',
236 'supplemental_address_1' => 'Attn: Accounting',
237 'supplemental_address_2' => 'Powai',
238 'supplemental_address_3' => 'Somewhere',
240 'postal_code' => '01903',
241 'state_province_id' => '1000',
242 'country_id' => '1228',
243 'geo_code_1' => '18.219023',
244 'geo_code_2' => '-105.00973',
245 'location_type_id' => '1',
250 $params['contact_id'] = $contactId;
254 CRM_Core_BAO_Address
::create($params, $fixAddress, $entity = NULL);
256 $addressId = $this->assertDBNotNull('CRM_Core_DAO_Address', $contactId, 'id', 'contact_id',
257 'Database check for created address.'
260 $entityBlock = ['contact_id' => $contactId];
261 $address = CRM_Core_BAO_Address
::getValues($entityBlock);
262 $this->assertEquals($address[1]['id'], $addressId);
263 $this->assertEquals($address[1]['contact_id'], $contactId);
264 $this->assertEquals($address[1]['street_address'], 'Oberoi Garden');
265 $this->contactDelete($contactId);
268 public function setStreetAddressParsing($status) {
269 $address_options = CRM_Core_BAO_Setting
::valueOptions(
270 CRM_Core_BAO_Setting
::SYSTEM_PREFERENCES_NAME
,
280 $address_options['street_address_parsing'] = $value;
281 CRM_Core_BAO_Setting
::setValueOption(
282 CRM_Core_BAO_Setting
::SYSTEM_PREFERENCES_NAME
,
289 * ParseStreetAddress if enabled, otherwise, don't.
291 public function testParseStreetAddressIfEnabled() {
292 // Turn off address standardization. Parsing should work without it.
293 Civi
::settings()->set('address_standardization_provider', NULL);
295 // Ensure street parsing happens if enabled.
296 $this->setStreetAddressParsing(TRUE);
298 $contactId = $this->individualCreate();
299 $street_address = "54 Excelsior Ave.";
301 'contact_id' => $contactId,
302 'street_address' => $street_address,
303 'location_type_id' => 1,
306 $result = civicrm_api3('Address', 'create', $params);
307 $value = array_pop($result['values']);
308 $street_number = CRM_Utils_Array
::value('street_number', $value);
309 $this->assertEquals($street_number, '54');
311 // Ensure street parsing does not happen if disabled.
312 $this->setStreetAddressParsing(FALSE);
313 $result = civicrm_api3('Address', 'create', $params);
314 $value = array_pop($result['values']);
315 $street_number = CRM_Utils_Array
::value('street_number', $value);
316 $this->assertEmpty($street_number);
321 * ParseStreetAddress() method (get street address parsed)
323 public function testParseStreetAddress() {
325 // valid Street address to be parsed ( without locale )
326 $street_address = "54A Excelsior Ave. Apt 1C";
327 $parsedStreetAddress = CRM_Core_BAO_Address
::parseStreetAddress($street_address);
328 $this->assertEquals($parsedStreetAddress['street_name'], 'Excelsior Ave.');
329 $this->assertEquals($parsedStreetAddress['street_unit'], 'Apt 1C');
330 $this->assertEquals($parsedStreetAddress['street_number'], '54');
331 $this->assertEquals($parsedStreetAddress['street_number_suffix'], 'A');
333 // Out-of-range street number to be parsed.
334 $street_address = "505050505050 Main St";
335 $parsedStreetAddress = CRM_Core_BAO_Address
::parseStreetAddress($street_address);
336 $this->assertEquals($parsedStreetAddress['street_name'], '');
337 $this->assertEquals($parsedStreetAddress['street_unit'], '');
338 $this->assertEquals($parsedStreetAddress['street_number'], '');
339 $this->assertEquals($parsedStreetAddress['street_number_suffix'], '');
341 // valid Street address to be parsed ( $locale = 'en_US' )
342 $street_address = "54A Excelsior Ave. Apt 1C";
344 $parsedStreetAddress = CRM_Core_BAO_Address
::parseStreetAddress($street_address, $locale);
345 $this->assertEquals($parsedStreetAddress['street_name'], 'Excelsior Ave.');
346 $this->assertEquals($parsedStreetAddress['street_unit'], 'Apt 1C');
347 $this->assertEquals($parsedStreetAddress['street_number'], '54');
348 $this->assertEquals($parsedStreetAddress['street_number_suffix'], 'A');
350 // invalid Street address ( $locale = 'en_US' )
351 $street_address = "West St. Apt 1";
353 $parsedStreetAddress = CRM_Core_BAO_Address
::parseStreetAddress($street_address, $locale);
354 $this->assertEquals($parsedStreetAddress['street_name'], 'West St.');
355 $this->assertEquals($parsedStreetAddress['street_unit'], 'Apt 1');
356 $this->assertNotContains('street_number', $parsedStreetAddress);
357 $this->assertNotContains('street_number_suffix', $parsedStreetAddress);
359 // valid Street address to be parsed ( $locale = 'fr_CA' )
360 $street_address = "2-123CA Main St";
362 $parsedStreetAddress = CRM_Core_BAO_Address
::parseStreetAddress($street_address, $locale);
363 $this->assertEquals($parsedStreetAddress['street_name'], 'Main St');
364 $this->assertEquals($parsedStreetAddress['street_unit'], '2');
365 $this->assertEquals($parsedStreetAddress['street_number'], '123');
366 $this->assertEquals($parsedStreetAddress['street_number_suffix'], 'CA');
368 // invalid Street address ( $locale = 'fr_CA' )
369 $street_address = "123 Main St";
371 $parsedStreetAddress = CRM_Core_BAO_Address
::parseStreetAddress($street_address, $locale);
372 $this->assertEquals($parsedStreetAddress['street_name'], 'Main St');
373 $this->assertEquals($parsedStreetAddress['street_number'], '123');
374 $this->assertNotContains('street_unit', $parsedStreetAddress);
375 $this->assertNotContains('street_number_suffix', $parsedStreetAddress);
379 * @dataProvider supportedAddressParsingLocales
381 public function testIsSupportedByAddressParsingReturnTrueForSupportedLocales($locale) {
382 $isSupported = CRM_Core_BAO_Address
::isSupportedParsingLocale($locale);
383 $this->assertTrue($isSupported);
387 * @dataProvider supportedAddressParsingLocales
389 public function testIsSupportedByAddressParsingReturnTrueForSupportedDefaultLocales($locale) {
390 CRM_Core_Config
::singleton()->lcMessages
= $locale;
391 $isSupported = CRM_Core_BAO_Address
::isSupportedParsingLocale();
392 $this->assertTrue($isSupported);
396 public function supportedAddressParsingLocales() {
405 * @dataProvider sampleOFUnsupportedAddressParsingLocales
407 public function testIsSupportedByAddressParsingReturnFalseForUnSupportedLocales($locale) {
408 $isNotSupported = CRM_Core_BAO_Address
::isSupportedParsingLocale($locale);
409 $this->assertFalse($isNotSupported);
413 * @dataProvider sampleOFUnsupportedAddressParsingLocales
415 public function testIsSupportedByAddressParsingReturnFalseForUnSupportedDefaultLocales($locale) {
416 CRM_Core_Config
::singleton()->lcMessages
= $locale;
417 $isNotSupported = CRM_Core_BAO_Address
::isSupportedParsingLocale();
418 $this->assertFalse($isNotSupported);
421 public function sampleOFUnsupportedAddressParsingLocales() {
430 * CRM-21214 - Ensure all child addresses are updated correctly - 1.
431 * 1. First, create three contacts: A, B, and C
432 * 2. Create an address for contact A
433 * 3. Use contact A's address for contact B
434 * 4. Use contact B's address for contact C
435 * 5. Change contact A's address
436 * Address of Contact C should reflect contact A's address change
437 * Also, Contact C's address' master_id should be Contact A's address id.
439 public function testSharedAddressChaining1() {
440 $contactIdA = $this->individualCreate([], 0);
441 $contactIdB = $this->individualCreate([], 1);
442 $contactIdC = $this->individualCreate([], 2);
445 'street_address' => '123 Fake St.',
446 'location_type_id' => '1',
448 'contact_id' => $contactIdA,
450 $addAddressA = CRM_Core_BAO_Address
::add($addressParamsA, FALSE);
453 'street_address' => '123 Fake St.',
454 'location_type_id' => '1',
456 'master_id' => $addAddressA->id
,
457 'contact_id' => $contactIdB,
459 $addAddressB = CRM_Core_BAO_Address
::add($addressParamsB, FALSE);
462 'street_address' => '123 Fake St.',
463 'location_type_id' => '1',
465 'master_id' => $addAddressB->id
,
466 'contact_id' => $contactIdC,
468 $addAddressC = CRM_Core_BAO_Address
::add($addressParamsC, FALSE);
470 $updatedAddressParamsA = [
471 'id' => $addAddressA->id
,
472 'street_address' => '1313 New Address Lane',
473 'location_type_id' => '1',
475 'contact_id' => $contactIdA,
477 $updatedAddressA = CRM_Core_BAO_Address
::add($updatedAddressParamsA, FALSE);
479 // CRM-21214 - Has Address C been updated with Address A's new values?
480 $newAddressC = new CRM_Core_DAO_Address();
481 $newAddressC->id
= $addAddressC->id
;
482 $newAddressC->find(TRUE);
483 $newAddressC->fetch(TRUE);
485 $this->assertEquals($updatedAddressA->street_address
, $newAddressC->street_address
);
486 $this->assertEquals($updatedAddressA->id
, $newAddressC->master_id
);
490 * CRM-21214 - Ensure all child addresses are updated correctly - 2.
491 * 1. First, create three contacts: A, B, and C
492 * 2. Create an address for contact A and B
493 * 3. Use contact A's address for contact C
494 * 4. Use contact B's address for contact A
495 * 5. Change contact B's address
496 * Address of Contact C should reflect contact B's address change
497 * Also, Contact C's address' master_id should be Contact B's address id.
499 public function testSharedAddressChaining2() {
500 $contactIdA = $this->individualCreate([], 0);
501 $contactIdB = $this->individualCreate([], 1);
502 $contactIdC = $this->individualCreate([], 2);
505 'street_address' => '123 Fake St.',
506 'location_type_id' => '1',
508 'contact_id' => $contactIdA,
510 $addAddressA = CRM_Core_BAO_Address
::add($addressParamsA, FALSE);
513 'street_address' => '123 Fake St.',
514 'location_type_id' => '1',
516 'contact_id' => $contactIdB,
518 $addAddressB = CRM_Core_BAO_Address
::add($addressParamsB, FALSE);
521 'street_address' => '123 Fake St.',
522 'location_type_id' => '1',
524 'master_id' => $addAddressA->id
,
525 'contact_id' => $contactIdC,
527 $addAddressC = CRM_Core_BAO_Address
::add($addressParamsC, FALSE);
529 $updatedAddressParamsA = [
530 'id' => $addAddressA->id
,
531 'street_address' => '123 Fake St.',
532 'location_type_id' => '1',
534 'master_id' => $addAddressB->id
,
535 'contact_id' => $contactIdA,
537 $updatedAddressA = CRM_Core_BAO_Address
::add($updatedAddressParamsA, FALSE);
539 $updatedAddressParamsB = [
540 'id' => $addAddressB->id
,
541 'street_address' => '1313 New Address Lane',
542 'location_type_id' => '1',
544 'contact_id' => $contactIdB,
546 $updatedAddressB = CRM_Core_BAO_Address
::add($updatedAddressParamsB, FALSE);
548 // CRM-21214 - Has Address C been updated with Address B's new values?
549 $newAddressC = new CRM_Core_DAO_Address();
550 $newAddressC->id
= $addAddressC->id
;
551 $newAddressC->find(TRUE);
552 $newAddressC->fetch(TRUE);
554 $this->assertEquals($updatedAddressB->street_address
, $newAddressC->street_address
);
555 $this->assertEquals($updatedAddressB->id
, $newAddressC->master_id
);
559 * CRM-21214 - Ensure all child addresses are updated correctly - 3.
560 * 1. First, create a contact: A
561 * 2. Create an address for contact A
562 * 3. Use contact A's address for contact A's address
563 * An error should be given, and master_id should remain the same.
565 public function testSharedAddressChaining3() {
566 $contactIdA = $this->individualCreate([], 0);
569 'street_address' => '123 Fake St.',
570 'location_type_id' => '1',
572 'contact_id' => $contactIdA,
574 $addAddressA = CRM_Core_BAO_Address
::add($addressParamsA, FALSE);
576 $updatedAddressParamsA = [
577 'id' => $addAddressA->id
,
578 'street_address' => '123 Fake St.',
579 'location_type_id' => '1',
581 'master_id' => $addAddressA->id
,
582 'contact_id' => $contactIdA,
584 $updatedAddressA = CRM_Core_BAO_Address
::add($updatedAddressParamsA, FALSE);
586 // CRM-21214 - AdressA shouldn't be master of itself.
587 $this->assertEmpty($updatedAddressA->master_id
);