From 69ce6f4df5b54701b7f4e507436b06c0b6fdd432 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Tue, 1 Oct 2013 18:17:32 +0200 Subject: [PATCH] CRM-13312 - CRM_Utils_API_MatchOptionTest - http://forum.civicrm.org/index.php/topic,30133.0.html ---------------------------------------- * CRM-13312: Implement API support for options.match http://issues.civicrm.org/jira/browse/CRM-13312 --- .../phpunit/CRM/Utils/API/MatchOptionTest.php | 79 ++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/tests/phpunit/CRM/Utils/API/MatchOptionTest.php b/tests/phpunit/CRM/Utils/API/MatchOptionTest.php index ea087029e1..1f0ef717fc 100644 --- a/tests/phpunit/CRM/Utils/API/MatchOptionTest.php +++ b/tests/phpunit/CRM/Utils/API/MatchOptionTest.php @@ -137,7 +137,7 @@ class CRM_Utils_API_MatchOptionTest extends CiviUnitTestCase { * When replacing one set with another set, match items within * the set using a key. */ - function testReplaceMatch() { + function testReplaceMatch_Email() { // Create contact with two emails (j1,j2) $createResult = $this->callAPISuccess('contact', 'create', array( 'contact_type' => 'Individual', @@ -210,4 +210,81 @@ class CRM_Utils_API_MatchOptionTest extends CiviUnitTestCase { $this->assertTrue(empty($getValues[1]['signature_text'])); } + /** + * When replacing one set with another set, match items within + * the set using a key. + */ + function testReplaceMatch_Address() { + // Create contact with two addresses (j1,j2) + $createResult = $this->callAPISuccess('contact', 'create', array( + 'contact_type' => 'Individual', + 'first_name' => 'Jeffrey', + 'last_name' => 'Lebowski', + 'api.Address.replace' => array( + 'options' => array('match' => 'location_type_id'), + 'values' => array( + array('location_type_id' => 1, 'street_address' => 'j1-a Example Ave', 'supplemental_address_1' => 'The Dude abides.'), + array('location_type_id' => 2, 'street_address' => 'j2 Example Ave', 'supplemental_address_1' => 'You know, a lotta ins, a lotta outs, a lotta what-have-yous.'), + ), + ), + )); + $this->assertEquals(1, $createResult['count']); + foreach ($createResult['values'] as $value) { + $this->assertAPISuccess($value['api.Address.replace']); + $this->assertEquals(2, $value['api.Address.replace']['count']); + foreach ($value['api.Address.replace']['values'] as $v2) { + $this->assertEquals($createResult['id'], $v2['contact_id']); + } + $createAddressValues = array_values($value['api.Address.replace']['values']); + } + + // Update contact's addresses -- specifically, modify j1, delete j2, add j3 + $updateResult = $this->callAPISuccess('contact', 'create', array( + 'id' => $createResult['id'], + 'nick_name' => 'The Dude', + 'api.Address.replace' => array( + 'options' => array('match' => 'location_type_id'), + 'values' => array( + array('location_type_id' => 1, 'street_address' => 'j1-b Example Ave'), + array('location_type_id' => 3, 'street_address' => 'j3 Example Ave'), + ), + ), + )); + $this->assertEquals(1, $updateResult['count']); + foreach ($updateResult['values'] as $value) { + $this->assertAPISuccess($value['api.Address.replace']); + $this->assertEquals(2, $value['api.Address.replace']['count']); + foreach ($value['api.Address.replace']['values'] as $v2) { + $this->assertEquals($createResult['id'], $v2['contact_id']); + } + $updateAddressValues = array_values($value['api.Address.replace']['values']); + } + + // Re-read from DB + $getResult = $this->callAPISuccess('Address', 'get', array( + 'contact_id' => $createResult['id'], + )); + $this->assertEquals(2, $getResult['count']); + $getValues = array_values($getResult['values']); + + // The first street_address (j1 Example Ave) is updated (same ID#) because it matched on contact_id+location_type_id. + $this->assertTrue(is_numeric($createAddressValues[0]['id'])); + $this->assertTrue(is_numeric($updateAddressValues[0]['id'])); + $this->assertTrue(is_numeric($getValues[0]['id'])); + $this->assertEquals($createAddressValues[0]['id'], $updateAddressValues[0]['id']); + $this->assertEquals($createAddressValues[0]['id'], $getValues[0]['id']); + $this->assertEquals('j1-b Example Ave', $getValues[0]['street_address']); + $this->assertEquals('The Dude abides.', $getValues[0]['supplemental_address_1']); // preserved from original creation; proves that we updated existing record + + // The second street_address (j2 Example Ave) is deleted because contact_id+location_type_id doesn't appear in new list. + // The third street_address (j3 Example Ave) is inserted (new ID#) because it doesn't match an existing contact_id+location_type_id. + $this->assertTrue(is_numeric($createAddressValues[1]['id'])); + $this->assertTrue(is_numeric($updateAddressValues[1]['id'])); + $this->assertTrue(is_numeric($getValues[1]['id'])); + $this->assertNotEquals($createAddressValues[1]['id'], $updateAddressValues[1]['id']); + $this->assertEquals($updateAddressValues[1]['id'], $getValues[1]['id']); + $this->assertEquals('j3 Example Ave', $getValues[1]['street_address']); + $this->assertTrue(empty($getValues[1]['supplemental_address_1'])); + } + } -- 2.25.1