6 * Class ContactTestTrait
10 * This trait defines a number of helper functions for managing
11 * test contacts. Generally, it depends on having access to the
12 * API test functions ($this->callAPISuccess()) and to the
13 * standard PHPUnit assertions ($this->assertEquals). It should
14 * not impose any other requirements for the downstream consumer class.
16 trait ContactTestTrait
{
19 * Emulate a logged in user since certain functions use that.
20 * value to store a record in the DB (like activity)
24 * Contact ID of the created user.
26 public function createLoggedInUser() {
28 'first_name' => 'Logged In',
29 'last_name' => 'User ' . rand(),
30 'contact_type' => 'Individual',
31 'domain_id' => \CRM_Core_Config
::domainID(),
33 $contactID = $this->individualCreate($params);
34 $this->callAPISuccess('UFMatch', 'create', [
35 'contact_id' => $contactID,
36 'uf_name' => 'superman',
40 $session = \CRM_Core_Session
::singleton();
41 $session->set('userID', $contactID);
46 * Generic function to create Organisation, to be used in test cases
48 * @param array $params
49 * parameters for civicrm_contact_add api function call
51 * sequence number if creating multiple organizations
54 * id of Organisation created
56 public function organizationCreate($params = [], $seq = 0) {
60 $params = array_merge($this->sampleContact('Organization', $seq), $params);
61 return $this->_contactCreate($params);
65 * Generic function to create Individual, to be used in test cases
67 * @param array $params
68 * parameters for civicrm_contact_add api function call
70 * sequence number if creating multiple individuals
74 * id of Individual created
76 * @throws \CRM_Core_Exception
78 public function individualCreate($params = [], $seq = 0, $random = FALSE) {
79 $params = array_merge($this->sampleContact('Individual', $seq, $random), $params);
80 return $this->_contactCreate($params);
84 * Generic function to create Household, to be used in test cases
86 * @param array $params
87 * parameters for civicrm_contact_add api function call
89 * sequence number if creating multiple households
92 * id of Household created
94 * @throws \CRM_Core_Exception
96 public function householdCreate($params = [], $seq = 0) {
97 $params = array_merge($this->sampleContact('Household', $seq), $params);
98 return $this->_contactCreate($params);
102 * Helper function for getting sample contact properties.
104 * @param string $contact_type
105 * enum contact type: Individual, Organization
107 * sequence number for the values of this type
108 * @param bool $random
111 * properties of sample contact (ie. $params for API call)
113 public function sampleContact($contact_type, $seq = 0, $random = FALSE) {
116 // The number of values in each list need to be coprime numbers to not have duplicates
117 'first_name' => ['Anthony', 'Joe', 'Terrence', 'Lucie', 'Albert', 'Bill', 'Kim'],
118 'middle_name' => ['J.', 'M.', 'P', 'L.', 'K.', 'A.', 'B.', 'C.', 'D', 'E.', 'Z.'],
119 'last_name' => ['Anderson', 'Miller', 'Smith', 'Collins', 'Peterson'],
122 'organization_name' => [
123 'Unit Test Organization',
131 'household_name' => ['Unit Test household'],
134 $params = ['contact_type' => $contact_type];
135 foreach ($samples[$contact_type] as $key => $values) {
136 $params[$key] = $values[$seq %
count($values)];
138 $params[$key] .= substr(sha1(rand()), 0, 5);
141 if ($contact_type == 'Individual') {
142 $params['email'] = strtolower(
143 $params['first_name'] . '_' . $params['last_name'] . '@civicrm.org'
145 $params['prefix_id'] = 3;
146 $params['suffix_id'] = 3;
152 * Private helper function for calling civicrm_contact_add.
154 * @param array $params
155 * For civicrm_contact_add api function call.
158 * id of Household created
159 * @throws \CRM_Core_Exception
162 private function _contactCreate($params) {
163 $result = civicrm_api3('contact', 'create', $params);
164 if (!empty($result['is_error']) ||
empty($result['id'])) {
165 throw new \
CRM_Core_Exception('Could not create test contact, with message: ' . \CRM_Utils_Array
::value('error_message', $result) . "\nBacktrace:" . \CRM_Utils_Array
::value('trace', $result));
167 return $result['id'];
171 * Delete contact, ensuring it is not the domain contact
173 * @param int $contactID
174 * Contact ID to delete
176 public function contactDelete($contactID) {
177 $domain = new \
CRM_Core_BAO_Domain();
178 $domain->contact_id
= $contactID;
179 if (!$domain->find(TRUE)) {
180 $this->callAPISuccess('contact', 'delete', [
182 'skip_undelete' => 1,
190 * @param array $params
193 * groupId of created group
195 public function groupCreate($params = []) {
196 $params = array_merge([
197 'name' => 'Test Group 1',
199 'title' => 'New Test Group Created',
200 'description' => 'New Test Group Created',
202 'visibility' => 'Public Pages',
209 $result = $this->callAPISuccess('Group', 'create', $params);
210 return $result['id'];
218 public function groupDelete($gid) {
223 $this->callAPISuccess('Group', 'delete', $params);
227 * Function to add a Group.
229 * @params array to add group
231 * @param int $groupID
232 * @param int $totalCount
233 * @param bool $random
236 * groupId of created group
238 public function groupContactCreate($groupID, $totalCount = 10, $random = FALSE) {
239 $params = ['group_id' => $groupID];
240 for ($i = 1; $i <= $totalCount; $i++
) {
241 $contactID = $this->individualCreate([], 0, $random);
243 $params +
= ['contact_id' => $contactID];
246 $params +
= ["contact_id.$i" => $contactID];
249 $result = $this->callAPISuccess('GroupContact', 'create', $params);