$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.
*/
* Verify that attempt to create individual contact with only an email succeeds.
*/
public function testCreateEmailIndividual() {
-
+ $primaryEmail = 'man3@yahoo.com';
+ $notPrimaryEmail = 'man4@yahoo.com';
$params = array(
- 'email' => 'man3@yahoo.com',
+ 'email' => $primaryEmail,
'contact_type' => 'Individual',
'location_type_id' => 1,
);
- $contact = $this->callAPISuccess('contact', 'create', $params);
+ $contact1 = $this->callAPISuccess('contact', 'create', $params);
- $this->assertEquals(3, $contact['id']);
- $email = $this->callAPISuccess('email', 'get', array('contact_id' => $contact['id']));
- $this->assertEquals(1, $email['count']);
- $this->assertEquals('man3@yahoo.com', $email['values'][$email['id']]['email']);
+ $this->assertEquals(3, $contact1['id']);
+ $email1 = $this->callAPISuccess('email', 'get', array('contact_id' => $contact1['id']));
+ $this->assertEquals(1, $email1['count']);
+ $this->assertEquals($primaryEmail, $email1['values'][$email1['id']]['email']);
- $this->callAPISuccess('contact', 'delete', $contact);
+ $email2 = $this->callAPISuccess('email', 'create', array('contact_id' => $contact1['id'], 'is_primary' => 0, 'email' => $notPrimaryEmail));
+
+ // Case 1: Check with criteria primary 'email' => array('IS NOT NULL' => 1)
+ $result = $this->callAPISuccess('contact', 'get', array('email' => array('IS NOT NULL' => 1)));
+ $primaryEmailContactIds = array_keys($result['values']);
+ $this->assertEquals($primaryEmail, $email1['values'][$email1['id']]['email']);
+
+ // Case 2: Check with criteria primary 'email' => array('<>' => '')
+ $result = $this->callAPISuccess('contact', 'get', array('email' => array('<>' => '')));
+ $primaryEmailContactIds = array_keys($result['values']);
+ $this->assertEquals($primaryEmail, $email1['values'][$email1['id']]['email']);
+
+ // Case 3: Check with email_id='primary email id'
+ $result = $this->callAPISuccess('contact', 'get', array('email_id' => $email1['id']));
+ $this->assertEquals(1, $result['count']);
+ $this->assertEquals($contact1['id'], $result['id']);
+
+ $this->callAPISuccess('contact', 'delete', $contact1);
}
/**
$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.
*/
*
* 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,
+ ),
+ );
}
/**
'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',
// 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',
);
'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']);
}
/**
'table_name' => 'cc',
));
$expected = array(
+ 'Aadvark, Bob',
'Bob, Bob',
'K Bobby, Bob',
'A Bobby, Bobby',
$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']);
}
/**
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',
'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']);
}
/**
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',
),
),
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';
$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);
+ }
+ }
+
}