Merge pull request #20919 from JMAConsulting/issue_2710
[civicrm-core.git] / Civi / Test / ContactTestTrait.php
1 <?php
2
3 namespace Civi\Test;
4
5 /**
6 * Class ContactTestTrait
7 *
8 * @package Civi\Test
9 *
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.
15 */
16 trait ContactTestTrait {
17
18 /**
19 * Emulate a logged in user since certain functions use that.
20 * value to store a record in the DB (like activity)
21 *
22 * @see https://issues.civicrm.org/jira/browse/CRM-8180
23 *
24 * @return int
25 * Contact ID of the created user.
26 */
27 public function createLoggedInUser(): int {
28 $params = [
29 'first_name' => 'Logged In',
30 'last_name' => 'User ' . rand(),
31 'contact_type' => 'Individual',
32 'domain_id' => \CRM_Core_Config::domainID(),
33 ];
34 $contactID = $this->individualCreate($params);
35 $this->callAPISuccess('UFMatch', 'get', ['uf_id' => 6, 'api.UFMatch.delete' => []]);
36 $this->callAPISuccess('UFMatch', 'create', [
37 'contact_id' => $contactID,
38 'uf_name' => 'superman',
39 'uf_id' => 6,
40 ]);
41
42 $session = \CRM_Core_Session::singleton();
43 $session->set('userID', $contactID);
44 return $contactID;
45 }
46
47 /**
48 * Generic function to create Organisation, to be used in test cases
49 *
50 * @param array $params
51 * parameters for civicrm_contact_add api function call
52 * @param int $seq
53 * sequence number if creating multiple organizations
54 *
55 * @return int
56 * id of Organisation created
57 */
58 public function organizationCreate($params = [], $seq = 0): int {
59 if (!$params) {
60 $params = [];
61 }
62 $params = array_merge($this->sampleContact('Organization', $seq), $params);
63 return $this->_contactCreate($params);
64 }
65
66 /**
67 * Generic function to create Individual, to be used in test cases
68 *
69 * @param array $params
70 * parameters for civicrm_contact_add api function call
71 * @param int $seq
72 * sequence number if creating multiple individuals
73 * @param bool $random
74 *
75 * @return int
76 * id of Individual created
77 */
78 public function individualCreate(array $params = [], $seq = 0, $random = FALSE): int {
79 $params = array_merge($this->sampleContact('Individual', $seq, $random), $params);
80 return $this->_contactCreate($params);
81 }
82
83 /**
84 * Generic function to create Household, to be used in test cases
85 *
86 * @param array $params
87 * parameters for civicrm_contact_add api function call
88 * @param int $seq
89 * sequence number if creating multiple households
90 *
91 * @return int
92 * id of Household created
93 *
94 * @throws \CRM_Core_Exception
95 */
96 public function householdCreate($params = [], $seq = 0) {
97 $params = array_merge($this->sampleContact('Household', $seq), $params);
98 return $this->_contactCreate($params);
99 }
100
101 /**
102 * Helper function for getting sample contact properties.
103 *
104 * @param string $contact_type
105 * enum contact type: Individual, Organization
106 * @param int $seq
107 * sequence number for the values of this type
108 * @param bool $random
109 *
110 * @return array
111 * properties of sample contact (ie. $params for API call)
112 */
113 public function sampleContact($contact_type, $seq = 0, $random = FALSE) {
114 $samples = [
115 'Individual' => [
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'],
120 ],
121 'Organization' => [
122 'organization_name' => [
123 'Unit Test Organization',
124 'Acme',
125 'Roberts and Sons',
126 'Cryo Space Labs',
127 'Sharper Pens',
128 ],
129 ],
130 'Household' => [
131 'household_name' => ['Unit Test household'],
132 ],
133 ];
134 $params = ['contact_type' => $contact_type];
135 foreach ($samples[$contact_type] as $key => $values) {
136 $params[$key] = $values[$seq % count($values)];
137 if ($random) {
138 $params[$key] .= substr(sha1(rand()), 0, 5);
139 }
140 }
141 if ($contact_type == 'Individual') {
142 $params['email'] = strtolower(
143 $params['first_name'] . '_' . $params['last_name'] . '@civicrm.org'
144 );
145 $params['prefix_id'] = 3;
146 $params['suffix_id'] = 3;
147 }
148 return $params;
149 }
150
151 /**
152 * Private helper function for calling civicrm_contact_add.
153 *
154 * @param array $params
155 * For civicrm_contact_add api function call.
156 *
157 * @return int
158 * id of contact created
159 */
160 private function _contactCreate(array $params): int {
161 $version = $this->_apiversion;
162 $this->_apiversion = 3;
163 $result = $this->callAPISuccess('contact', 'create', $params);
164 $this->_apiversion = $version;
165 return (int) $result['id'];
166 }
167
168 /**
169 * Delete contact, ensuring it is not the domain contact
170 *
171 * @param int $contactID
172 * Contact ID to delete
173 */
174 public function contactDelete($contactID) {
175 $domain = new \CRM_Core_BAO_Domain();
176 $domain->contact_id = $contactID;
177 if (!$domain->find(TRUE)) {
178 $this->callAPISuccess('contact', 'delete', [
179 'id' => $contactID,
180 'skip_undelete' => 1,
181 ]);
182 }
183 }
184
185 /**
186 * Add a Group.
187 *
188 * @param array $params
189 *
190 * @return int
191 * groupId of created group
192 */
193 public function groupCreate($params = []) {
194 $params = array_merge([
195 'name' => 'Test Group 1',
196 'domain_id' => 1,
197 'title' => 'New Test Group Created',
198 'description' => 'New Test Group Created',
199 'is_active' => 1,
200 'visibility' => 'Public Pages',
201 'group_type' => [
202 '1' => 1,
203 '2' => 1,
204 ],
205 ], $params);
206
207 $result = $this->callAPISuccess('Group', 'create', $params);
208 return $result['id'];
209 }
210
211 /**
212 * Delete a Group.
213 *
214 * @param int $gid
215 */
216 public function groupDelete($gid) {
217 $params = [
218 'id' => $gid,
219 ];
220
221 $this->callAPISuccess('Group', 'delete', $params);
222 }
223
224 /**
225 * Function to add a Group.
226 *
227 * @params array to add group
228 *
229 * @param int $groupID
230 * @param int $totalCount
231 * @param bool $random
232 *
233 * @return int
234 * groupId of created group
235 */
236 public function groupContactCreate($groupID, $totalCount = 10, $random = FALSE) {
237 $params = ['group_id' => $groupID];
238 for ($i = 1; $i <= $totalCount; $i++) {
239 $contactID = $this->individualCreate([], 0, $random);
240 if ($i == 1) {
241 $params += ['contact_id' => $contactID];
242 }
243 else {
244 $params += ["contact_id.$i" => $contactID];
245 }
246 }
247 $result = $this->callAPISuccess('GroupContact', 'create', $params);
248
249 return $result;
250 }
251
252 }