79ead6323dc9b6ba2c63eb124573e3a39ae604b2
[civicrm-core.git] / tests / phpunit / CRM / Upgrade / Incremental / php / FiveTwentyTest.php
1 <?php
2 require_once 'CiviTest/CiviCaseTestCase.php';
3
4 /**
5 * Class CRM_Upgrade_Incremental_php_FiveTwentyTest
6 * @group headless
7 */
8 class CRM_Upgrade_Incremental_php_FiveTwentyTest extends CiviCaseTestCase {
9
10 /**
11 * Test that the upgrade task changes the direction but only
12 * for bidirectional relationship types that are b_a.
13 */
14 public function testChangeCaseTypeAutoassignee() {
15
16 // We don't know what the ids are for the relationship types since it
17 // seems to depend what ran before us, so retrieve them first and go by
18 // name.
19 // Also spouse might not exist.
20
21 $result = $this->callAPISuccess('RelationshipType', 'get', ['limit' => 0])['values'];
22 // Get list of ids keyed on name.
23 $relationshipTypeNames = array_column($result, 'id', 'name_b_a');
24
25 // Create spouse if none.
26 if (!isset($relationshipTypeNames['Spouse of'])) {
27 $spouseId = $this->relationshipTypeCreate([
28 'name_a_b' => 'Spouse of',
29 'name_b_a' => 'Spouse of',
30 'label_a_b' => 'Spouse of',
31 'label_b_a' => 'Spouse of',
32 'contact_type_a' => 'Individual',
33 'contact_type_b' => 'Individual',
34 ]);
35 $relationshipTypeNames['Spouse of'] = $spouseId;
36 }
37 // Maybe unnecessary but why not. Slightly different than an undefined
38 // index later when it doesn't exist at all.
39 $this->assertGreaterThan(0, $relationshipTypeNames['Spouse of']);
40
41 /**
42 * Set up xml.
43 * In this sample case type for autoassignees we have:
44 * - a_b unidirectional: Case Coordinator is
45 * - b_a unidirectional: Benefits Specialist
46 * - Bidirectional the way it's stored in 5.16+: Spouse of
47 * - config entry pre-5.16, where it's a bidirectional relationship stored as b_a: Spouse of
48 *
49 * Also just for extra some non-ascii chars in here to show they
50 * don't get borked.
51 */
52 $newCaseTypeXml = <<<ENDXML
53 <?xml version="1.0" encoding="UTF-8"?>
54 <CaseType>
55 <name>test_type</name>
56 <ActivityTypes>
57 <ActivityType>
58 <name>Open Case</name>
59 <max_instances>1</max_instances>
60 </ActivityType>
61 <ActivityType>
62 <name>Email</name>
63 </ActivityType>
64 <ActivityType>
65 <name>Follow up</name>
66 </ActivityType>
67 <ActivityType>
68 <name>Meeting</name>
69 </ActivityType>
70 <ActivityType>
71 <name>Phone Call</name>
72 </ActivityType>
73 <ActivityType>
74 <name>давид</name>
75 </ActivityTypes>
76 <ActivitySets>
77 <ActivitySet>
78 <name>standard_timeline</name>
79 <label>Standard Timeline</label>
80 <timeline>true</timeline>
81 <ActivityTypes>
82 <ActivityType>
83 <name>Open Case</name>
84 <status>Completed</status>
85 <label>Open Case</label>
86 <default_assignee_type>1</default_assignee_type>
87 </ActivityType>
88 </ActivityTypes>
89 </ActivitySet>
90 <ActivitySet>
91 <name>timeline_1</name>
92 <label>AnotherTimeline</label>
93 <timeline>true</timeline>
94 <ActivityTypes>
95 <ActivityType>
96 <name>Follow up</name>
97 <label>Follow up</label>
98 <status>Scheduled</status>
99 <reference_activity>Open Case</reference_activity>
100 <reference_offset>7</reference_offset>
101 <reference_select>newest</reference_select>
102 <default_assignee_type>2</default_assignee_type>
103 <default_assignee_relationship>{$relationshipTypeNames['Senior Services Coordinator']}_b_a</default_assignee_relationship>
104 <default_assignee_contact></default_assignee_contact>
105 </ActivityType>
106 <ActivityType>
107 <name>Follow up</name>
108 <label>Follow up</label>
109 <status>Scheduled</status>
110 <reference_activity>Open Case</reference_activity>
111 <reference_offset>14</reference_offset>
112 <reference_select>newest</reference_select>
113 <default_assignee_type>2</default_assignee_type>
114 <default_assignee_relationship>{$relationshipTypeNames['Benefits Specialist']}_a_b</default_assignee_relationship>
115 <default_assignee_contact></default_assignee_contact>
116 </ActivityType>
117 <ActivityType>
118 <name>Follow up</name>
119 <label>Follow up</label>
120 <status>Scheduled</status>
121 <reference_activity>Open Case</reference_activity>
122 <reference_offset>21</reference_offset>
123 <reference_select>newest</reference_select>
124 <default_assignee_type>2</default_assignee_type>
125 <default_assignee_relationship>{$relationshipTypeNames['Spouse of']}_a_b</default_assignee_relationship>
126 <default_assignee_contact></default_assignee_contact>
127 </ActivityType>
128 <ActivityType>
129 <name>Follow up</name>
130 <label>Follow up</label>
131 <status>Scheduled</status>
132 <reference_activity>Open Case</reference_activity>
133 <reference_offset>28</reference_offset>
134 <reference_select>newest</reference_select>
135 <default_assignee_type>2</default_assignee_type>
136 <default_assignee_relationship>{$relationshipTypeNames['Spouse of']}_b_a</default_assignee_relationship>
137 <default_assignee_contact></default_assignee_contact>
138 </ActivityType>
139 </ActivityTypes>
140 </ActivitySet>
141 </ActivitySets>
142 <CaseRoles>
143 <RelationshipType>
144 <name>Senior Services Coordinator</name>
145 <creator>1</creator>
146 <manager>1</manager>
147 </RelationshipType>
148 <RelationshipType>
149 <name>Spouse of</name>
150 </RelationshipType>
151 <RelationshipType>
152 <name>Benefits Specialist is</name>
153 </RelationshipType>
154 </CaseRoles>
155 <RestrictActivityAsgmtToCmsUser>0</RestrictActivityAsgmtToCmsUser>
156 </CaseType>
157
158 ENDXML;
159
160 $dao = new CRM_Case_DAO_CaseType();
161 $dao->name = 'test_type';
162 $dao->title = 'Test Type';
163 $dao->is_active = 1;
164 $dao->definition = $newCaseTypeXml;
165 $dao->insert();
166
167 $caseTypeId = $dao->id;
168
169 // run the task
170 $upgrader = new CRM_Upgrade_Incremental_php_FiveTwenty();
171 $upgrader->changeCaseTypeAutoassignee();
172
173 // Check if the case type is what we expect. It should be identical except
174 // the b_a spouse one should get converted to the a_b direction.
175 $expectedCaseTypeXml = str_replace(
176 "<default_assignee_relationship>{$relationshipTypeNames['Spouse of']}_b_a",
177 "<default_assignee_relationship>{$relationshipTypeNames['Spouse of']}_a_b",
178 $newCaseTypeXml
179 );
180
181 //echo $expectedCaseTypeXml;
182
183 // Get the updated case type and check.
184 $dao = CRM_Core_DAO::executeQuery("SELECT definition FROM civicrm_case_type WHERE id = {$caseTypeId}");
185 $dao->fetch();
186
187 $this->assertEquals($expectedCaseTypeXml, $dao->definition);
188 }
189
190 /**
191 * Test that the upgrade task converts case role <name>'s that
192 * are labels to their name.
193 */
194 public function testConvertRoleLabelsToNames() {
195
196 // We don't know what the ids are for the relationship types since it
197 // seems to depend what ran before us, so retrieve them first and go by
198 // name.
199 // Also spouse might not exist.
200
201 $result = $this->callAPISuccess('RelationshipType', 'get', ['limit' => 0])['values'];
202 // Get list of ids keyed on name.
203 $relationshipTypeNames = array_column($result, 'id', 'name_b_a');
204
205 // Create spouse if none.
206 if (!isset($relationshipTypeNames['Spouse of'])) {
207 $spouseId = $this->relationshipTypeCreate([
208 'name_a_b' => 'Spouse of',
209 'name_b_a' => 'Spouse of',
210 'label_a_b' => 'Spouse of',
211 'label_b_a' => 'Spouse of',
212 'contact_type_a' => 'Individual',
213 'contact_type_b' => 'Individual',
214 ]);
215 $relationshipTypeNames['Spouse of'] = $spouseId;
216 }
217 // Maybe unnecessary but why not. Slightly different than an undefined
218 // index later when it doesn't exist at all.
219 $this->assertGreaterThan(0, $relationshipTypeNames['Spouse of']);
220
221 // Add one with changed labels
222 $id = $this->relationshipTypeCreate([
223 'name_a_b' => 'Wallet Inspector is',
224 'name_b_a' => 'Wallet Inspector',
225 'label_a_b' => 'has as Wallet Inspector',
226 'label_b_a' => 'is Wallet Inspector of',
227 'contact_type_a' => 'Individual',
228 'contact_type_b' => 'Individual',
229 ]);
230 $relationshipTypeNames['Wallet Inspector'] = $id;
231
232 // Add one with non-ascii characters.
233 $id = $this->relationshipTypeCreate([
234 'name_a_b' => 'абвгде is',
235 'name_b_a' => 'абвгде',
236 'label_a_b' => 'абвгде is',
237 'label_b_a' => 'абвгде',
238 'contact_type_a' => 'Individual',
239 'contact_type_b' => 'Individual',
240 ]);
241 $relationshipTypeNames['Ascii'] = $id;
242
243 // Add one with non-ascii characters changed labels.
244 $id = $this->relationshipTypeCreate([
245 'name_a_b' => 'αβγδ is',
246 'name_b_a' => 'αβγδ',
247 'label_a_b' => 'αβγδ is changed',
248 'label_b_a' => 'αβγδ changed',
249 'contact_type_a' => 'Individual',
250 'contact_type_b' => 'Individual',
251 ]);
252 $relationshipTypeNames['Ascii changed'] = $id;
253
254 // Create some case types
255 $caseTypes = $this->createCaseTypes($relationshipTypeNames, 1);
256
257 // run the task
258 $upgrader = new CRM_Upgrade_Incremental_php_FiveTwenty();
259 // first, preupgrade messages should be blank here
260 $preupgradeMessages = $upgrader->_changeCaseTypeLabelToName(TRUE);
261 $this->assertEmpty($preupgradeMessages);
262
263 // Now the actual run
264 $upgrader->changeCaseTypeLabelToName();
265
266 // Get the updated case types and check.
267 $sqlParams = [
268 1 => [implode(',', array_keys($caseTypes)), 'String'],
269 ];
270 $dao = CRM_Core_DAO::executeQuery("SELECT id, name, definition FROM civicrm_case_type WHERE id IN (%1)", $sqlParams);
271 while ($dao->fetch()) {
272 $this->assertEquals($caseTypes[$dao->id]['expected'], $dao->definition, "Case type {$dao->name}");
273 // clean up
274 CRM_Core_DAO::executeQuery("DELETE FROM civicrm_case_type WHERE id = {$dao->id}");
275 }
276
277 //
278 // Second pass, where we have some edge cases.
279 //
280
281 // Add a relationship type that has the same labels as another.
282 $id = $this->relationshipTypeCreate([
283 'name_a_b' => 'mixedupab',
284 'name_b_a' => 'mixedupba',
285 'label_a_b' => 'Benefits Specialist',
286 'label_b_a' => 'Benefits Specialist is',
287 'contact_type_a' => 'Individual',
288 'contact_type_b' => 'Individual',
289 ]);
290 $relationshipTypeNames['mixedup'] = $id;
291
292 // Add a relationship type that appears to be bidirectional but different
293 // names.
294 $id = $this->relationshipTypeCreate([
295 'name_a_b' => 'diffnameab',
296 'name_b_a' => 'diffnameba',
297 'label_a_b' => 'Archenemy of',
298 'label_b_a' => 'Archenemy of',
299 'contact_type_a' => 'Individual',
300 'contact_type_b' => 'Individual',
301 ]);
302 $relationshipTypeNames['diffname'] = $id;
303
304 // Second pass for case type creation.
305 $caseTypes = $this->createCaseTypes($relationshipTypeNames, 2);
306
307 // run the task
308 $upgrader = new CRM_Upgrade_Incremental_php_FiveTwenty();
309 // first, check preupgrade messages
310 $preupgradeMessages = $upgrader->_changeCaseTypeLabelToName(TRUE);
311 $this->assertEquals($this->getExpectedUpgradeMessages(), $preupgradeMessages);
312
313 // Now the actual run
314 $upgrader->changeCaseTypeLabelToName();
315
316 // Get the updated case types and check.
317 $sqlParams = [
318 1 => [implode(',', array_keys($caseTypes)), 'String'],
319 ];
320 $dao = CRM_Core_DAO::executeQuery("SELECT id, name, definition FROM civicrm_case_type WHERE id IN (%1)", $sqlParams);
321 while ($dao->fetch()) {
322 $this->assertEquals($caseTypes[$dao->id]['expected'], $dao->definition, "Case type {$dao->name}");
323 // clean up
324 CRM_Core_DAO::executeQuery("DELETE FROM civicrm_case_type WHERE id = {$dao->id}");
325 }
326 }
327
328 /**
329 * Set up some original and expected xml pairs.
330 *
331 * @param array $relationshipTypeNames
332 * @param int $stage
333 * We run it in a couple passes because we want to test with and without
334 * warning messages.
335 * @return array
336 */
337 private function createCaseTypes($relationshipTypeNames, $stage) {
338 $xmls = [];
339
340 switch ($stage) {
341 case 1:
342 $newCaseTypeXml = <<<ENDXMLSIMPLE
343 <?xml version="1.0" encoding="UTF-8"?>
344 <CaseType>
345 <name>simple</name>
346 <ActivityTypes>
347 <ActivityType>
348 <name>Open Case</name>
349 <max_instances>1</max_instances>
350 </ActivityType>
351 <ActivityType>
352 <name>Email</name>
353 </ActivityType>
354 <ActivityType>
355 <name>Follow up</name>
356 </ActivityType>
357 <ActivityType>
358 <name>Meeting</name>
359 </ActivityType>
360 <ActivityType>
361 <name>Phone Call</name>
362 </ActivityType>
363 </ActivityTypes>
364 <ActivitySets>
365 <ActivitySet>
366 <name>standard_timeline</name>
367 <label>Standard Timeline</label>
368 <timeline>true</timeline>
369 <ActivityTypes>
370 <ActivityType>
371 <name>Open Case</name>
372 <status>Completed</status>
373 <label>Open Case</label>
374 <default_assignee_type>1</default_assignee_type>
375 </ActivityType>
376 </ActivityTypes>
377 </ActivitySet>
378 <ActivitySet>
379 <name>timeline_1</name>
380 <label>AnotherTimeline</label>
381 <timeline>true</timeline>
382 <ActivityTypes>
383 <ActivityType>
384 <name>Follow up</name>
385 <label>Follow up</label>
386 <status>Scheduled</status>
387 <reference_activity>Open Case</reference_activity>
388 <reference_offset>7</reference_offset>
389 <reference_select>newest</reference_select>
390 <default_assignee_type>2</default_assignee_type>
391 <default_assignee_relationship>{$relationshipTypeNames['Senior Services Coordinator']}_b_a</default_assignee_relationship>
392 <default_assignee_contact></default_assignee_contact>
393 </ActivityType>
394 </ActivityTypes>
395 </ActivitySet>
396 </ActivitySets>
397 <CaseRoles>
398 <RelationshipType>
399 <name>Senior Services Coordinator</name>
400 <creator>1</creator>
401 <manager>1</manager>
402 </RelationshipType>
403 <RelationshipType>
404 <name>Spouse of</name>
405 </RelationshipType>
406 <RelationshipType>
407 <name>Benefits Specialist is</name>
408 </RelationshipType>
409 <RelationshipType>
410 <name>is Wallet Inspector of</name>
411 </RelationshipType>
412 <RelationshipType>
413 <name>has as Wallet Inspector</name>
414 </RelationshipType>
415 <RelationshipType>
416 <name>абвгде</name>
417 </RelationshipType>
418 <RelationshipType>
419 <name>αβγδ changed</name>
420 </RelationshipType>
421 </CaseRoles>
422 <RestrictActivityAsgmtToCmsUser>0</RestrictActivityAsgmtToCmsUser>
423 </CaseType>
424
425 ENDXMLSIMPLE;
426
427 $expectedCaseTypeXml = <<<ENDXMLSIMPLEEXPECTED
428 <?xml version="1.0" encoding="UTF-8"?>
429 <CaseType>
430 <name>simple</name>
431 <ActivityTypes>
432 <ActivityType>
433 <name>Open Case</name>
434 <max_instances>1</max_instances>
435 </ActivityType>
436 <ActivityType>
437 <name>Email</name>
438 </ActivityType>
439 <ActivityType>
440 <name>Follow up</name>
441 </ActivityType>
442 <ActivityType>
443 <name>Meeting</name>
444 </ActivityType>
445 <ActivityType>
446 <name>Phone Call</name>
447 </ActivityType>
448 </ActivityTypes>
449 <ActivitySets>
450 <ActivitySet>
451 <name>standard_timeline</name>
452 <label>Standard Timeline</label>
453 <timeline>true</timeline>
454 <ActivityTypes>
455 <ActivityType>
456 <name>Open Case</name>
457 <status>Completed</status>
458 <label>Open Case</label>
459 <default_assignee_type>1</default_assignee_type>
460 </ActivityType>
461 </ActivityTypes>
462 </ActivitySet>
463 <ActivitySet>
464 <name>timeline_1</name>
465 <label>AnotherTimeline</label>
466 <timeline>true</timeline>
467 <ActivityTypes>
468 <ActivityType>
469 <name>Follow up</name>
470 <label>Follow up</label>
471 <status>Scheduled</status>
472 <reference_activity>Open Case</reference_activity>
473 <reference_offset>7</reference_offset>
474 <reference_select>newest</reference_select>
475 <default_assignee_type>2</default_assignee_type>
476 <default_assignee_relationship>{$relationshipTypeNames['Senior Services Coordinator']}_b_a</default_assignee_relationship>
477 <default_assignee_contact></default_assignee_contact>
478 </ActivityType>
479 </ActivityTypes>
480 </ActivitySet>
481 </ActivitySets>
482 <CaseRoles>
483 <RelationshipType>
484 <name>Senior Services Coordinator</name>
485 <creator>1</creator>
486 <manager>1</manager>
487 </RelationshipType>
488 <RelationshipType>
489 <name>Spouse of</name>
490 </RelationshipType>
491 <RelationshipType>
492 <name>Benefits Specialist is</name>
493 </RelationshipType>
494 <RelationshipType>
495 <name>Wallet Inspector</name>
496 </RelationshipType>
497 <RelationshipType>
498 <name>Wallet Inspector is</name>
499 </RelationshipType>
500 <RelationshipType>
501 <name>абвгде</name>
502 </RelationshipType>
503 <RelationshipType>
504 <name>αβγδ</name>
505 </RelationshipType>
506 </CaseRoles>
507 <RestrictActivityAsgmtToCmsUser>0</RestrictActivityAsgmtToCmsUser>
508 </CaseType>
509
510 ENDXMLSIMPLEEXPECTED;
511
512 $caseTypeId = $this->addCaseType('simple', $newCaseTypeXml);
513 $xmls[$caseTypeId] = [
514 'id' => $caseTypeId,
515 'expected' => $expectedCaseTypeXml,
516 ];
517 break;
518
519 case 2:
520 // Note for these ones the roles that have warnings should remain
521 // unchanged if they choose to continue with the upgrade.
522
523 $newCaseTypeXml = <<<ENDXMLMIXEDUP
524 <?xml version="1.0" encoding="UTF-8"?>
525 <CaseType>
526 <name>mixedup</name>
527 <ActivityTypes>
528 <ActivityType>
529 <name>Open Case</name>
530 <max_instances>1</max_instances>
531 </ActivityType>
532 <ActivityType>
533 <name>Email</name>
534 </ActivityType>
535 <ActivityType>
536 <name>Follow up</name>
537 </ActivityType>
538 <ActivityType>
539 <name>Meeting</name>
540 </ActivityType>
541 <ActivityType>
542 <name>Phone Call</name>
543 </ActivityType>
544 </ActivityTypes>
545 <ActivitySets>
546 <ActivitySet>
547 <name>standard_timeline</name>
548 <label>Standard Timeline</label>
549 <timeline>true</timeline>
550 <ActivityTypes>
551 <ActivityType>
552 <name>Open Case</name>
553 <status>Completed</status>
554 <label>Open Case</label>
555 <default_assignee_type>1</default_assignee_type>
556 </ActivityType>
557 </ActivityTypes>
558 </ActivitySet>
559 <ActivitySet>
560 <name>timeline_1</name>
561 <label>AnotherTimeline</label>
562 <timeline>true</timeline>
563 <ActivityTypes>
564 <ActivityType>
565 <name>Follow up</name>
566 <label>Follow up</label>
567 <status>Scheduled</status>
568 <reference_activity>Open Case</reference_activity>
569 <reference_offset>7</reference_offset>
570 <reference_select>newest</reference_select>
571 <default_assignee_type>2</default_assignee_type>
572 <default_assignee_relationship>{$relationshipTypeNames['Senior Services Coordinator']}_b_a</default_assignee_relationship>
573 <default_assignee_contact></default_assignee_contact>
574 </ActivityType>
575 </ActivityTypes>
576 </ActivitySet>
577 </ActivitySets>
578 <CaseRoles>
579 <RelationshipType>
580 <name>Senior Services Coordinator</name>
581 <creator>1</creator>
582 <manager>1</manager>
583 </RelationshipType>
584 <RelationshipType>
585 <name>Spouse of</name>
586 </RelationshipType>
587 <RelationshipType>
588 <name>Benefits Specialist is</name>
589 </RelationshipType>
590 <RelationshipType>
591 <name>is Wallet Inspector of</name>
592 </RelationshipType>
593 <RelationshipType>
594 <name>has as Wallet Inspector</name>
595 </RelationshipType>
596 <RelationshipType>
597 <name>абвгде</name>
598 </RelationshipType>
599 <RelationshipType>
600 <name>αβγδ changed</name>
601 </RelationshipType>
602 <RelationshipType>
603 <name>Benefits Specialist</name>
604 </RelationshipType>
605 <RelationshipType>
606 <name>Mythical Unicorn</name>
607 </RelationshipType>
608 </CaseRoles>
609 <RestrictActivityAsgmtToCmsUser>0</RestrictActivityAsgmtToCmsUser>
610 </CaseType>
611
612 ENDXMLMIXEDUP;
613
614 $expectedCaseTypeXml = <<<ENDXMLMIXEDUPEXPECTED
615 <?xml version="1.0" encoding="UTF-8"?>
616 <CaseType>
617 <name>mixedup</name>
618 <ActivityTypes>
619 <ActivityType>
620 <name>Open Case</name>
621 <max_instances>1</max_instances>
622 </ActivityType>
623 <ActivityType>
624 <name>Email</name>
625 </ActivityType>
626 <ActivityType>
627 <name>Follow up</name>
628 </ActivityType>
629 <ActivityType>
630 <name>Meeting</name>
631 </ActivityType>
632 <ActivityType>
633 <name>Phone Call</name>
634 </ActivityType>
635 </ActivityTypes>
636 <ActivitySets>
637 <ActivitySet>
638 <name>standard_timeline</name>
639 <label>Standard Timeline</label>
640 <timeline>true</timeline>
641 <ActivityTypes>
642 <ActivityType>
643 <name>Open Case</name>
644 <status>Completed</status>
645 <label>Open Case</label>
646 <default_assignee_type>1</default_assignee_type>
647 </ActivityType>
648 </ActivityTypes>
649 </ActivitySet>
650 <ActivitySet>
651 <name>timeline_1</name>
652 <label>AnotherTimeline</label>
653 <timeline>true</timeline>
654 <ActivityTypes>
655 <ActivityType>
656 <name>Follow up</name>
657 <label>Follow up</label>
658 <status>Scheduled</status>
659 <reference_activity>Open Case</reference_activity>
660 <reference_offset>7</reference_offset>
661 <reference_select>newest</reference_select>
662 <default_assignee_type>2</default_assignee_type>
663 <default_assignee_relationship>{$relationshipTypeNames['Senior Services Coordinator']}_b_a</default_assignee_relationship>
664 <default_assignee_contact></default_assignee_contact>
665 </ActivityType>
666 </ActivityTypes>
667 </ActivitySet>
668 </ActivitySets>
669 <CaseRoles>
670 <RelationshipType>
671 <name>Senior Services Coordinator</name>
672 <creator>1</creator>
673 <manager>1</manager>
674 </RelationshipType>
675 <RelationshipType>
676 <name>Spouse of</name>
677 </RelationshipType>
678 <RelationshipType>
679 <name>Benefits Specialist is</name>
680 </RelationshipType>
681 <RelationshipType>
682 <name>Wallet Inspector</name>
683 </RelationshipType>
684 <RelationshipType>
685 <name>Wallet Inspector is</name>
686 </RelationshipType>
687 <RelationshipType>
688 <name>абвгде</name>
689 </RelationshipType>
690 <RelationshipType>
691 <name>αβγδ</name>
692 </RelationshipType>
693 <RelationshipType>
694 <name>Benefits Specialist</name>
695 </RelationshipType>
696 <RelationshipType>
697 <name>Mythical Unicorn</name>
698 </RelationshipType>
699 </CaseRoles>
700 <RestrictActivityAsgmtToCmsUser>0</RestrictActivityAsgmtToCmsUser>
701 </CaseType>
702
703 ENDXMLMIXEDUPEXPECTED;
704
705 $caseTypeId = $this->addCaseType('mixedup', $newCaseTypeXml);
706 $xmls[$caseTypeId] = [
707 'id' => $caseTypeId,
708 'expected' => $expectedCaseTypeXml,
709 ];
710
711 $newCaseTypeXml = <<<ENDXMLDIFFNAME
712 <?xml version="1.0" encoding="UTF-8"?>
713 <CaseType>
714 <name>diffname</name>
715 <ActivityTypes>
716 <ActivityType>
717 <name>Open Case</name>
718 <max_instances>1</max_instances>
719 </ActivityType>
720 <ActivityType>
721 <name>Email</name>
722 </ActivityType>
723 <ActivityType>
724 <name>Follow up</name>
725 </ActivityType>
726 <ActivityType>
727 <name>Meeting</name>
728 </ActivityType>
729 <ActivityType>
730 <name>Phone Call</name>
731 </ActivityType>
732 </ActivityTypes>
733 <ActivitySets>
734 <ActivitySet>
735 <name>standard_timeline</name>
736 <label>Standard Timeline</label>
737 <timeline>true</timeline>
738 <ActivityTypes>
739 <ActivityType>
740 <name>Open Case</name>
741 <status>Completed</status>
742 <label>Open Case</label>
743 <default_assignee_type>1</default_assignee_type>
744 </ActivityType>
745 </ActivityTypes>
746 </ActivitySet>
747 <ActivitySet>
748 <name>timeline_1</name>
749 <label>AnotherTimeline</label>
750 <timeline>true</timeline>
751 <ActivityTypes>
752 <ActivityType>
753 <name>Follow up</name>
754 <label>Follow up</label>
755 <status>Scheduled</status>
756 <reference_activity>Open Case</reference_activity>
757 <reference_offset>7</reference_offset>
758 <reference_select>newest</reference_select>
759 <default_assignee_type>2</default_assignee_type>
760 <default_assignee_relationship>{$relationshipTypeNames['Senior Services Coordinator']}_b_a</default_assignee_relationship>
761 <default_assignee_contact></default_assignee_contact>
762 </ActivityType>
763 </ActivityTypes>
764 </ActivitySet>
765 </ActivitySets>
766 <CaseRoles>
767 <RelationshipType>
768 <name>Senior Services Coordinator</name>
769 <creator>1</creator>
770 <manager>1</manager>
771 </RelationshipType>
772 <RelationshipType>
773 <name>Spouse of</name>
774 </RelationshipType>
775 <RelationshipType>
776 <name>Benefits Specialist is</name>
777 </RelationshipType>
778 <RelationshipType>
779 <name>is Wallet Inspector of</name>
780 </RelationshipType>
781 <RelationshipType>
782 <name>has as Wallet Inspector</name>
783 </RelationshipType>
784 <RelationshipType>
785 <name>абвгде</name>
786 </RelationshipType>
787 <RelationshipType>
788 <name>αβγδ changed</name>
789 </RelationshipType>
790 <RelationshipType>
791 <name>Archenemy of</name>
792 </RelationshipType>
793 </CaseRoles>
794 <RestrictActivityAsgmtToCmsUser>0</RestrictActivityAsgmtToCmsUser>
795 </CaseType>
796
797 ENDXMLDIFFNAME;
798
799 $expectedCaseTypeXml = <<<ENDXMLDIFFNAMEEXPECTED
800 <?xml version="1.0" encoding="UTF-8"?>
801 <CaseType>
802 <name>diffname</name>
803 <ActivityTypes>
804 <ActivityType>
805 <name>Open Case</name>
806 <max_instances>1</max_instances>
807 </ActivityType>
808 <ActivityType>
809 <name>Email</name>
810 </ActivityType>
811 <ActivityType>
812 <name>Follow up</name>
813 </ActivityType>
814 <ActivityType>
815 <name>Meeting</name>
816 </ActivityType>
817 <ActivityType>
818 <name>Phone Call</name>
819 </ActivityType>
820 </ActivityTypes>
821 <ActivitySets>
822 <ActivitySet>
823 <name>standard_timeline</name>
824 <label>Standard Timeline</label>
825 <timeline>true</timeline>
826 <ActivityTypes>
827 <ActivityType>
828 <name>Open Case</name>
829 <status>Completed</status>
830 <label>Open Case</label>
831 <default_assignee_type>1</default_assignee_type>
832 </ActivityType>
833 </ActivityTypes>
834 </ActivitySet>
835 <ActivitySet>
836 <name>timeline_1</name>
837 <label>AnotherTimeline</label>
838 <timeline>true</timeline>
839 <ActivityTypes>
840 <ActivityType>
841 <name>Follow up</name>
842 <label>Follow up</label>
843 <status>Scheduled</status>
844 <reference_activity>Open Case</reference_activity>
845 <reference_offset>7</reference_offset>
846 <reference_select>newest</reference_select>
847 <default_assignee_type>2</default_assignee_type>
848 <default_assignee_relationship>{$relationshipTypeNames['Senior Services Coordinator']}_b_a</default_assignee_relationship>
849 <default_assignee_contact></default_assignee_contact>
850 </ActivityType>
851 </ActivityTypes>
852 </ActivitySet>
853 </ActivitySets>
854 <CaseRoles>
855 <RelationshipType>
856 <name>Senior Services Coordinator</name>
857 <creator>1</creator>
858 <manager>1</manager>
859 </RelationshipType>
860 <RelationshipType>
861 <name>Spouse of</name>
862 </RelationshipType>
863 <RelationshipType>
864 <name>Benefits Specialist is</name>
865 </RelationshipType>
866 <RelationshipType>
867 <name>Wallet Inspector</name>
868 </RelationshipType>
869 <RelationshipType>
870 <name>Wallet Inspector is</name>
871 </RelationshipType>
872 <RelationshipType>
873 <name>абвгде</name>
874 </RelationshipType>
875 <RelationshipType>
876 <name>αβγδ</name>
877 </RelationshipType>
878 <RelationshipType>
879 <name>Archenemy of</name>
880 </RelationshipType>
881 </CaseRoles>
882 <RestrictActivityAsgmtToCmsUser>0</RestrictActivityAsgmtToCmsUser>
883 </CaseType>
884
885 ENDXMLDIFFNAMEEXPECTED;
886
887 $caseTypeId = $this->addCaseType('diffname', $newCaseTypeXml);
888 $xmls[$caseTypeId] = [
889 'id' => $caseTypeId,
890 'expected' => $expectedCaseTypeXml,
891 ];
892
893 break;
894
895 default:
896 break;
897 }
898
899 return $xmls;
900 }
901
902 /**
903 * @return array
904 */
905 private function getExpectedUpgradeMessages() {
906 return [
907 "Case Type 'mixedup', role 'Benefits Specialist is' has an ambiguous configuration where the role matches multiple labels and so can't be automatically updated. See the administration console status messages for more info.",
908
909 "Case Type 'mixedup', role 'Benefits Specialist' has an ambiguous configuration where the role matches multiple labels and so can't be automatically updated. See the administration console status messages for more info.",
910
911 "Case Type 'mixedup', role 'Mythical Unicorn' doesn't seem to be a valid role. See the administration console status messages for more info.",
912
913 "Case Type 'diffname', role 'Benefits Specialist is' has an ambiguous configuration where the role matches multiple labels and so can't be automatically updated. See the administration console status messages for more info.",
914
915 "Case Type 'diffname', role 'Archenemy of' has an ambiguous configuration and can't be automatically updated. See the administration console status messages for more info.",
916 ];
917 }
918
919 /**
920 * Helper to add a case type to the database.
921 *
922 * @param $name string
923 * @param $xml string
924 *
925 * @return int
926 */
927 private function addCaseType($name, $xml) {
928 $dao = new CRM_Case_DAO_CaseType();
929 $dao->name = $name;
930 $dao->title = $name;
931 $dao->is_active = 1;
932 $dao->definition = $xml;
933 $dao->insert();
934
935 return $dao->id;
936 }
937
938 }