Commit | Line | Data |
---|---|---|
0622d221 | 1 | <?php |
0622d221 | 2 | |
3 | /** | |
4 | * Class CRM_Dedupe_DedupeMergerTest | |
acb109b7 | 5 | * @group headless |
0622d221 | 6 | */ |
7 | class CRM_Dedupe_MergerTest extends CiviUnitTestCase { | |
8 | ||
9 | protected $_groupId; | |
10 | protected $_contactIds = array(); | |
11 | ||
3308aac0 | 12 | public function tearDown() { |
13 | $this->quickCleanup(array('civicrm_contact', 'civicrm_group_contact', 'civicrm_group')); | |
14 | parent::tearDown(); | |
15 | } | |
16 | ||
0622d221 | 17 | public function createDupeContacts() { |
18 | // create a group to hold contacts, so that dupe checks don't consider any other contacts in the DB | |
19 | $params = array( | |
20 | 'name' => 'Test Dupe Merger Group', | |
21 | 'title' => 'Test Dupe Merger Group', | |
22 | 'domain_id' => 1, | |
23 | 'is_active' => 1, | |
24 | 'visibility' => 'Public Pages', | |
0622d221 | 25 | ); |
87a56b12 | 26 | |
27 | $result = $this->callAPISuccess('group', 'create', $params); | |
0622d221 | 28 | $this->_groupId = $result['id']; |
29 | ||
30 | // contact data set | |
31 | ||
32 | // make dupe checks based on based on following contact sets: | |
33 | // FIRST - LAST - EMAIL | |
34 | // --------------------------------- | |
35 | // robin - hood - robin@example.com | |
36 | // robin - hood - robin@example.com | |
37 | // robin - hood - hood@example.com | |
38 | // robin - dale - robin@example.com | |
39 | // little - dale - dale@example.com | |
40 | // little - dale - dale@example.com | |
41 | // will - dale - dale@example.com | |
42 | // will - dale - will@example.com | |
43 | // will - dale - will@example.com | |
44 | $params = array( | |
45 | array( | |
46 | 'first_name' => 'robin', | |
47 | 'last_name' => 'hood', | |
48 | 'email' => 'robin@example.com', | |
49 | 'contact_type' => 'Individual', | |
50 | ), | |
51 | array( | |
52 | 'first_name' => 'robin', | |
53 | 'last_name' => 'hood', | |
54 | 'email' => 'robin@example.com', | |
55 | 'contact_type' => 'Individual', | |
56 | ), | |
57 | array( | |
58 | 'first_name' => 'robin', | |
59 | 'last_name' => 'hood', | |
60 | 'email' => 'hood@example.com', | |
61 | 'contact_type' => 'Individual', | |
62 | ), | |
63 | array( | |
64 | 'first_name' => 'robin', | |
65 | 'last_name' => 'dale', | |
66 | 'email' => 'robin@example.com', | |
67 | 'contact_type' => 'Individual', | |
68 | ), | |
69 | array( | |
70 | 'first_name' => 'little', | |
71 | 'last_name' => 'dale', | |
72 | 'email' => 'dale@example.com', | |
73 | 'contact_type' => 'Individual', | |
74 | ), | |
75 | array( | |
76 | 'first_name' => 'little', | |
77 | 'last_name' => 'dale', | |
78 | 'email' => 'dale@example.com', | |
79 | 'contact_type' => 'Individual', | |
80 | ), | |
81 | array( | |
82 | 'first_name' => 'will', | |
83 | 'last_name' => 'dale', | |
84 | 'email' => 'dale@example.com', | |
85 | 'contact_type' => 'Individual', | |
86 | ), | |
87 | array( | |
88 | 'first_name' => 'will', | |
89 | 'last_name' => 'dale', | |
90 | 'email' => 'will@example.com', | |
91 | 'contact_type' => 'Individual', | |
92 | ), | |
93 | array( | |
94 | 'first_name' => 'will', | |
95 | 'last_name' => 'dale', | |
96 | 'email' => 'will@example.com', | |
97 | 'contact_type' => 'Individual', | |
98 | ), | |
99 | ); | |
100 | ||
101 | $count = 1; | |
102 | foreach ($params as $param) { | |
103 | $param['version'] = 3; | |
104 | $contact = civicrm_api('contact', 'create', $param); | |
105 | $this->_contactIds[$count++] = $contact['id']; | |
106 | ||
107 | $grpParams = array( | |
108 | 'contact_id' => $contact['id'], | |
109 | 'group_id' => $this->_groupId, | |
110 | 'version' => 3, | |
111 | ); | |
87a56b12 | 112 | $this->callAPISuccess('group_contact', 'create', $grpParams); |
0622d221 | 113 | } |
114 | } | |
115 | ||
93ac19cd | 116 | /** |
117 | * Delete all created contacts. | |
118 | */ | |
0622d221 | 119 | public function deleteDupeContacts() { |
0622d221 | 120 | foreach ($this->_contactIds as $contactId) { |
93ac19cd | 121 | $this->contactDelete($contactId); |
0622d221 | 122 | } |
87a56b12 | 123 | $this->groupDelete($this->_groupId); |
0622d221 | 124 | } |
125 | ||
c8ec0753 | 126 | /** |
a354251e | 127 | * Test the batch merge. |
c8ec0753 | 128 | */ |
0622d221 | 129 | public function testBatchMergeSelectedDuplicates() { |
130 | $this->createDupeContacts(); | |
131 | ||
132 | // verify that all contacts have been created separately | |
133 | $this->assertEquals(count($this->_contactIds), 9, 'Check for number of contacts.'); | |
134 | ||
135 | $dao = new CRM_Dedupe_DAO_RuleGroup(); | |
136 | $dao->contact_type = 'Individual'; | |
137 | $dao->name = 'IndividualSupervised'; | |
138 | $dao->is_default = 1; | |
139 | $dao->find(TRUE); | |
140 | ||
141 | $foundDupes = CRM_Dedupe_Finder::dupesInGroup($dao->id, $this->_groupId); | |
142 | ||
143 | // ------------------------------------------------------------------------- | |
144 | // Name and Email (reserved) Matches ( 3 pairs ) | |
145 | // -------------------------------------------------------------------------- | |
146 | // robin - hood - robin@example.com | |
147 | // robin - hood - robin@example.com | |
148 | // little - dale - dale@example.com | |
149 | // little - dale - dale@example.com | |
150 | // will - dale - will@example.com | |
151 | // will - dale - will@example.com | |
152 | // so 3 pairs for - first + last + mail | |
153 | $this->assertEquals(count($foundDupes), 3, 'Check Individual-Supervised dupe rule for dupesInGroup().'); | |
154 | ||
155 | // Run dedupe finder as the browser would | |
156 | $_SERVER['REQUEST_METHOD'] = 'GET'; //avoid invalid key error | |
157 | $object = new CRM_Contact_Page_DedupeFind(); | |
158 | $object->set('gid', $this->_groupId); | |
159 | $object->set('rgid', $dao->id); | |
160 | $object->set('action', CRM_Core_Action::UPDATE); | |
64fe2fe0 | 161 | $object->setEmbedded(TRUE); |
0622d221 | 162 | @$object->run(); |
163 | ||
164 | // Retrieve pairs from prev next cache table | |
165 | $select = array('pn.is_selected' => 'is_selected'); | |
b1679439 | 166 | $cacheKeyString = CRM_Dedupe_Merger::getMergeCacheKeyString($dao->id, $this->_groupId); |
0622d221 | 167 | $pnDupePairs = CRM_Core_BAO_PrevNextCache::retrieve($cacheKeyString, NULL, NULL, 0, 0, $select); |
168 | ||
169 | $this->assertEquals(count($foundDupes), count($pnDupePairs), 'Check number of dupe pairs in prev next cache.'); | |
170 | ||
171 | // mark first two pairs as selected | |
172 | CRM_Core_DAO::singleValueQuery("UPDATE civicrm_prevnext_cache SET is_selected = 1 WHERE id IN ({$pnDupePairs[0]['prevnext_id']}, {$pnDupePairs[1]['prevnext_id']})"); | |
173 | ||
174 | $pnDupePairs = CRM_Core_BAO_PrevNextCache::retrieve($cacheKeyString, NULL, NULL, 0, 0, $select); | |
175 | $this->assertEquals($pnDupePairs[0]['is_selected'], 1, 'Check if first record in dupe pairs is marked as selected.'); | |
176 | $this->assertEquals($pnDupePairs[0]['is_selected'], 1, 'Check if second record in dupe pairs is marked as selected.'); | |
177 | ||
178 | // batch merge selected dupes | |
179 | $result = CRM_Dedupe_Merger::batchMerge($dao->id, $this->_groupId, 'safe', TRUE, 5, 1); | |
180 | $this->assertEquals(count($result['merged']), 2, 'Check number of merged pairs.'); | |
181 | ||
182 | // retrieve pairs from prev next cache table | |
183 | $pnDupePairs = CRM_Core_BAO_PrevNextCache::retrieve($cacheKeyString, NULL, NULL, 0, 0, $select); | |
184 | $this->assertEquals(count($pnDupePairs), 1, 'Check number of remaining dupe pairs in prev next cache.'); | |
185 | ||
186 | $this->deleteDupeContacts(); | |
187 | } | |
188 | ||
c8ec0753 | 189 | /** |
a354251e | 190 | * Test the batch merge. |
c8ec0753 | 191 | */ |
0622d221 | 192 | public function testBatchMergeAllDuplicates() { |
193 | $this->createDupeContacts(); | |
194 | ||
195 | // verify that all contacts have been created separately | |
196 | $this->assertEquals(count($this->_contactIds), 9, 'Check for number of contacts.'); | |
197 | ||
198 | $dao = new CRM_Dedupe_DAO_RuleGroup(); | |
199 | $dao->contact_type = 'Individual'; | |
200 | $dao->name = 'IndividualSupervised'; | |
201 | $dao->is_default = 1; | |
202 | $dao->find(TRUE); | |
203 | ||
204 | $foundDupes = CRM_Dedupe_Finder::dupesInGroup($dao->id, $this->_groupId); | |
205 | ||
206 | // ------------------------------------------------------------------------- | |
207 | // Name and Email (reserved) Matches ( 3 pairs ) | |
208 | // -------------------------------------------------------------------------- | |
209 | // robin - hood - robin@example.com | |
210 | // robin - hood - robin@example.com | |
211 | // little - dale - dale@example.com | |
212 | // little - dale - dale@example.com | |
213 | // will - dale - will@example.com | |
214 | // will - dale - will@example.com | |
215 | // so 3 pairs for - first + last + mail | |
216 | $this->assertEquals(count($foundDupes), 3, 'Check Individual-Supervised dupe rule for dupesInGroup().'); | |
217 | ||
218 | // Run dedupe finder as the browser would | |
219 | $_SERVER['REQUEST_METHOD'] = 'GET'; //avoid invalid key error | |
220 | $object = new CRM_Contact_Page_DedupeFind(); | |
221 | $object->set('gid', $this->_groupId); | |
222 | $object->set('rgid', $dao->id); | |
223 | $object->set('action', CRM_Core_Action::UPDATE); | |
64fe2fe0 | 224 | $object->setEmbedded(TRUE); |
0622d221 | 225 | @$object->run(); |
226 | ||
227 | // Retrieve pairs from prev next cache table | |
228 | $select = array('pn.is_selected' => 'is_selected'); | |
b1679439 | 229 | $cacheKeyString = CRM_Dedupe_Merger::getMergeCacheKeyString($dao->id, $this->_groupId); |
0622d221 | 230 | $pnDupePairs = CRM_Core_BAO_PrevNextCache::retrieve($cacheKeyString, NULL, NULL, 0, 0, $select); |
231 | ||
232 | $this->assertEquals(count($foundDupes), count($pnDupePairs), 'Check number of dupe pairs in prev next cache.'); | |
233 | ||
234 | // batch merge all dupes | |
235 | $result = CRM_Dedupe_Merger::batchMerge($dao->id, $this->_groupId, 'safe', TRUE, 5, 2); | |
236 | $this->assertEquals(count($result['merged']), 3, 'Check number of merged pairs.'); | |
237 | ||
238 | // retrieve pairs from prev next cache table | |
239 | $pnDupePairs = CRM_Core_BAO_PrevNextCache::retrieve($cacheKeyString, NULL, NULL, 0, 0, $select); | |
240 | $this->assertEquals(count($pnDupePairs), 0, 'Check number of remaining dupe pairs in prev next cache.'); | |
241 | ||
242 | $this->deleteDupeContacts(); | |
243 | } | |
244 | ||
bf17fa88 | 245 | /** |
246 | * The goal of this function is to test that all required tables are returned. | |
247 | */ | |
248 | public function testGetCidRefs() { | |
249 | $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__, 'Contacts'); | |
250 | $this->assertEquals(array_merge($this->getStaticCIDRefs(), $this->getHackedInCIDRef()), CRM_Dedupe_Merger::cidRefs()); | |
251 | $this->assertEquals(array_merge($this->getCalculatedCIDRefs(), $this->getHackedInCIDRef()), CRM_Dedupe_Merger::cidRefs()); | |
252 | } | |
253 | ||
254 | /** | |
255 | * Get the list of not-really-cid-refs that are currently hacked in. | |
256 | * | |
257 | * This is hacked into getCIDs function. | |
258 | * | |
259 | * @return array | |
260 | */ | |
261 | public function getHackedInCIDRef() { | |
262 | return array( | |
263 | 'civicrm_entity_tag' => array( | |
264 | 0 => 'entity_id', | |
265 | ), | |
266 | ); | |
267 | } | |
268 | ||
2988f5c7 | 269 | /** |
270 | * Test function that gets duplicate pairs. | |
271 | * | |
272 | * It turns out there are 2 code paths retrieving this data so my initial focus is on ensuring | |
273 | * they match. | |
274 | */ | |
275 | public function testGetMatches() { | |
276 | $this->setupMatchData(); | |
277 | $pairs = CRM_Dedupe_Merger::getDuplicatePairs( | |
278 | 1, | |
279 | NULL, | |
280 | TRUE, | |
281 | 25, | |
282 | FALSE | |
283 | ); | |
284 | ||
285 | $this->assertEquals(array( | |
286 | 0 => array( | |
08cde01f | 287 | 'srcID' => $this->contacts[1]['id'], |
2988f5c7 | 288 | 'srcName' => 'Mr. Mickey Mouse II', |
08cde01f | 289 | 'dstID' => $this->contacts[0]['id'], |
2988f5c7 | 290 | 'dstName' => 'Mr. Mickey Mouse II', |
291 | 'weight' => 20, | |
292 | 'canMerge' => TRUE, | |
293 | ), | |
3308aac0 | 294 | 1 => array( |
08cde01f | 295 | 'srcID' => $this->contacts[3]['id'], |
3308aac0 | 296 | 'srcName' => 'Mr. Minnie Mouse II', |
08cde01f | 297 | 'dstID' => $this->contacts[2]['id'], |
3308aac0 | 298 | 'dstName' => 'Mr. Minnie Mouse II', |
299 | 'weight' => 20, | |
300 | 'canMerge' => TRUE, | |
301 | ), | |
2988f5c7 | 302 | ), $pairs); |
303 | } | |
304 | ||
bc0f3965 | 305 | /** |
306 | * Test function that gets organization pairs. | |
307 | * | |
308 | * Note the rule will match on organization_name OR email - hence lots of matches. | |
309 | */ | |
310 | public function testGetOrganizationMatches() { | |
311 | $this->setupMatchData(); | |
312 | $ruleGroups = $this->callAPISuccessGetSingle('RuleGroup', array('contact_type' => 'Organization', 'used' => 'Supervised')); | |
313 | ||
314 | $pairs = CRM_Dedupe_Merger::getDuplicatePairs( | |
315 | $ruleGroups['id'], | |
316 | NULL, | |
317 | TRUE, | |
318 | 25, | |
319 | FALSE | |
320 | ); | |
321 | ||
72475b30 | 322 | $expectedPairs = array( |
bc0f3965 | 323 | 0 => array( |
324 | 'srcID' => $this->contacts[5]['id'], | |
325 | 'srcName' => 'Walt Disney Ltd', | |
326 | 'dstID' => $this->contacts[4]['id'], | |
327 | 'dstName' => 'Walt Disney Ltd', | |
328 | 'weight' => 20, | |
329 | 'canMerge' => TRUE, | |
330 | ), | |
331 | 1 => array( | |
332 | 'srcID' => $this->contacts[7]['id'], | |
333 | 'srcName' => 'Walt Disney', | |
334 | 'dstID' => $this->contacts[6]['id'], | |
335 | 'dstName' => 'Walt Disney', | |
336 | 'weight' => 10, | |
337 | 'canMerge' => TRUE, | |
338 | ), | |
339 | 2 => array( | |
340 | 'srcID' => $this->contacts[6]['id'], | |
341 | 'srcName' => 'Walt Disney', | |
342 | 'dstID' => $this->contacts[4]['id'], | |
343 | 'dstName' => 'Walt Disney Ltd', | |
344 | 'weight' => 10, | |
345 | 'canMerge' => TRUE, | |
346 | ), | |
347 | 3 => array( | |
348 | 'srcID' => $this->contacts[6]['id'], | |
349 | 'srcName' => 'Walt Disney', | |
350 | 'dstID' => $this->contacts[5]['id'], | |
351 | 'dstName' => 'Walt Disney Ltd', | |
352 | 'weight' => 10, | |
353 | 'canMerge' => TRUE, | |
354 | ), | |
72475b30 TO |
355 | ); |
356 | usort($pairs, array(__CLASS__, 'compareDupes')); | |
357 | usort($expectedPairs, array(__CLASS__, 'compareDupes')); | |
358 | $this->assertEquals($expectedPairs, $pairs); | |
359 | } | |
360 | ||
361 | /** | |
362 | * Function to sort $duplicate records in a stable way. | |
363 | * | |
364 | * @param array $a | |
365 | * @param array $b | |
366 | * @return int | |
367 | */ | |
368 | public static function compareDupes($a, $b) { | |
369 | foreach (array('srcName', 'dstName', 'srcID', 'dstID') as $field) { | |
370 | if ($a[$field] != $b[$field]) { | |
371 | return ($a[$field] < $b[$field]) ? 1 : -1; | |
372 | } | |
373 | } | |
374 | return 0; | |
bc0f3965 | 375 | } |
376 | ||
377 | /** | |
378 | * Test function that gets organization duplicate pairs. | |
379 | */ | |
380 | public function testGetOrganizationMatchesInGroup() { | |
381 | $this->setupMatchData(); | |
382 | $ruleGroups = $this->callAPISuccessGetSingle('RuleGroup', array('contact_type' => 'Organization', 'used' => 'Supervised')); | |
383 | ||
384 | $groupID = $this->groupCreate(array('title' => 'she-mice')); | |
385 | ||
386 | $this->callAPISuccess('GroupContact', 'create', array('group_id' => $groupID, 'contact_id' => $this->contacts[4]['id'])); | |
387 | ||
388 | $pairs = CRM_Dedupe_Merger::getDuplicatePairs( | |
389 | $ruleGroups['id'], | |
390 | $groupID, | |
391 | TRUE, | |
392 | 25, | |
393 | FALSE | |
394 | ); | |
395 | ||
396 | $this->assertEquals(array( | |
397 | 0 => array( | |
398 | 'srcID' => $this->contacts[5]['id'], | |
399 | 'srcName' => 'Walt Disney Ltd', | |
400 | 'dstID' => $this->contacts[4]['id'], | |
401 | 'dstName' => 'Walt Disney Ltd', | |
402 | 'weight' => 20, | |
403 | 'canMerge' => TRUE, | |
404 | ), | |
405 | 1 => array( | |
406 | 'srcID' => $this->contacts[6]['id'], | |
407 | 'srcName' => 'Walt Disney', | |
408 | 'dstID' => $this->contacts[4]['id'], | |
409 | 'dstName' => 'Walt Disney Ltd', | |
410 | 'weight' => 10, | |
411 | 'canMerge' => TRUE, | |
412 | ), | |
413 | ), $pairs); | |
be61083d | 414 | |
415 | $this->callAPISuccess('GroupContact', 'create', array('group_id' => $groupID, 'contact_id' => $this->contacts[5]['id'])); | |
416 | CRM_Core_DAO::executeQuery("DELETE FROM civicrm_prevnext_cache"); | |
417 | $pairs = CRM_Dedupe_Merger::getDuplicatePairs( | |
418 | $ruleGroups['id'], | |
419 | $groupID, | |
420 | TRUE, | |
421 | 25, | |
422 | FALSE | |
423 | ); | |
424 | ||
425 | $this->assertEquals(array( | |
426 | 0 => array( | |
427 | 'srcID' => $this->contacts[5]['id'], | |
428 | 'srcName' => 'Walt Disney Ltd', | |
429 | 'dstID' => $this->contacts[4]['id'], | |
430 | 'dstName' => 'Walt Disney Ltd', | |
431 | 'weight' => 20, | |
432 | 'canMerge' => TRUE, | |
433 | ), | |
434 | 1 => array( | |
435 | 'srcID' => $this->contacts[6]['id'], | |
436 | 'srcName' => 'Walt Disney', | |
437 | 'dstID' => $this->contacts[4]['id'], | |
438 | 'dstName' => 'Walt Disney Ltd', | |
439 | 'weight' => 10, | |
440 | 'canMerge' => TRUE, | |
441 | ), | |
442 | 2 => array( | |
443 | 'srcID' => $this->contacts[6]['id'], | |
444 | 'srcName' => 'Walt Disney', | |
445 | 'dstID' => $this->contacts[5]['id'], | |
446 | 'dstName' => 'Walt Disney Ltd', | |
447 | 'weight' => 10, | |
448 | 'canMerge' => TRUE, | |
449 | ), | |
450 | ), $pairs); | |
bc0f3965 | 451 | } |
452 | ||
3308aac0 | 453 | /** |
454 | * Test function that gets duplicate pairs. | |
455 | * | |
456 | * It turns out there are 2 code paths retrieving this data so my initial focus is on ensuring | |
457 | * they match. | |
458 | */ | |
459 | public function testGetMatchesInGroup() { | |
460 | $this->setupMatchData(); | |
461 | ||
462 | $groupID = $this->groupCreate(array('title' => 'she-mice')); | |
463 | ||
464 | $this->callAPISuccess('GroupContact', 'create', array('group_id' => $groupID, 'contact_id' => $this->contacts[3]['id'])); | |
465 | ||
466 | $pairs = CRM_Dedupe_Merger::getDuplicatePairs( | |
467 | 1, | |
468 | $groupID, | |
469 | TRUE, | |
470 | 25, | |
471 | FALSE | |
472 | ); | |
473 | ||
474 | $this->assertEquals(array( | |
475 | 0 => array( | |
476 | 'srcID' => $this->contacts[3]['id'], | |
477 | 'srcName' => 'Mr. Minnie Mouse II', | |
478 | 'dstID' => $this->contacts[2]['id'], | |
479 | 'dstName' => 'Mr. Minnie Mouse II', | |
480 | 'weight' => 20, | |
481 | 'canMerge' => TRUE, | |
482 | ), | |
483 | ), $pairs); | |
484 | } | |
485 | ||
486 | /** | |
487 | * Set up some contacts for our matching. | |
488 | */ | |
2988f5c7 | 489 | public function setupMatchData() { |
490 | $fixtures = array( | |
491 | array( | |
492 | 'first_name' => 'Mickey', | |
493 | 'last_name' => 'Mouse', | |
494 | 'email' => 'mickey@mouse.com', | |
495 | ), | |
496 | array( | |
497 | 'first_name' => 'Mickey', | |
498 | 'last_name' => 'Mouse', | |
499 | 'email' => 'mickey@mouse.com', | |
500 | ), | |
501 | array( | |
502 | 'first_name' => 'Minnie', | |
503 | 'last_name' => 'Mouse', | |
504 | 'email' => 'mickey@mouse.com', | |
505 | ), | |
3308aac0 | 506 | array( |
507 | 'first_name' => 'Minnie', | |
508 | 'last_name' => 'Mouse', | |
509 | 'email' => 'mickey@mouse.com', | |
510 | ), | |
2988f5c7 | 511 | ); |
512 | foreach ($fixtures as $fixture) { | |
513 | $contactID = $this->individualCreate($fixture); | |
514 | $this->contacts[] = array_merge($fixture, array('id' => $contactID)); | |
bc0f3965 | 515 | } |
516 | $organizationFixtures = array( | |
517 | array( | |
518 | 'organization_name' => 'Walt Disney Ltd', | |
519 | 'email' => 'walt@disney.com', | |
520 | ), | |
521 | array( | |
522 | 'organization_name' => 'Walt Disney Ltd', | |
523 | 'email' => 'walt@disney.com', | |
524 | ), | |
525 | array( | |
526 | 'organization_name' => 'Walt Disney', | |
527 | 'email' => 'walt@disney.com', | |
528 | ), | |
529 | array( | |
530 | 'organization_name' => 'Walt Disney', | |
531 | 'email' => 'walter@disney.com', | |
532 | ), | |
533 | ); | |
534 | foreach ($organizationFixtures as $fixture) { | |
535 | $contactID = $this->organizationCreate($fixture); | |
536 | $this->contacts[] = array_merge($fixture, array('id' => $contactID)); | |
2988f5c7 | 537 | } |
538 | } | |
539 | ||
540 | ||
bf17fa88 | 541 | /** |
542 | * Get the list of tables that refer to the CID. | |
543 | * | |
544 | * This is a statically maintained (in this test list). | |
545 | * | |
546 | * There is also a check against an automated list but having both seems to add extra stability to me. They do | |
547 | * not change often. | |
548 | */ | |
549 | public function getStaticCIDRefs() { | |
550 | return array( | |
551 | 'civicrm_acl_cache' => array( | |
552 | 0 => 'contact_id', | |
553 | ), | |
554 | 'civicrm_acl_contact_cache' => array( | |
555 | 0 => 'user_id', | |
556 | 1 => 'contact_id', | |
557 | ), | |
558 | 'civicrm_action_log' => array( | |
559 | 0 => 'contact_id', | |
560 | ), | |
561 | 'civicrm_activity_contact' => array( | |
562 | 0 => 'contact_id', | |
563 | ), | |
564 | 'civicrm_address' => array( | |
565 | 0 => 'contact_id', | |
566 | ), | |
567 | 'civicrm_batch' => array( | |
568 | 0 => 'created_id', | |
569 | 1 => 'modified_id', | |
570 | ), | |
571 | 'civicrm_campaign' => array( | |
572 | 0 => 'created_id', | |
573 | 1 => 'last_modified_id', | |
574 | ), | |
575 | 'civicrm_case_contact' => array( | |
576 | 0 => 'contact_id', | |
577 | ), | |
578 | 'civicrm_contact' => array( | |
579 | 0 => 'primary_contact_id', | |
580 | 1 => 'employer_id', | |
581 | ), | |
582 | 'civicrm_contribution' => array( | |
583 | 0 => 'contact_id', | |
584 | ), | |
585 | 'civicrm_contribution_page' => array( | |
586 | 0 => 'created_id', | |
587 | ), | |
588 | 'civicrm_contribution_recur' => array( | |
589 | 0 => 'contact_id', | |
590 | ), | |
591 | 'civicrm_contribution_soft' => array( | |
592 | 0 => 'contact_id', | |
593 | ), | |
594 | 'civicrm_custom_group' => array( | |
595 | 0 => 'created_id', | |
596 | ), | |
597 | 'civicrm_dashboard_contact' => array( | |
598 | 0 => 'contact_id', | |
599 | ), | |
600 | 'civicrm_dedupe_exception' => array( | |
601 | 0 => 'contact_id1', | |
602 | 1 => 'contact_id2', | |
603 | ), | |
604 | 'civicrm_domain' => array( | |
605 | 0 => 'contact_id', | |
606 | ), | |
607 | 'civicrm_email' => array( | |
608 | 0 => 'contact_id', | |
609 | ), | |
610 | 'civicrm_event' => array( | |
611 | 0 => 'created_id', | |
612 | ), | |
613 | 'civicrm_event_carts' => array( | |
614 | 0 => 'user_id', | |
615 | ), | |
616 | 'civicrm_financial_account' => array( | |
617 | 0 => 'contact_id', | |
618 | ), | |
619 | 'civicrm_financial_item' => array( | |
620 | 0 => 'contact_id', | |
621 | ), | |
622 | 'civicrm_grant' => array( | |
623 | 0 => 'contact_id', | |
624 | ), | |
625 | 'civicrm_group' => array( | |
626 | 0 => 'created_id', | |
627 | 1 => 'modified_id', | |
628 | ), | |
629 | 'civicrm_group_contact' => array( | |
630 | 0 => 'contact_id', | |
631 | ), | |
632 | 'civicrm_group_contact_cache' => array( | |
633 | 0 => 'contact_id', | |
634 | ), | |
635 | 'civicrm_group_organization' => array( | |
636 | 0 => 'organization_id', | |
637 | ), | |
638 | 'civicrm_im' => array( | |
639 | 0 => 'contact_id', | |
640 | ), | |
641 | 'civicrm_log' => array( | |
642 | 0 => 'modified_id', | |
643 | ), | |
644 | 'civicrm_mailing' => array( | |
645 | 0 => 'created_id', | |
646 | 1 => 'scheduled_id', | |
647 | 2 => 'approver_id', | |
648 | ), | |
649 | 'civicrm_mailing_abtest' => array( | |
650 | 0 => 'created_id', | |
651 | ), | |
652 | 'civicrm_mailing_event_queue' => array( | |
653 | 0 => 'contact_id', | |
654 | ), | |
655 | 'civicrm_mailing_event_subscribe' => array( | |
656 | 0 => 'contact_id', | |
657 | ), | |
658 | 'civicrm_mailing_recipients' => array( | |
659 | 0 => 'contact_id', | |
660 | ), | |
661 | 'civicrm_membership' => array( | |
662 | 0 => 'contact_id', | |
663 | ), | |
664 | 'civicrm_membership_log' => array( | |
665 | 0 => 'modified_id', | |
666 | ), | |
667 | 'civicrm_membership_type' => array( | |
668 | 0 => 'member_of_contact_id', | |
669 | ), | |
670 | 'civicrm_note' => array( | |
671 | 0 => 'contact_id', | |
672 | ), | |
673 | 'civicrm_openid' => array( | |
674 | 0 => 'contact_id', | |
675 | ), | |
676 | 'civicrm_participant' => array( | |
677 | 0 => 'contact_id', | |
101d0fef | 678 | 1 => 'transferred_to_contact_id', //CRM-16761 |
bf17fa88 | 679 | ), |
680 | 'civicrm_payment_token' => array( | |
681 | 0 => 'contact_id', | |
682 | 1 => 'created_id', | |
683 | ), | |
684 | 'civicrm_pcp' => array( | |
685 | 0 => 'contact_id', | |
686 | ), | |
687 | 'civicrm_phone' => array( | |
688 | 0 => 'contact_id', | |
689 | ), | |
690 | 'civicrm_pledge' => array( | |
691 | 0 => 'contact_id', | |
692 | ), | |
693 | 'civicrm_print_label' => array( | |
694 | 0 => 'created_id', | |
695 | ), | |
696 | 'civicrm_relationship' => array( | |
697 | 0 => 'contact_id_a', | |
698 | 1 => 'contact_id_b', | |
699 | ), | |
700 | 'civicrm_report_instance' => array( | |
701 | 0 => 'created_id', | |
702 | 1 => 'owner_id', | |
703 | ), | |
704 | 'civicrm_setting' => array( | |
705 | 0 => 'contact_id', | |
706 | 1 => 'created_id', | |
707 | ), | |
708 | 'civicrm_subscription_history' => array( | |
709 | 0 => 'contact_id', | |
710 | ), | |
711 | 'civicrm_survey' => array( | |
712 | 0 => 'created_id', | |
713 | 1 => 'last_modified_id', | |
714 | ), | |
715 | 'civicrm_tag' => array( | |
716 | 0 => 'created_id', | |
717 | ), | |
718 | 'civicrm_uf_group' => array( | |
719 | 0 => 'created_id', | |
720 | ), | |
721 | 'civicrm_uf_match' => array( | |
722 | 0 => 'contact_id', | |
723 | ), | |
724 | 'civicrm_value_testgetcidref_1' => array( | |
725 | 0 => 'entity_id', | |
726 | ), | |
727 | 'civicrm_website' => array( | |
728 | 0 => 'contact_id', | |
729 | ), | |
730 | ); | |
731 | } | |
732 | ||
733 | /** | |
734 | * Get a list of CIDs that is calculated off the schema. | |
735 | * | |
736 | * Note this is an expensive and table locking query. Should be safe in tests though. | |
737 | */ | |
738 | public function getCalculatedCIDRefs() { | |
739 | $cidRefs = array(); | |
740 | $sql = " | |
741 | SELECT | |
742 | table_name, | |
743 | column_name | |
744 | FROM information_schema.key_column_usage | |
745 | WHERE | |
746 | referenced_table_schema = database() AND | |
747 | referenced_table_name = 'civicrm_contact' AND | |
748 | referenced_column_name = 'id'; | |
749 | "; | |
750 | $dao = CRM_Core_DAO::executeQuery($sql); | |
751 | while ($dao->fetch()) { | |
752 | $cidRefs[$dao->table_name][] = $dao->column_name; | |
753 | } | |
754 | // Do specific re-ordering changes to make this the same as the ref validated one. | |
755 | // The above query orders by FK alphabetically. | |
756 | // There might be cleverer ways to do this but it shouldn't change much. | |
757 | $cidRefs['civicrm_contact'][0] = 'primary_contact_id'; | |
758 | $cidRefs['civicrm_contact'][1] = 'employer_id'; | |
759 | $cidRefs['civicrm_acl_contact_cache'][0] = 'user_id'; | |
760 | $cidRefs['civicrm_acl_contact_cache'][1] = 'contact_id'; | |
761 | $cidRefs['civicrm_mailing'][0] = 'created_id'; | |
762 | $cidRefs['civicrm_mailing'][1] = 'scheduled_id'; | |
763 | $cidRefs['civicrm_mailing'][2] = 'approver_id'; | |
764 | return $cidRefs; | |
765 | } | |
766 | ||
0622d221 | 767 | } |