4 * Class CRM_Dedupe_DedupeFinderTest
7 class CRM_Dedupe_DedupeFinderTest
extends CiviUnitTestCase
{
10 * IDs of created contacts.
14 protected $contactIDs = array();
17 * ID of the group holding the contacts.
24 * Clean up after the test.
26 public function tearDown() {
28 foreach ($this->contactIDs
as $contactId) {
29 $this->contactDelete($contactId);
32 $this->callAPISuccess('group', 'delete', array('id' => $this->groupID
));
38 * Test the unsupervised dedupe rule against a group.
42 public function testUnsupervisedDupes() {
43 // make dupe checks based on based on following contact sets:
44 // FIRST - LAST - EMAIL
45 // ---------------------------------
46 // robin - hood - robin@example.com
47 // robin - hood - hood@example.com
48 // robin - dale - robin@example.com
49 // little - dale - dale@example.com
50 // will - dale - dale@example.com
51 // will - dale - will@example.com
52 // will - dale - will@example.com
53 $this->setupForGroupDedupe();
55 $ruleGroup = $this->callAPISuccessGetSingle('RuleGroup', array('is_reserved' => 1, 'contact_type' => 'Individual', 'used' => 'Unsupervised'));
57 $foundDupes = CRM_Dedupe_Finder
::dupesInGroup($ruleGroup['id'], $this->groupID
);
58 $this->assertEquals(count($foundDupes), 3, 'Check Individual-Fuzzy dupe rule for dupesInGroup().');
61 public function testCustomRule() {
62 $this->setupForGroupDedupe();
64 $ruleGroup = $this->callAPISuccess('RuleGroup', 'create', array(
65 'contact_type' => 'Individual',
69 'title' => 'TestRule',
72 foreach (array('first_name', 'last_name') as $field) {
73 $ruleDao = new CRM_Dedupe_DAO_Rule();
74 $ruleDao->dedupe_rule_group_id
= $ruleGroup['id'];
75 $ruleDao->rule_table
= 'civicrm_contact';
76 $ruleDao->rule_field
= $field;
77 $ruleDao->rule_length
= NULL;
78 $ruleDao->rule_weight
= 4;
82 $foundDupes = CRM_Dedupe_Finder
::dupesInGroup($ruleGroup['id'], $this->groupID
);
83 $this->assertEquals(count($foundDupes), 4);
87 * Test the supervised dedupe rule against a group.
91 public function testSupervisedDupes() {
92 $this->setupForGroupDedupe();
93 $ruleGroup = $this->callAPISuccessGetSingle('RuleGroup', array('is_reserved' => 1, 'contact_type' => 'Individual', 'used' => 'Supervised'));
94 $foundDupes = CRM_Dedupe_Finder
::dupesInGroup($ruleGroup['id'], $this->groupID
);
95 // -------------------------------------------------------------------------
96 // default dedupe rule: threshold = 20 => (First + Last + Email) Matches ( 1 pair )
97 // --------------------------------------------------------------------------
98 // will - dale - will@example.com
99 // will - dale - will@example.com
100 // so 1 pair for - first + last + mail
101 $this->assertEquals(count($foundDupes), 1, 'Check Individual-Fuzzy dupe rule for dupesInGroup().');
105 * Test dupesByParams function.
107 public function testDupesByParams() {
108 // make dupe checks based on based on following contact sets:
109 // FIRST - LAST - EMAIL
110 // ---------------------------------
111 // robin - hood - robin@example.com
112 // robin - hood - hood@example.com
113 // robin - dale - robin@example.com
114 // little - dale - dale@example.com
115 // will - dale - dale@example.com
116 // will - dale - will@example.com
117 // will - dale - will@example.com
120 // FIXME: move create params to separate function
123 'first_name' => 'robin',
124 'last_name' => 'hood',
125 'email' => 'robin@example.com',
126 'contact_type' => 'Individual',
129 'first_name' => 'robin',
130 'last_name' => 'hood',
131 'email' => 'hood@example.com',
132 'contact_type' => 'Individual',
135 'first_name' => 'robin',
136 'last_name' => 'dale',
137 'email' => 'robin@example.com',
138 'contact_type' => 'Individual',
141 'first_name' => 'little',
142 'last_name' => 'dale',
143 'email' => 'dale@example.com',
144 'contact_type' => 'Individual',
147 'first_name' => 'will',
148 'last_name' => 'dale',
149 'email' => 'dale@example.com',
150 'contact_type' => 'Individual',
153 'first_name' => 'will',
154 'last_name' => 'dale',
155 'email' => 'will@example.com',
156 'contact_type' => 'Individual',
159 'first_name' => 'will',
160 'last_name' => 'dale',
161 'email' => 'will@example.com',
162 'contact_type' => 'Individual',
168 foreach ($params as $param) {
169 $contact = $this->callAPISuccess('contact', 'create', $param);
171 'contact_id' => $contact['id'],
172 'street_address' => 'Ambachtstraat 23',
173 'location_type_id' => 1,
175 $this->callAPISuccess('address', 'create', $params);
176 $contactIds[$count++
] = $contact['id'];
179 // verify that all contacts have been created separately
180 $this->assertEquals(count($contactIds), 7, 'Check for number of contacts.');
182 $dao = new CRM_Dedupe_DAO_RuleGroup();
183 $dao->contact_type
= 'Individual';
184 $dao->used
= 'General';
185 $dao->is_default
= 1;
189 'first_name' => 'robin',
190 'last_name' => 'hood',
191 'email' => 'hood@example.com',
192 'street_address' => 'Ambachtstraat 23',
194 CRM_Core_TemporaryErrorScope
::useException();
195 $ids = CRM_Contact_BAO_Contact
::getDuplicateContacts($fields, 'Individual', 'General');
197 // Check with default Individual-General rule
198 $this->assertEquals(count($ids), 2, 'Check Individual-General rule for dupesByParams().');
200 // delete all created contacts
201 foreach ($contactIds as $contactId) {
202 $this->contactDelete($contactId);
207 * Set up a group of dedupable contacts.
209 protected function setupForGroupDedupe() {
211 'name' => 'Dupe Group',
212 'title' => 'New Test Dupe Group',
215 'visibility' => 'Public Pages',
218 $result = $this->callAPISuccess('group', 'create', $params);
219 $this->groupID
= $result['id'];
223 'first_name' => 'robin',
224 'last_name' => 'hood',
225 'email' => 'robin@example.com',
226 'contact_type' => 'Individual',
229 'first_name' => 'robin',
230 'last_name' => 'hood',
231 'email' => 'hood@example.com',
232 'contact_type' => 'Individual',
235 'first_name' => 'robin',
236 'last_name' => 'dale',
237 'email' => 'robin@example.com',
238 'contact_type' => 'Individual',
241 'first_name' => 'little',
242 'last_name' => 'dale',
243 'email' => 'dale@example.com',
244 'contact_type' => 'Individual',
247 'first_name' => 'will',
248 'last_name' => 'dale',
249 'email' => 'dale@example.com',
250 'contact_type' => 'Individual',
253 'first_name' => 'will',
254 'last_name' => 'dale',
255 'email' => 'will@example.com',
256 'contact_type' => 'Individual',
259 'first_name' => 'will',
260 'last_name' => 'dale',
261 'email' => 'will@example.com',
262 'contact_type' => 'Individual',
267 foreach ($params as $param) {
268 $contact = $this->callAPISuccess('contact', 'create', $param);
269 $this->contactIDs
[$count++
] = $contact['id'];
272 'contact_id' => $contact['id'],
273 'group_id' => $this->groupID
,
275 $this->callAPISuccess('group_contact', 'create', $grpParams);
278 // verify that all contacts have been created separately
279 $this->assertEquals(count($this->contactIDs
), 7, 'Check for number of contacts.');