X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=tests%2Fphpunit%2Fapi%2Fv3%2FContactTest.php;h=cfe690a31cd4aa826f84b73be809a935550bed71;hb=34d388cc4ad0fe4bbe3f4052695f6ac6d0d16050;hp=ea70d9f74ebb92ed2971bf46cc9e6a5ce6c35833;hpb=c8564cf3490c025488d772eb93796344e10c0336;p=civicrm-core.git diff --git a/tests/phpunit/api/v3/ContactTest.php b/tests/phpunit/api/v3/ContactTest.php index ea70d9f74e..cfe690a31c 100644 --- a/tests/phpunit/api/v3/ContactTest.php +++ b/tests/phpunit/api/v3/ContactTest.php @@ -199,6 +199,45 @@ class api_v3_ContactTest extends CiviUnitTestCase { $this->assertEquals(array('Student', 'Staff'), $contact['values'][$cid]['contact_sub_type']); } + /** + * Verify that we can retreive contacts of different sub types + */ + public function testGetMultipleContactSubTypes() { + + // This test presumes that there are no parents or students in the dataset + + // create a student + $student = $this->callAPISuccess('contact', 'create', array( + 'email' => 'student@example.com', + 'contact_type' => 'Individual', + 'contact_sub_type' => 'Student', + )); + + // create a parent + $parent = $this->callAPISuccess('contact', 'create', array( + 'email' => 'parent@example.com', + 'contact_type' => 'Individual', + 'contact_sub_type' => 'Parent', + )); + + // create a parent + $contact = $this->callAPISuccess('contact', 'create', array( + 'email' => 'parent@example.com', + 'contact_type' => 'Individual', + )); + + // get all students and parents + $getParams = array('contact_sub_type' => array('IN' => array('Parent', 'Student'))); + $result = civicrm_api3('contact', 'get', $getParams); + + // check that we retrieved the student and the parent + $this->assertArrayHasKey($student['id'], $result['values']); + $this->assertArrayHasKey($parent['id'], $result['values']); + $this->assertEquals(2, $result['count']); + + } + + /** * Verify that attempt to create contact with empty params fails. */ @@ -2249,6 +2288,24 @@ class api_v3_ContactTest extends CiviUnitTestCase { $this->callAPISuccess('contact', 'create', $params); } + /** + * Test that delete with skip undelete respects permissions. + */ + public function testContactDeletePermissions() { + $contactID = $this->individualCreate(); + CRM_Core_Config::singleton()->userPermissionClass->permissions = array('access CiviCRM'); + $this->callAPIFailure('Contact', 'delete', array( + 'id' => $contactID, + 'check_permissions' => 1, + 'skip_undelete' => 1, + )); + $this->callAPISuccess('Contact', 'delete', array( + 'id' => $contactID, + 'check_permissions' => 0, + 'skip_undelete' => 1, + )); + } + /** * Test update with check permissions set. */ @@ -2350,19 +2407,100 @@ class api_v3_ContactTest extends CiviUnitTestCase { * * The search string 'b' & 'bob' both return ordered by sort_name if includeOrderByClause * is true (default) but if it is false then matches are returned in ID order. + * + * @dataProvider getSearchSortOptions */ - public function testGetQuickExactFirst() { + public function testGetQuickExactFirst($searchParameters, $settings, $firstContact, $secondContact = NULL) { $this->getQuickSearchSampleData(); - $result = $this->callAPISuccess('contact', 'getquick', array('name' => 'b')); - $this->assertEquals('A Bobby, Bobby', $result['values'][0]['sort_name']); - $this->assertEquals('B Bobby, Bobby', $result['values'][1]['sort_name']); - $result = $this->callAPISuccess('contact', 'getquick', array('name' => 'bob')); - $this->assertEquals('A Bobby, Bobby', $result['values'][0]['sort_name']); - $this->assertEquals('B Bobby, Bobby', $result['values'][1]['sort_name']); - $this->callAPISuccess('Setting', 'create', array('includeOrderByClause' => FALSE)); - $result = $this->callAPISuccess('contact', 'getquick', array('name' => 'bob')); - $this->assertEquals('Bob, Bob', $result['values'][0]['sort_name']); - $this->assertEquals('A Bobby, Bobby', $result['values'][1]['sort_name']); + $this->callAPISuccess('Setting', 'create', $settings); + $result = $this->callAPISuccess('contact', 'getquick', $searchParameters); + $this->assertEquals($firstContact, $result['values'][0]['sort_name']); + $this->assertEquals($secondContact, $result['values'][1]['sort_name']); + $this->callAPISuccess('Setting', 'create', array('includeWildCardInName' => TRUE, 'includeOrderByClause' => TRUE)); + } + + public function getSearchSortOptions() { + $firstAlphabeticalContactBySortName = 'A Bobby, Bobby'; + $secondAlphabeticalContactBySortName = 'Aadvark, Bob'; + $secondAlphabeticalContactWithEmailBySortName = 'Bob, Bob'; + $firstAlphabeticalContactFirstNameBob = 'Aadvark, Bob'; + $secondAlphabeticalContactFirstNameBob = 'Bob, Bob'; + $firstByIDContactFirstNameBob = 'Bob, Bob'; + $secondByIDContactFirstNameBob = 'K Bobby, Bob'; + $firstContactByID = 'Bob, Bob'; + $secondContactByID = 'E Bobby, Bobby'; + $bobLikeEmail = 'A Bobby, Bobby'; + + return array( + 'empty_search_basic' => array( + 'search_parameters' => array('name' => '%'), + 'settings' => array('includeWildCardInName' => TRUE, 'includeOrderByClause' => TRUE), + 'first_contact' => $firstAlphabeticalContactBySortName, + 'second_contact' => $secondAlphabeticalContactBySortName, + ), + 'empty_search_basic_no_wildcard' => array( + 'search_parameters' => array('name' => '%'), + 'settings' => array('includeWildCardInName' => FALSE, 'includeOrderByClause' => TRUE), + 'first_contact' => $firstAlphabeticalContactBySortName, + 'second_contact' => $secondAlphabeticalContactBySortName, + ), + 'single_letter_search_basic' => array( + 'search_parameters' => array('name' => 'b'), + 'settings' => array('includeWildCardInName' => TRUE, 'includeOrderByClause' => TRUE), + 'first_contact' => $firstAlphabeticalContactBySortName, + 'second_contact' => $secondAlphabeticalContactBySortName, + ), + 'bob_search_basic' => array( + 'search_parameters' => array('name' => 'bob'), + 'settings' => array('includeWildCardInName' => TRUE, 'includeOrderByClause' => TRUE), + 'first_contact' => $firstAlphabeticalContactBySortName, + 'second_contact' => $secondAlphabeticalContactBySortName, + ), + 'bob_search_no_orderby' => array( + 'search_parameters' => array('name' => 'bob'), + 'settings' => array('includeWildCardInName' => TRUE, 'includeOrderByClause' => FALSE), + 'first_contact' => $firstContactByID, + 'second_contact' => $secondContactByID, + ), + 'bob_search_no_wildcard' => array( + 'search_parameters' => array('name' => 'bob'), + 'settings' => array('includeWildCardInName' => FALSE, 'includeOrderByClause' => TRUE), + 'second_contact' => $bobLikeEmail, + 'first_contact' => $secondAlphabeticalContactFirstNameBob, + ), + // This should be the same as just no wildcard as if we had an exactMatch while searching by + // sort name it would rise to the top CRM-19547 + 'bob_search_no_wildcard_no_orderby' => array( + 'search_parameters' => array('name' => 'bob'), + 'settings' => array('includeWildCardInName' => FALSE, 'includeOrderByClause' => TRUE), + 'second_contact' => $bobLikeEmail, + 'first_contact' => $secondAlphabeticalContactFirstNameBob, + ), + 'first_name_search_basic' => array( + 'search_parameters' => array('name' => 'bob', 'field_name' => 'first_name'), + 'settings' => array('includeWildCardInName' => TRUE, 'includeOrderByClause' => TRUE), + 'first_contact' => $firstAlphabeticalContactFirstNameBob, + 'second_contact' => $secondAlphabeticalContactFirstNameBob, + ), + 'first_name_search_no_wildcard' => array( + 'search_parameters' => array('name' => 'bob', 'field_name' => 'first_name'), + 'settings' => array('includeWildCardInName' => FALSE, 'includeOrderByClause' => TRUE), + 'first_contact' => $firstAlphabeticalContactFirstNameBob, + 'second_contact' => $secondAlphabeticalContactFirstNameBob, + ), + 'first_name_search_no_orderby' => array( + 'search_parameters' => array('name' => 'bob', 'field_name' => 'first_name'), + 'settings' => array('includeWildCardInName' => TRUE, 'includeOrderByClause' => FALSE), + 'first_contact' => $firstByIDContactFirstNameBob, + 'second_contact' => $secondByIDContactFirstNameBob, + ), + 'email_search_basic' => array( + 'search_parameters' => array('name' => 'bob', 'field_name' => 'email', 'table_name' => 'eml'), + 'settings' => array('includeWildCardInName' => FALSE, 'includeOrderByClause' => TRUE), + 'first_contact' => $firstAlphabeticalContactBySortName, + 'second_contact' => $secondAlphabeticalContactWithEmailBySortName, + ), + ); } /** @@ -2375,9 +2513,9 @@ class api_v3_ContactTest extends CiviUnitTestCase { 'name' => 'c', )); $expectedData = array( + 'A Bobby, Bobby :: bob@bobby.com', 'Bob, Bob :: bob@bob.com', 'C Bobby, Bobby', - 'E Bobby, Bobby :: bob@bobby.com', 'H Bobby, Bobby :: bob@h.com', 'Second Domain', $this->callAPISuccessGetValue('Contact', array('id' => $loggedInContactID, 'return' => 'last_name')) . ', Logged In :: anthony_anderson@civicrm.org', @@ -2424,9 +2562,9 @@ class api_v3_ContactTest extends CiviUnitTestCase { // Without the acl it would be 6 like the previous email getquick test. $this->assertEquals(5, $result['count']); $expectedData = array( + 'A Bobby, Bobby :: bob@bobby.com', 'Bob, Bob :: bob@bob.com', 'C Bobby, Bobby', - 'E Bobby, Bobby :: bob@bobby.com', 'Second Domain', $this->callAPISuccessGetValue('Contact', array('id' => $loggedInContactID, 'return' => 'last_name')) . ', Logged In :: anthony_anderson@civicrm.org', ); @@ -2467,14 +2605,14 @@ class api_v3_ContactTest extends CiviUnitTestCase { 'table_name' => 'cc', )); $this->assertEquals(1, $result['count']); - $this->assertEquals('A Bobby, Bobby', $result['values'][0]['sort_name']); + $this->assertEquals('E Bobby, Bobby', $result['values'][0]['sort_name']); $result = $this->callAPISuccess('contact', 'getquick', array( 'name' => $max + 2, 'field_name' => 'contact_id', 'table_name' => 'cc', )); $this->assertEquals(1, $result['count']); - $this->assertEquals('A Bobby, Bobby', $result['values'][0]['sort_name']); + $this->assertEquals('E Bobby, Bobby', $result['values'][0]['sort_name']); } /** @@ -2491,6 +2629,7 @@ class api_v3_ContactTest extends CiviUnitTestCase { 'table_name' => 'cc', )); $expected = array( + 'Aadvark, Bob', 'Bob, Bob', 'K Bobby, Bob', 'A Bobby, Bobby', @@ -2502,7 +2641,7 @@ class api_v3_ContactTest extends CiviUnitTestCase { $this->callAPISuccess('Setting', 'create', array('includeOrderByClause' => FALSE)); $result = $this->callAPISuccess('contact', 'getquick', array('name' => 'bob')); $this->assertEquals('Bob, Bob', $result['values'][0]['sort_name']); - $this->assertEquals('A Bobby, Bobby', $result['values'][1]['sort_name']); + $this->assertEquals('E Bobby, Bobby', $result['values'][1]['sort_name']); } /** @@ -2511,7 +2650,7 @@ class api_v3_ContactTest extends CiviUnitTestCase { public function testGetQuickFirstNameACLs() { $this->getQuickSearchSampleData(); $userID = $this->createLoggedInUser(); - $this->callAPISuccess('Setting', 'create', array('includeOrderByClause' => TRUE)); + $this->callAPISuccess('Setting', 'create', array('includeOrderByClause' => TRUE, 'search_autocomplete_count' => 15)); CRM_Core_Config::singleton()->userPermissionClass->permissions = array(); $result = $this->callAPISuccess('contact', 'getquick', array( 'name' => 'Bob', @@ -2527,9 +2666,9 @@ class api_v3_ContactTest extends CiviUnitTestCase { 'field_name' => 'first_name', 'table_name' => 'cc', )); - $this->assertEquals('K Bobby, Bob', $result['values'][1]['sort_name']); + $this->assertEquals('K Bobby, Bob', $result['values'][2]['sort_name']); // Without the ACL 9 would be bob@h.com. - $this->assertEquals('I Bobby, Bobby', $result['values'][9]['sort_name']); + $this->assertEquals('I Bobby, Bobby', $result['values'][10]['sort_name']); } /** @@ -2598,7 +2737,7 @@ class api_v3_ContactTest extends CiviUnitTestCase { public function getQuickSearchSampleData() { $contacts = array( array('first_name' => 'Bob', 'last_name' => 'Bob', 'external_identifier' => 'abc', 'email' => 'bob@bob.com'), - array('first_name' => 'Bobby', 'last_name' => 'A Bobby', 'external_identifier' => 'abcd'), + array('first_name' => 'Bobby', 'last_name' => 'E Bobby', 'external_identifier' => 'abcd'), array( 'first_name' => 'Bobby', 'last_name' => 'B Bobby', @@ -2620,13 +2759,14 @@ class api_v3_ContactTest extends CiviUnitTestCase { ), ), array('first_name' => 'Bobby', 'last_name' => 'D Bobby', 'external_identifier' => 'efg'), - array('first_name' => 'Bobby', 'last_name' => 'E Bobby', 'external_identifier' => 'hij', 'email' => 'bob@bobby.com'), + array('first_name' => 'Bobby', 'last_name' => 'A Bobby', 'external_identifier' => 'hij', 'email' => 'bob@bobby.com'), array('first_name' => 'Bobby', 'last_name' => 'F Bobby', 'external_identifier' => 'klm'), array('first_name' => 'Bobby', 'last_name' => 'G Bobby', 'external_identifier' => 'nop'), array('first_name' => 'Bobby', 'last_name' => 'H Bobby', 'external_identifier' => 'qrs', 'email' => 'bob@h.com'), array('first_name' => 'Bobby', 'last_name' => 'I Bobby'), array('first_name' => 'Bobby', 'last_name' => 'J Bobby'), array('first_name' => 'Bob', 'last_name' => 'K Bobby', 'external_identifier' => 'bcdef'), + array('first_name' => 'Bob', 'last_name' => 'Aadvark'), ); foreach ($contacts as $type => $contact) { $contact['contact_type'] = 'Individual'; @@ -2967,4 +3107,63 @@ class api_v3_ContactTest extends CiviUnitTestCase { $this->callAPISuccess('Setting', 'create', array('contact_undelete' => TRUE)); } + /** + * Ensure format with return=group shows comma-separated group IDs. + * + * CRM-19426 + */ + public function testContactGetReturnGroup() { + // Set up a contact, asser that they were created. + $contact_params = array( + 'contact_type' => 'Individual', + 'first_name' => 'Test', + 'last_name' => 'Groupmember', + 'email' => 'test@example.org', + ); + $create_contact = $this->callApiSuccess('Contact', 'create', $contact_params); + $this->assertEquals(0, $create_contact['is_error']); + $this->assertInternalType('int', $create_contact['id']); + + $created_contact_id = $create_contact['id']; + + // Set up multiple groups, add the contact to the groups. + $test_groups = array('Test group A', 'Test group B'); + foreach ($test_groups as $title) { + // Use this contact as group owner, since we know they exist. + $group_params = array( + 'title' => $title, + 'created_id' => $created_contact_id, + ); + $create_group = $this->callApiSuccess('Group', 'create', $group_params); + $this->assertEquals(0, $create_group['is_error']); + $this->assertInternalType('int', $create_group['id']); + + $created_group_ids[] = $create_group['id']; + + // Add contact to the new group. + $group_contact_params = array( + 'contact_id' => $created_contact_id, + 'group_id' => $create_group['id'], + ); + $create_group_contact = $this->callApiSuccess('GroupContact', 'create', $group_contact_params); + $this->assertEquals(0, $create_group_contact['is_error']); + $this->assertInternalType('int', $create_group_contact['added']); + } + + // Use the Contact,get API to retrieve the contact + $contact_get_params = array( + 'id' => $created_contact_id, + 'return' => 'group', + ); + $contact_get = $this->callApiSuccess('Contact', 'get', $contact_get_params); + $this->assertInternalType('array', $contact_get['values'][$created_contact_id]); + $this->assertInternalType('string', $contact_get['values'][$created_contact_id]['groups']); + + // Ensure they are shown as being in each created group. + $contact_group_ids = explode(',', $contact_get['values'][$created_contact_id]['groups']); + foreach ($created_group_ids as $created_group_id) { + $this->assertContains($created_group_id, $contact_group_ids); + } + } + }