Merge pull request #18714 from MegaphoneJon/financial-111
[civicrm-core.git] / tests / karma / unit / crmCaseTypeSpec.js
CommitLineData
384f015c 1/* global $, _, CRM:true */
416abe87
PH
2'use strict';
3
4describe('crmCaseType', function() {
b109dd8b
RO
5 var $controller;
6 var $compile;
7 var $httpBackend;
c9817fac 8 var $q;
b109dd8b 9 var $rootScope;
d7a470db 10 var $timeout;
b109dd8b
RO
11 var apiCalls;
12 var ctrl;
13 var compile;
ad8d1ce3 14 var defaultAssigneeDefaultValue;
b109dd8b 15 var scope;
416abe87
PH
16
17 beforeEach(function() {
18 CRM.resourceUrls = {
19 'civicrm': ''
20 };
416abe87 21 module('crmCaseType');
09a09949
PH
22 module('crmJsonComparator');
23 inject(function(crmJsonComparator) {
24 crmJsonComparator.register(jasmine);
416abe87
PH
25 });
26 });
27
d7a470db 28 beforeEach(inject(function(_$controller_, _$compile_, _$httpBackend_, _$q_, _$rootScope_, _$timeout_) {
b109dd8b
RO
29 $controller = _$controller_;
30 $compile = _$compile_;
31 $httpBackend = _$httpBackend_;
c9817fac 32 $q = _$q_;
b109dd8b 33 $rootScope = _$rootScope_;
6fc8ca2c 34 $rootScope.ts = CRM.ts(null);
d7a470db 35 $timeout = _$timeout_;
b109dd8b 36 }));
416abe87 37
b109dd8b
RO
38 describe('CaseTypeCtrl', function() {
39 beforeEach(function () {
416abe87 40 apiCalls = {
4324b8d7
CW
41 actStatuses: {
42 values: [
43 {
416abe87
PH
44 "id": "272",
45 "option_group_id": "25",
46 "label": "Scheduled",
47 "value": "1",
48 "name": "Scheduled",
49 "filter": "0",
50 "is_default": "1",
51 "weight": "1",
52 "is_optgroup": "0",
53 "is_reserved": "1",
54 "is_active": "1"
55 },
4324b8d7 56 {
416abe87
PH
57 "id": "273",
58 "option_group_id": "25",
59 "label": "Completed",
60 "value": "2",
61 "name": "Completed",
62 "filter": "0",
63 "weight": "2",
64 "is_optgroup": "0",
65 "is_reserved": "1",
66 "is_active": "1"
67 }
4324b8d7 68 ]
416abe87 69 },
4324b8d7
CW
70 caseStatuses: {
71 values: [
72 {
73 "id": "290",
74 "option_group_id": "28",
75 "label": "Ongoing",
76 "value": "1",
77 "name": "Open",
78 "grouping": "Opened",
79 "filter": "0",
80 "is_default": "1",
81 "weight": "1",
82 "is_optgroup": "0",
83 "is_reserved": "1",
84 "is_active": "1"
85 },
86 {
87 "id": "291",
88 "option_group_id": "28",
89 "label": "Resolved",
90 "value": "2",
91 "name": "Closed",
92 "grouping": "Closed",
93 "filter": "0",
94 "weight": "2",
95 "is_optgroup": "0",
96 "is_reserved": "1",
97 "is_active": "1"
98 }
99 ]
100 },
101 actTypes: {
102 values: [
103 {
416abe87
PH
104 "id": "784",
105 "option_group_id": "2",
106 "label": "ADC referral",
c866eb5f 107 "value": "62",
416abe87
PH
108 "name": "ADC referral",
109 "filter": "0",
110 "is_default": "0",
111 "weight": "64",
112 "is_optgroup": "0",
113 "is_reserved": "0",
114 "is_active": "1",
115 "component_id": "7"
116 },
4324b8d7 117 {
416abe87
PH
118 "id": "32",
119 "option_group_id": "2",
120 "label": "Add Client To Case",
121 "value": "27",
122 "name": "Add Client To Case",
123 "filter": "0",
124 "is_default": "0",
125 "weight": "26",
126 "description": "",
127 "is_optgroup": "0",
128 "is_reserved": "1",
129 "is_active": "1",
130 "component_id": "7"
ba1ac52d
AH
131 },
132 {
133 "id": "18",
134 "option_group_id": "2",
135 "label": "Open Case",
136 "value": "13",
137 "name": "Open Case",
138 "filter": "0",
139 "is_default": "0",
140 "weight": "13",
141 "is_optgroup": "0",
142 "is_reserved": "1",
143 "is_active": "1",
144 "component_id": "7",
145 "icon": "fa-folder-open-o"
146 },
147 {
148 "id": "857",
149 "option_group_id": "2",
150 "label": "Medical evaluation",
151 "value": "55",
152 "name": "Medical evaluation",
153 "filter": "0",
154 "is_default": "0",
155 "weight": "56",
156 "is_optgroup": "0",
157 "is_reserved": "0",
158 "is_active": "1",
159 "component_id": "7"
160 },
4324b8d7 161 ]
416abe87 162 },
4324b8d7
CW
163 relTypes: {
164 values: [
165 {
416abe87
PH
166 "id": "14",
167 "name_a_b": "Benefits Specialist is",
168 "label_a_b": "Benefits Specialist is",
169 "name_b_a": "Benefits Specialist",
170 "label_b_a": "Benefits Specialist",
171 "description": "Benefits Specialist",
172 "contact_type_a": "Individual",
173 "contact_type_b": "Individual",
174 "is_reserved": "0",
175 "is_active": "1"
176 },
4324b8d7 177 {
416abe87
PH
178 "id": "9",
179 "name_a_b": "Case Coordinator is",
180 "label_a_b": "Case Coordinator is",
181 "name_b_a": "Case Coordinator",
182 "label_b_a": "Case Coordinator",
183 "description": "Case Coordinator",
184 "contact_type_a": "Individual",
185 "contact_type_b": "Individual",
186 "is_reserved": "0",
187 "is_active": "1"
68098e7b 188 },
f570a709
D
189 {
190 "id": "10",
191 "name_a_b": "Homeless Services Coordinator is",
192 "label_a_b": "Homeless Services Coordinator is",
193 "name_b_a": "Homeless Services Coordinator",
194 "label_b_a": "Homeless Services Coordinator",
195 "description": "Homeless Services Coordinator",
196 "contact_type_a": "Individual",
197 "contact_type_b": "Individual",
198 "is_reserved": "0",
199 "is_active": "1"
200 },
68098e7b
RO
201 {
202 "id": "2",
203 "name_a_b": "Spouse of",
204 "label_a_b": "Spouse of",
205 "name_b_a": "Spouse of",
206 "label_b_a": "Spouse of",
207 "description": "Spousal relationship.",
208 "contact_type_a": "Individual",
209 "contact_type_b": "Individual",
210 "is_reserved": "0",
211 "is_active": "1"
f570a709
D
212 },
213 // include one where name is different from label
214 {
215 "id": "27",
216 "name_a_b": "GA123ab",
217 "label_a_b": "Guardian Angel is",
218 "name_b_a": "GA123ba",
219 "label_b_a": "Guardian Angel for",
220 "description": "Guardian Angel.",
221 "contact_type_a": "Individual",
222 "contact_type_b": "Individual",
223 "is_reserved": "0",
224 "is_active": "1"
416abe87 225 }
4324b8d7 226 ]
416abe87 227 },
4324b8d7 228 caseType: {
416abe87
PH
229 "id": "1",
230 "name": "housing_support",
231 "title": "Housing Support",
232 "description": "Help homeless individuals obtain temporary and long-term housing",
233 "is_active": "1",
234 "is_reserved": "0",
235 "weight": "1",
236 "is_forkable": "1",
237 "is_forked": "",
238 "definition": {
239 "activityTypes": [
240 {"name": "Open Case", "max_instances": "1"}
241 ],
242 "activitySets": [
243 {
c866eb5f 244 "name": "standard_timeline",
416abe87
PH
245 "label": "Standard Timeline",
246 "timeline": "1",
247 "activityTypes": [
248 {
249 "name": "Open Case",
250 "status": "Completed"
251 },
252 {
253 "name": "Medical evaluation",
254 "reference_activity": "Open Case",
255 "reference_offset": "1",
256 "reference_select": "newest"
257 }
258 ]
259 }
260 ],
261 "caseRoles": [
262 {
263 "name": "Homeless Services Coordinator",
264 "creator": "1",
265 "manager": "1"
266 }
267 ]
268 }
ad8d1ce3
RO
269 },
270 defaultAssigneeTypes: {
271 values: [
272 {
273 "id": "1174",
274 "option_group_id": "152",
275 "label": "None",
276 "value": "1",
277 "name": "NONE",
278 "filter": "0",
279 "is_default": "1",
280 "weight": "1",
281 "is_optgroup": "0",
282 "is_reserved": "0",
283 "is_active": "1"
284 },
285 {
286 "id": "1175",
287 "option_group_id": "152",
288 "label": "By relationship to workflow client",
289 "value": "2",
290 "name": "BY_RELATIONSHIP",
291 "filter": "0",
292 "is_default": "0",
293 "weight": "2",
294 "is_optgroup": "0",
295 "is_reserved": "0",
296 "is_active": "1"
297 },
298 {
299 "id": "1176",
300 "option_group_id": "152",
301 "label": "Specific contact",
302 "value": "3",
303 "name": "SPECIFIC_CONTACT",
304 "filter": "0",
305 "is_default": "0",
306 "weight": "3",
307 "is_optgroup": "0",
308 "is_reserved": "0",
309 "is_active": "1"
310 },
311 {
312 "id": "1177",
313 "option_group_id": "152",
314 "label": "User creating the workflow",
315 "value": "4",
316 "name": "USER_CREATING_THE_CASE",
317 "filter": "0",
318 "is_default": "0",
319 "weight": "4",
320 "is_optgroup": "0",
321 "is_reserved": "0",
322 "is_active": "1"
323 }
324 ]
416abe87
PH
325 }
326 };
ad8d1ce3 327 defaultAssigneeDefaultValue = _.find(apiCalls.defaultAssigneeTypes.values, { is_default: '1' });
b109dd8b 328 scope = $rootScope.$new();
416abe87 329 ctrl = $controller('CaseTypeCtrl', {$scope: scope, apiCalls: apiCalls});
b109dd8b 330 });
416abe87
PH
331
332 it('should load activity statuses', function() {
4324b8d7 333 expect(scope.activityStatuses).toEqualData(apiCalls.actStatuses.values);
416abe87
PH
334 });
335
336 it('should load activity types', function() {
4324b8d7 337 expect(scope.activityTypes['ADC referral']).toEqualData(apiCalls.actTypes.values[0]);
416abe87
PH
338 });
339
ad8d1ce3
RO
340 it('should store the default assignee types', function() {
341 expect(scope.defaultAssigneeTypes).toBe(apiCalls.defaultAssigneeTypes.values);
342 });
343
344 it('should store the default assignee types values indexed by name', function() {
345 var defaultAssigneeTypeValues = _.chain(apiCalls.defaultAssigneeTypes.values)
346 .indexBy('name').mapValues('value').value();
347
348 expect(scope.defaultAssigneeTypeValues).toEqual(defaultAssigneeTypeValues);
349 });
350
2058bf54
D
351 it('should compute the relationship type options', function() {
352 var expectedRelationshipTypeOptions = [
353 {
354 "id": "14_a_b",
355 "text": "Benefits Specialist",
356 "xmlName": "Benefits Specialist is"
357 },
358 {
359 "id": "14_b_a",
360 "text": "Benefits Specialist is",
361 "xmlName": "Benefits Specialist"
362 },
363 {
364 "id": "9_a_b",
365 "text": "Case Coordinator",
366 "xmlName": "Case Coordinator is"
367 },
368 {
369 "id": "9_b_a",
370 "text": "Case Coordinator is",
371 "xmlName": "Case Coordinator"
372 },
373 {
374 "id": "10_a_b",
375 "text": "Homeless Services Coordinator",
376 "xmlName": "Homeless Services Coordinator is"
377 },
378 {
379 "id": "10_b_a",
380 "text": "Homeless Services Coordinator is",
381 "xmlName": "Homeless Services Coordinator"
382 },
383 // Bidirectional, so should only have the one direction in the list
384 {
385 "id": "2_a_b",
386 "text": "Spouse of",
387 "xmlName": "Spouse of"
388 },
389 // include one where name is different from label
390 {
391 "id": "27_a_b",
392 "text": "Guardian Angel for",
393 "xmlName": "GA123ab",
394 },
395 {
396 "id": "27_b_a",
397 "text": "Guardian Angel is",
398 "xmlName": "GA123ba",
68098e7b 399 }
2058bf54 400 ];
68098e7b 401
2058bf54 402 expect(scope.relationshipTypeOptions).toEqual(expectedRelationshipTypeOptions);
68098e7b
RO
403 });
404
416abe87
PH
405 it('addActivitySet should add an activitySet to the case type', function() {
406 scope.addActivitySet('timeline');
407 var activitySets = scope.caseType.definition.activitySets;
408 var newSet = activitySets[activitySets.length - 1];
409 expect(newSet.name).toBe('timeline_1');
410 expect(newSet.timeline).toBe('1');
411 expect(newSet.label).toBe('Timeline');
412 });
413
414 it('addActivitySet handles second timeline correctly', function() {
415 scope.addActivitySet('timeline');
416 scope.addActivitySet('timeline');
417 var activitySets = scope.caseType.definition.activitySets;
418 var newSet = activitySets[activitySets.length - 1];
419 expect(newSet.name).toBe('timeline_2');
420 expect(newSet.timeline).toBe('1');
421 expect(newSet.label).toBe('Timeline #2');
422 });
ad8d1ce3
RO
423
424 describe('when clearing the activity\'s default assignee type values', function() {
425 var activity;
426
427 beforeEach(function() {
428 activity = {
429 default_assignee_relationship: 1,
430 default_assignee_contact: 2
431 };
432
433 scope.clearActivityDefaultAssigneeValues(activity);
434 });
435
436 it('clears the default assignee relationship for the activity', function() {
437 expect(activity.default_assignee_relationship).toBe(null);
438 });
439
440 it('clears the default assignee contact for the activity', function() {
441 expect(activity.default_assignee_contact).toBe(null);
442 });
443 });
444
445 describe('when adding a new activity to a set', function() {
446 var activitySet;
447
448 beforeEach(function() {
449 activitySet = { activityTypes: [] };
450 scope.activityTypes = { comment: { label: 'Add a new comment' } };
451
452 scope.addActivity(activitySet, 'comment');
453 });
454
455 it('adds a new Comment activity to the set', function() {
456 expect(activitySet.activityTypes[0]).toEqual({
457 name: 'comment',
458 label: scope.activityTypes.comment.label,
459 status: 'Scheduled',
460 reference_activity: 'Open Case',
461 reference_offset: '1',
462 reference_select: 'newest',
463 default_assignee_type: defaultAssigneeDefaultValue.value
464 });
465 });
466 });
467
468 describe('when creating a new workflow', function() {
469 beforeEach(inject(function ($controller) {
470 apiCalls.caseType = null;
471
472 ctrl = $controller('CaseTypeCtrl', {$scope: scope, apiCalls: apiCalls});
473 }));
474
475 it('sets default values for the case type title, name, and active status', function() {
476 expect(scope.caseType).toEqual(jasmine.objectContaining({
477 title: '',
478 name: '',
479 is_active: '1'
480 }));
481 });
482
483 it('adds an Open Case activty to the default activty set', function() {
484 expect(scope.caseType.definition.activitySets[0].activityTypes).toEqual([{
485 name: 'Open Case',
486 label: 'Open Case',
487 status: 'Completed',
488 default_assignee_type: defaultAssigneeDefaultValue.value
489 }]);
490 });
491 });
f570a709
D
492
493 describe('when adding a role', function() {
494 beforeEach(inject(function ($controller) {
495 ctrl = $controller('CaseTypeCtrl', {$scope: scope, apiCalls: apiCalls});
496 }));
497
498 it('updates the case roles', function() {
499
500 // This line sort of simulates selecting a relationship type from the
501 // dropdown. It doesn't test that clicking picks the right value to
502 // add, just that if it did then the function that gets called does
503 // the right thing with it.
2058bf54
D
504 // Note the value returned by the dropdown is "backwards" to match
505 // historically what has been stored in the xml as name, e.g.
f570a709 506 // for the client perspective direction the dropdown returns the other
2058bf54
D
507 // direction.
508 // So 9_b_a is "Case Coordinator", which means that they actually
509 // selected "Case Coordinator is".
510 scope.addRole(scope.caseType.definition.caseRoles, '9_b_a');
f570a709
D
511
512 expect(scope.caseType.definition.caseRoles).toEqual(
513 [
514 {
515 name: 'Homeless Services Coordinator',
516 creator: '1',
517 manager: '1',
671a5fef 518 displayLabel: 'Homeless Services Coordinator is'
f570a709
D
519 },
520 {
521 name: 'Case Coordinator',
671a5fef 522 displayLabel: 'Case Coordinator is'
f570a709
D
523 }
524 ]
525 );
526 });
527
2058bf54
D
528 it('updates case roles when name and label are different', function() {
529 scope.addRole(scope.caseType.definition.caseRoles, '27_b_a');
530 expect(scope.caseType.definition.caseRoles).toEqual(
531 [
532 {
533 name: 'Homeless Services Coordinator',
534 creator: '1',
535 manager: '1',
536 displayLabel: 'Homeless Services Coordinator is'
537 },
538 {
539 name: 'GA123ba',
540 displayLabel: 'Guardian Angel is'
541 }
542 ]
543 );
544 });
545
f570a709
D
546 it('updates case roles if choose non-client-perspective direction', function() {
547 // again, the dropdown returns the opposite direction
2058bf54 548 scope.addRole(scope.caseType.definition.caseRoles, '10_a_b');
f570a709
D
549 expect(scope.caseType.definition.caseRoles).toEqual(
550 [
551 {
552 name: 'Homeless Services Coordinator',
553 creator: '1',
554 manager: '1',
671a5fef 555 displayLabel: 'Homeless Services Coordinator is'
f570a709
D
556 },
557 {
558 name: 'Homeless Services Coordinator is',
671a5fef 559 displayLabel: 'Homeless Services Coordinator'
f570a709
D
560 }
561 ]
562 );
563 });
564
2058bf54
D
565 it('updates case roles non-client-perspective direction name/label different', function() {
566 scope.addRole(scope.caseType.definition.caseRoles, '27_a_b');
567 expect(scope.caseType.definition.caseRoles).toEqual(
568 [
569 {
570 name: 'Homeless Services Coordinator',
571 creator: '1',
572 manager: '1',
573 displayLabel: 'Homeless Services Coordinator is'
574 },
575 {
576 name: 'GA123ab',
577 displayLabel: 'Guardian Angel for'
578 }
579 ]
580 );
581 });
582
f570a709
D
583 it("doesn't add the same role twice", function() {
584 // This is in the mock casetype to start, so check if can add twice.
2058bf54
D
585 scope.addRole(scope.caseType.definition.caseRoles, '10_b_a');
586 expect(scope.caseType.definition.caseRoles).toEqual(
587 [
588 {
589 name: 'Homeless Services Coordinator',
590 creator: '1',
591 manager: '1',
592 displayLabel: 'Homeless Services Coordinator is'
593 }
594 ]
595 );
596
597 // Try with name and label different. We already tested one time in
598 // another test so just go straight to twice.
599 scope.addRole(scope.caseType.definition.caseRoles, '27_b_a');
600 scope.addRole(scope.caseType.definition.caseRoles, '27_b_a');
f570a709
D
601 expect(scope.caseType.definition.caseRoles).toEqual(
602 [
603 {
604 name: 'Homeless Services Coordinator',
605 creator: '1',
606 manager: '1',
671a5fef 607 displayLabel: 'Homeless Services Coordinator is'
2058bf54
D
608 },
609 {
610 name: 'GA123ba',
611 displayLabel: 'Guardian Angel is'
f570a709
D
612 }
613 ]
614 );
615 });
616 });
38ddfacb
D
617
618 describe('when adding a role on-the-fly', function() {
619 beforeEach(inject(function ($controller) {
620 ctrl = $controller('CaseTypeCtrl', {$scope: scope, apiCalls: apiCalls});
621 }));
622
623 it('updates the case roles for unidirectional', function() {
624 // first simulate the ajax popup to create a new relationship type
625 var newType = {
626 "id": "33",
627 "name_a_b": "Some New Type is",
628 "label_a_b": "Some New Type is",
629 "name_b_a": "Some New Type for",
630 "label_b_a": "Some New Type for",
631 "description": "Some New Type",
632 "contact_type_a": "Individual",
633 "contact_type_b": "Individual",
634 "is_reserved": "0",
635 "is_active": "1"
636 };
38ddfacb
D
637
638 // now let the real code do what it does with the new type
639 scope.addRoleOnTheFly(scope.caseType.definition.caseRoles, newType);
640
641 expect(scope.caseType.definition.caseRoles).toEqual(
642 [
643 {
644 name: 'Homeless Services Coordinator',
645 creator: '1',
646 manager: '1',
671a5fef 647 displayLabel: 'Homeless Services Coordinator is'
38ddfacb
D
648 },
649 {
650 name: 'Some New Type for',
671a5fef 651 displayLabel: 'Some New Type is'
38ddfacb
D
652 }
653 ]
654 );
655
656 expect(scope.relationshipTypeOptions.slice(-2)).toEqual(
657 [
658 {
2058bf54
D
659 xmlName: 'Some New Type is',
660 id: '33_a_b',
38ddfacb
D
661 text: 'Some New Type for'
662 },
663 {
2058bf54
D
664 xmlName: 'Some New Type for',
665 id: '33_b_a',
38ddfacb
D
666 text: 'Some New Type is'
667 }
668 ]
669 );
670 });
671
672 it('updates the case roles for bidirectional', function() {
673 // first simulate the ajax popup to create a new relationship type
674 var newType = {
675 "id": "34",
676 "name_a_b": "Friend of",
677 "label_a_b": "Friend of",
678 "name_b_a": "Friend of",
679 "label_b_a": "Friend of",
680 "description": "Friend",
681 "contact_type_a": "Individual",
682 "contact_type_b": "Individual",
683 "is_reserved": "0",
684 "is_active": "1"
685 };
38ddfacb
D
686
687 // now let the real code do what it does with the new type
688 scope.addRoleOnTheFly(scope.caseType.definition.caseRoles, newType);
689
690 expect(scope.caseType.definition.caseRoles).toEqual(
691 [
692 {
693 name: 'Homeless Services Coordinator',
694 creator: '1',
695 manager: '1',
671a5fef 696 displayLabel: 'Homeless Services Coordinator is'
38ddfacb
D
697 },
698 {
699 name: 'Friend of',
671a5fef 700 displayLabel: 'Friend of'
38ddfacb
D
701 }
702 ]
703 );
704
705 expect(scope.relationshipTypeOptions.slice(-1)).toEqual(
706 [
707 {
2058bf54
D
708 xmlName: 'Friend of',
709 id: '34_a_b',
38ddfacb
D
710 text: 'Friend of'
711 }
712 ]
713 );
714
715 // Check that it did NOT add two entries for this bidirectional type
716 expect(scope.relationshipTypeOptions.slice(-2,-1)).not.toEqual(
717 [
718 {
2058bf54
D
719 xmlName: 'Friend of',
720 id: '34_b_a',
38ddfacb
D
721 text: 'Friend of'
722 }
723 ]
724 );
725 });
726 });
c0bb8bd4
DB
727 });
728
d7a470db
DB
729 describe('crmEditableTabTitle', function () {
730 var element, titleLabel, penIcon, saveButton, cancelButton;
731
732 beforeEach(function() {
733 scope = $rootScope.$new();
734 element = '<div crm-editable-tab-title title="Click to edit">' +
7c369cd7 735 '<span>{{ activitySet.label }}</span>' +
d7a470db
DB
736 '</div>';
737
738 scope.activitySet = { label: 'Title'};
739 element = $compile(element)(scope);
740
741 titleLabel = $(element).find('span');
742 penIcon = $(element).find('i.fa-pencil');
743 saveButton = $(element).find('button[type=button]');
744 cancelButton = $(element).find('button[type=cancel]');
745
746 scope.$digest();
747 });
748
749 describe('when initialized', function () {
750 it('hides the save and cancel button', function () {
751 expect(saveButton.parent().css('display') === 'none').toBe(true);
752 expect(cancelButton.parent().css('display') === 'none').toBe(true);
753 });
754 });
755
756 describe('when clicked on title label', function () {
757 beforeEach(function () {
758 titleLabel.click();
759 });
760
761 it('hides the pen icon', function () {
762 expect(penIcon.css('display') === 'none').toBe(true);
763 });
764
765 it('shows the save button', function () {
766 expect(saveButton.parent().css('display') !== 'none').toBe(true);
767 });
768
769 it('makes the title editable', function () {
770 expect(titleLabel.attr('contenteditable')).toBe('true');
771 });
772 });
773
774 describe('when clicked outside of the editable area', function () {
775 beforeEach(function () {
776 titleLabel.click();
777 titleLabel.text('Updated Title');
778 titleLabel.blur();
779 $timeout.flush();
780 scope.$digest();
781 });
782
783 it('shows the pen icon', function () {
784 expect(penIcon.css('display') !== 'none').toBe(true);
785 });
786
787 it('hides the save and cancel button', function () {
788 expect(saveButton.parent().css('display') === 'none').toBe(true);
789 expect(cancelButton.parent().css('display') === 'none').toBe(true);
790 });
791
792 it('makes the title non editable', function () {
793 expect(titleLabel.attr('contenteditable')).not.toBe('true');
794 });
795
796 it('does not update the title in angular context', function () {
797 expect(scope.activitySet.label).toBe('Title');
798 });
799 });
800
801 describe('when ESCAPE key is pressed while typing', function () {
802 beforeEach(function () {
803 var eventObj = $.Event('keydown');
804 eventObj.key = 'Escape';
805
806 titleLabel.click();
807 titleLabel.text('Updated Title');
808 titleLabel.trigger(eventObj);
809 scope.$digest();
810 });
811
812 it('shows the pen icon', function () {
813 expect(penIcon.css('display') !== 'none').toBe(true);
814 });
815
816 it('hides the save and cancel button', function () {
817 expect(saveButton.parent().css('display') === 'none').toBe(true);
818 expect(cancelButton.parent().css('display') === 'none').toBe(true);
819 });
820
821 it('makes the title non editable', function () {
822 expect(titleLabel.attr('contenteditable')).not.toBe('true');
823 });
824
825 it('does not update the title', function () {
826 expect(scope.activitySet.label).toBe('Title');
827 });
828 });
829
830 describe('when ENTER key is pressed while typing', function () {
831 beforeEach(function () {
832 var eventObj = $.Event('keydown');
833 eventObj.key = 'Enter';
834
835 titleLabel.click();
836 titleLabel.text('Updated Title');
837 titleLabel.trigger(eventObj);
838 scope.$digest();
839 });
840
841 it('shows the pen icon', function () {
842 expect(penIcon.css('display') !== 'none').toBe(true);
843 });
844
845 it('hides the save and cancel button', function () {
846 expect(saveButton.parent().css('display') === 'none').toBe(true);
847 expect(cancelButton.parent().css('display') === 'none').toBe(true);
848 });
849
850 it('makes the title non editable', function () {
851 expect(titleLabel.attr('contenteditable')).not.toBe('true');
852 });
853
854 it('updates the title in angular context', function () {
855 expect(scope.activitySet.label).toBe('Updated Title');
856 });
857 });
858
859 describe('when SAVE button is clicked', function () {
860 beforeEach(function () {
861 titleLabel.click();
862 titleLabel.text('Updated Title');
863 saveButton.click();
864 scope.$digest();
865 });
866
867 it('shows the pen icon', function () {
868 expect(penIcon.css('display') !== 'none').toBe(true);
869 });
870
871 it('hides the save and cancel button', function () {
872 expect(saveButton.parent().css('display') === 'none').toBe(true);
873 expect(cancelButton.parent().css('display') === 'none').toBe(true);
874 });
875
876 it('makes the title non editable', function () {
877 expect(titleLabel.attr('contenteditable')).not.toBe('true');
878 });
879
880 it('updates the title in angular context', function () {
881 expect(scope.activitySet.label).toBe('Updated Title');
882 });
883 });
884
885 describe('when CANCEL button is clicked', function () {
886 beforeEach(function () {
887 titleLabel.click();
888 titleLabel.text('Updated Title');
889 cancelButton.click();
890 scope.$digest();
891 });
892
893 it('shows the pen icon', function () {
894 expect(penIcon.css('display') !== 'none').toBe(true);
895 });
896
897 it('hides the save and cancel button', function () {
898 expect(saveButton.parent().css('display') === 'none').toBe(true);
899 expect(cancelButton.parent().css('display') === 'none').toBe(true);
900 });
901
902 it('makes the title non editable', function () {
903 expect(titleLabel.attr('contenteditable')).not.toBe('true');
904 });
905
906 it('does not update the title in angular context', function () {
907 expect(scope.activitySet.label).toBe('Title');
908 });
909 });
910 });
911
c9817fac
RO
912 describe('CaseTypeListCtrl', function() {
913 var caseTypes, crmApiSpy;
d9aaf033 914
c9817fac 915 beforeEach(function() {
d9aaf033
RO
916 caseTypes = {
917 values: {
918 1: { id: 1 },
919 2: { id: 2 },
920 3: { id: 3 }
921 }
922 };
c9817fac 923 crmApiSpy = jasmine.createSpy('crmApi').and.returnValue($q.resolve());
d9aaf033
RO
924 scope = $rootScope.$new();
925 ctrl = $controller('CaseTypeListCtrl', {
926 $scope: scope,
c9817fac
RO
927 caseTypes: caseTypes,
928 crmApi: crmApiSpy
d9aaf033
RO
929 });
930 });
931
932 it('should store an index of case types', function() {
933 expect(scope.caseTypes).toEqual(caseTypes.values);
934 });
c9817fac
RO
935
936 describe('toggleCaseType', function() {
937 var caseType = { id: _.uniqueId() };
938
939 describe('when the case is active', function() {
940 beforeEach(function() {
941 caseType.is_active = '1';
942
943 scope.toggleCaseType(caseType);
944 });
945
946 it('sets the case type as inactive', function() {
947 expect(crmApiSpy).toHaveBeenCalledWith('CaseType', 'create', jasmine.objectContaining({
948 id: caseType.id,
949 is_active: '0'
950 }), true);
951 });
952 });
953
954 describe('when the case is inactive', function() {
955 beforeEach(function() {
956 caseType.is_active = '0';
957
958 scope.toggleCaseType(caseType);
959 });
960
961 it('sets the case type as active', function() {
962 expect(crmApiSpy).toHaveBeenCalledWith('CaseType', 'create', jasmine.objectContaining({
963 id: caseType.id,
964 is_active: '1'
965 }), true);
966 });
967 });
968 });
2e01cc82
RO
969
970 describe('deleteCaseType', function() {
971 var caseType = { id: _.uniqueId() };
972
973 beforeEach(function() {
974 crmApiSpy.and.returnValue($q.resolve(caseType));
975 scope.caseTypes[caseType.id] = caseType;
976
977 scope.deleteCaseType(caseType);
978 scope.$digest();
979 });
980
981 describe('when the case type can be deleted', function() {
982 it('deletes the case from the api', function() {
983 expect(crmApiSpy).toHaveBeenCalledWith('CaseType', 'delete', { id: caseType.id }, jasmine.any(Object));
984 });
985
986 it('removes the case type from the list', function() {
987 expect(scope.caseTypes[caseType.id]).toBeUndefined();
988 });
989 });
990
b4e42693
RO
991 describe('revertCaseType', function() {
992 var caseType = {
993 id: _.uniqueId(),
994 definition: {},
995 is_forked: '1'
996 };
997
998 describe('when reverting a case type', function() {
999 beforeEach(function() {
1000 scope.revertCaseType(caseType);
1001 });
1002
1003 it('resets the case type information using the api', function() {
1004 expect(crmApiSpy).toHaveBeenCalledWith('CaseType', 'create', jasmine.objectContaining({
1005 id: caseType.id,
1006 definition: 'null',
1007 is_forked: '0'
1008 }), true);
1009 });
1010 });
1011 });
2e01cc82 1012 });
6fc8ca2c 1013
1014 // Test show/hide for the various dropdown actions
1015 describe('showandtell', function() {
1016 var templateCache;
1017 var template;
1018
1019 // $templateCache is populated by the nghtml2js plugin. See karma.conf.js
1020 // I'm not sure why it can't be injected higher up in the hierarchy. It doesn't seem to work?
1021 beforeEach(inject(function($templateCache) {
1022 scope = $rootScope.$new();
1023 templateCache = $templateCache;
1024 template = templateCache.get('~/crmCaseType/list.html');
1025 }));
1026
1027 // Helper function which we call repeatedly. It can't be in beforeEach
1028 // because then the timing is wrong because we need different caseTypes
1029 // in each test, which happens of course after beforeEach.
1030 var compileTemplate = function(scope) {
1031 var element = $compile(template)(scope);
1032 scope.$digest();
1033 return element;
1034 };
1035
1036 // This is the workhorse function that does the actual test, called
1037 // repeatedly for each case type variation from the `it()` below.
1038 var doTest = function(inputCaseType, expected) {
1039 // Mock up our case types based on input, merging some static info
1040 // with the variable input.
1041 var caseType = {
1042 id: 1,
1043 title: 'Housing Support',
1044 name: 'housing_support'
1045 };
1046 // PhantomJS at the moment doesn't support ES6, so do a loop.
1047 for (var memberVar in inputCaseType) {
1048 caseType[memberVar] = inputCaseType[memberVar];
1049 }
1050 scope.caseTypes = {
1051 1: caseType
1052 };
1053
1054 // Render the template in the context of our scope now that the scope
1055 // contains our mock case types.
1056 var element = compileTemplate(scope);
1057 //console.debug(element);
1058
1059 //
1060 // Now verify the expected values
1061 //
1062
1063 // Useful variable for displaying the inputs that caused failure
1064 // in readable form.
1065 var inputStr = JSON.stringify(inputCaseType);
1066
1067 expect(element.find('span.more-panel').hasClass('ng-hide')).toBe(expected.more_hidden, 'More link should be ' +
1068 (expected.more_hidden ? 'hidden' : 'visible') +
1069 ' for ' + inputStr);
1070
1071 expect(element.find('li.panel-item-enable').hasClass('ng-hide')).toBe(expected.enable_hidden, 'Enable should be ' +
1072 (expected.enable_hidden ? 'hidden' : 'visible') +
1073 ' for ' + inputStr);
1074
1075 expect(element.find('li.panel-item-disable').hasClass('ng-hide')).toBe(expected.disable_hidden, 'Disable should be ' +
1076 (expected.disable_hidden ? 'hidden' : 'visible') +
1077 ' for ' + inputStr);
1078
1079 expect(element.find('li.panel-item-revert').hasClass('ng-hide')).toBe(expected.revert_hidden, 'Revert should be ' +
1080 (expected.revert_hidden ? 'hidden' : 'visible') +
1081 ' for ' + inputStr);
1082
1083 expect(element.find('li.panel-item-delete').hasClass('ng-hide')).toBe(expected.delete_hidden, 'Delete should be ' +
1084 (expected.delete_hidden ? 'hidden' : 'visible') +
1085 ' for ' + inputStr);
1086 };
1087
1088 // Test show/hide for the various dropdown actions
1089 //
1090 // There's 625 assertions.
1091 // Three variables: [is_active, is_forked, is_reserved],
1092 // each with 5 possible values: [0, 1, "0", "1", undefined].
1093 // Then, multiply that by 5 because there are 5 UI elements
1094 // to be checked.
1095 // So 125 possible input tuples, with 5 things to check in each test.
1096 it('to be or not to be', function() {
1097 var caseTypeSimulations = [
1098 [
1099 // input case type
1100 {"is_active": "1", "is_reserved": "0"},
1101 {
1102 // should more link be hidden
1103 "more_hidden": false,
1104 // should enable choice be hidden
1105 "enable_hidden": true,
1106 // should disable choice be hidden
1107 "disable_hidden": false,
1108 // should revert choice be hidden
1109 "revert_hidden": true,
1110 // should delete choice be hidden
1111 "delete_hidden": false
1112 }
1113 ],
1114
1115 [
1116 {"is_active":0,"is_reserved":0,"is_forked":0},
1117 {
1118 "more_hidden": false,
1119 "enable_hidden": false,
1120 "disable_hidden": true,
1121 "revert_hidden": true,
1122 "delete_hidden": false
1123 }
1124 ],
1125
1126 [
1127 {"is_active":0,"is_reserved":0,"is_forked":1},
1128 {
1129 "more_hidden": false,
1130 "enable_hidden": false,
1131 "disable_hidden": true,
1132 "revert_hidden": false,
1133 "delete_hidden": false
1134 }
1135 ],
1136
1137 [
1138 {"is_active":0,"is_reserved":0,"is_forked":"0"},
1139 {
1140 "more_hidden": false,
1141 "enable_hidden": false,
1142 "disable_hidden": true,
1143 "revert_hidden": true,
1144 "delete_hidden": false
1145 }
1146 ],
1147
1148 [
1149 {"is_active":0,"is_reserved":0,"is_forked":"1"},
1150 {
1151 "more_hidden": false,
1152 "enable_hidden": false,
1153 "disable_hidden": true,
1154 "revert_hidden": false,
1155 "delete_hidden": false
1156 }
1157 ],
1158
1159 [
1160 {"is_active":0,"is_reserved":0},
1161 {
1162 "more_hidden": false,
1163 "enable_hidden": false,
1164 "disable_hidden": true,
1165 "revert_hidden": true,
1166 "delete_hidden": false
1167 }
1168 ],
1169
1170 [
1171 {"is_active":0,"is_reserved":1,"is_forked":0},
1172 {
1173 "more_hidden": false,
1174 "enable_hidden": false,
1175 "disable_hidden": true,
1176 "revert_hidden": true,
1177 "delete_hidden": true
1178 }
1179 ],
1180
1181 [
1182 {"is_active":0,"is_reserved":1,"is_forked":1},
1183 {
1184 "more_hidden": false,
1185 "enable_hidden": false,
1186 "disable_hidden": true,
1187 "revert_hidden": false,
1188 "delete_hidden": true
1189 }
1190 ],
1191
1192 [
1193 {"is_active":0,"is_reserved":1,"is_forked":"0"},
1194 {
1195 "more_hidden": false,
1196 "enable_hidden": false,
1197 "disable_hidden": true,
1198 "revert_hidden": true,
1199 "delete_hidden": true
1200 }
1201 ],
1202
1203 [
1204 {"is_active":0,"is_reserved":1,"is_forked":"1"},
1205 {
1206 "more_hidden": false,
1207 "enable_hidden": false,
1208 "disable_hidden": true,
1209 "revert_hidden": false,
1210 "delete_hidden": true
1211 }
1212 ],
1213
1214 [
1215 {"is_active":0,"is_reserved":1},
1216 {
1217 "more_hidden": false,
1218 "enable_hidden": false,
1219 "disable_hidden": true,
1220 "revert_hidden": true,
1221 "delete_hidden": true
1222 }
1223 ],
1224
1225 [
1226 {"is_active":0,"is_reserved":"0","is_forked":0},
1227 {
1228 "more_hidden": false,
1229 "enable_hidden": false,
1230 "disable_hidden": true,
1231 "revert_hidden": true,
1232 "delete_hidden": false
1233 }
1234 ],
1235
1236 [
1237 {"is_active":0,"is_reserved":"0","is_forked":1},
1238 {
1239 "more_hidden": false,
1240 "enable_hidden": false,
1241 "disable_hidden": true,
1242 "revert_hidden": false,
1243 "delete_hidden": false
1244 }
1245 ],
1246
1247 [
1248 {"is_active":0,"is_reserved":"0","is_forked":"0"},
1249 {
1250 "more_hidden": false,
1251 "enable_hidden": false,
1252 "disable_hidden": true,
1253 "revert_hidden": true,
1254 "delete_hidden": false
1255 }
1256 ],
1257
1258 [
1259 {"is_active":0,"is_reserved":"0","is_forked":"1"},
1260 {
1261 "more_hidden": false,
1262 "enable_hidden": false,
1263 "disable_hidden": true,
1264 "revert_hidden": false,
1265 "delete_hidden": false
1266 }
1267 ],
1268
1269 [
1270 {"is_active":0,"is_reserved":"0"},
1271 {
1272 "more_hidden": false,
1273 "enable_hidden": false,
1274 "disable_hidden": true,
1275 "revert_hidden": true,
1276 "delete_hidden": false
1277 }
1278 ],
1279
1280 [
1281 {"is_active":0,"is_reserved":"1","is_forked":0},
1282 {
1283 "more_hidden": false,
1284 "enable_hidden": false,
1285 "disable_hidden": true,
1286 "revert_hidden": true,
1287 "delete_hidden": true
1288 }
1289 ],
1290
1291 [
1292 {"is_active":0,"is_reserved":"1","is_forked":1},
1293 {
1294 "more_hidden": false,
1295 "enable_hidden": false,
1296 "disable_hidden": true,
1297 "revert_hidden": false,
1298 "delete_hidden": true
1299 }
1300 ],
1301
1302 [
1303 {"is_active":0,"is_reserved":"1","is_forked":"0"},
1304 {
1305 "more_hidden": false,
1306 "enable_hidden": false,
1307 "disable_hidden": true,
1308 "revert_hidden": true,
1309 "delete_hidden": true
1310 }
1311 ],
1312
1313 [
1314 {"is_active":0,"is_reserved":"1","is_forked":"1"},
1315 {
1316 "more_hidden": false,
1317 "enable_hidden": false,
1318 "disable_hidden": true,
1319 "revert_hidden": false,
1320 "delete_hidden": true
1321 }
1322 ],
1323
1324 [
1325 {"is_active":0,"is_reserved":"1"},
1326 {
1327 "more_hidden": false,
1328 "enable_hidden": false,
1329 "disable_hidden": true,
1330 "revert_hidden": true,
1331 "delete_hidden": true
1332 }
1333 ],
1334
1335 [
1336 {"is_active":0,"is_forked":0},
1337 {
1338 "more_hidden": false,
1339 "enable_hidden": false,
1340 "disable_hidden": true,
1341 "revert_hidden": true,
1342 "delete_hidden": false
1343 }
1344 ],
1345
1346 [
1347 {"is_active":0,"is_forked":1},
1348 {
1349 "more_hidden": false,
1350 "enable_hidden": false,
1351 "disable_hidden": true,
1352 "revert_hidden": false,
1353 "delete_hidden": false
1354 }
1355 ],
1356
1357 [
1358 {"is_active":0,"is_forked":"0"},
1359 {
1360 "more_hidden": false,
1361 "enable_hidden": false,
1362 "disable_hidden": true,
1363 "revert_hidden": true,
1364 "delete_hidden": false
1365 }
1366 ],
1367
1368 [
1369 {"is_active":0,"is_forked":"1"},
1370 {
1371 "more_hidden": false,
1372 "enable_hidden": false,
1373 "disable_hidden": true,
1374 "revert_hidden": false,
1375 "delete_hidden": false
1376 }
1377 ],
1378
1379 [
1380 {"is_active":0},
1381 {
1382 "more_hidden": false,
1383 "enable_hidden": false,
1384 "disable_hidden": true,
1385 "revert_hidden": true,
1386 "delete_hidden": false
1387 }
1388 ],
1389
1390 [
1391 {"is_active":1,"is_reserved":0,"is_forked":0},
1392 {
1393 "more_hidden": false,
1394 "enable_hidden": true,
1395 "disable_hidden": false,
1396 "revert_hidden": true,
1397 "delete_hidden": false
1398 }
1399 ],
1400
1401 [
1402 {"is_active":1,"is_reserved":0,"is_forked":1},
1403 {
1404 "more_hidden": false,
1405 "enable_hidden": true,
1406 "disable_hidden": false,
1407 "revert_hidden": false,
1408 "delete_hidden": false
1409 }
1410 ],
1411
1412 [
1413 {"is_active":1,"is_reserved":0,"is_forked":"0"},
1414 {
1415 "more_hidden": false,
1416 "enable_hidden": true,
1417 "disable_hidden": false,
1418 "revert_hidden": true,
1419 "delete_hidden": false
1420 }
1421 ],
1422
1423 [
1424 {"is_active":1,"is_reserved":0,"is_forked":"1"},
1425 {
1426 "more_hidden": false,
1427 "enable_hidden": true,
1428 "disable_hidden": false,
1429 "revert_hidden": false,
1430 "delete_hidden": false
1431 }
1432 ],
1433
1434 [
1435 {"is_active":1,"is_reserved":0},
1436 {
1437 "more_hidden": false,
1438 "enable_hidden": true,
1439 "disable_hidden": false,
1440 "revert_hidden": true,
1441 "delete_hidden": false
1442 }
1443 ],
1444
1445 [
1446 {"is_active":1,"is_reserved":1,"is_forked":0},
1447 {
1448 "more_hidden": true,
1449 "enable_hidden": true,
1450 "disable_hidden": true,
1451 "revert_hidden": true,
1452 "delete_hidden": true
1453 }
1454 ],
1455
1456 [
1457 {"is_active":1,"is_reserved":1,"is_forked":1},
1458 {
1459 "more_hidden": false,
1460 "enable_hidden": true,
1461 "disable_hidden": true,
1462 "revert_hidden": false,
1463 "delete_hidden": true
1464 }
1465 ],
1466
1467 [
1468 {"is_active":1,"is_reserved":1,"is_forked":"0"},
1469 {
1470 "more_hidden": true,
1471 "enable_hidden": true,
1472 "disable_hidden": true,
1473 "revert_hidden": true,
1474 "delete_hidden": true
1475 }
1476 ],
1477
1478 [
1479 {"is_active":1,"is_reserved":1,"is_forked":"1"},
1480 {
1481 "more_hidden": false,
1482 "enable_hidden": true,
1483 "disable_hidden": true,
1484 "revert_hidden": false,
1485 "delete_hidden": true
1486 }
1487 ],
1488
1489 [
1490 {"is_active":1,"is_reserved":1},
1491 {
1492 "more_hidden": true,
1493 "enable_hidden": true,
1494 "disable_hidden": true,
1495 "revert_hidden": true,
1496 "delete_hidden": true
1497 }
1498 ],
1499
1500 [
1501 {"is_active":1,"is_reserved":"0","is_forked":0},
1502 {
1503 "more_hidden": false,
1504 "enable_hidden": true,
1505 "disable_hidden": false,
1506 "revert_hidden": true,
1507 "delete_hidden": false
1508 }
1509 ],
1510
1511 [
1512 {"is_active":1,"is_reserved":"0","is_forked":1},
1513 {
1514 "more_hidden": false,
1515 "enable_hidden": true,
1516 "disable_hidden": false,
1517 "revert_hidden": false,
1518 "delete_hidden": false
1519 }
1520 ],
1521
1522 [
1523 {"is_active":1,"is_reserved":"0","is_forked":"0"},
1524 {
1525 "more_hidden": false,
1526 "enable_hidden": true,
1527 "disable_hidden": false,
1528 "revert_hidden": true,
1529 "delete_hidden": false
1530 }
1531 ],
1532
1533 [
1534 {"is_active":1,"is_reserved":"0","is_forked":"1"},
1535 {
1536 "more_hidden": false,
1537 "enable_hidden": true,
1538 "disable_hidden": false,
1539 "revert_hidden": false,
1540 "delete_hidden": false
1541 }
1542 ],
1543
1544 [
1545 {"is_active":1,"is_reserved":"0"},
1546 {
1547 "more_hidden": false,
1548 "enable_hidden": true,
1549 "disable_hidden": false,
1550 "revert_hidden": true,
1551 "delete_hidden": false
1552 }
1553 ],
1554
1555 [
1556 {"is_active":1,"is_reserved":"1","is_forked":0},
1557 {
1558 "more_hidden": true,
1559 "enable_hidden": true,
1560 "disable_hidden": true,
1561 "revert_hidden": true,
1562 "delete_hidden": true
1563 }
1564 ],
1565
1566 [
1567 {"is_active":1,"is_reserved":"1","is_forked":1},
1568 {
1569 "more_hidden": false,
1570 "enable_hidden": true,
1571 "disable_hidden": true,
1572 "revert_hidden": false,
1573 "delete_hidden": true
1574 }
1575 ],
1576
1577 [
1578 {"is_active":1,"is_reserved":"1","is_forked":"0"},
1579 {
1580 "more_hidden": true,
1581 "enable_hidden": true,
1582 "disable_hidden": true,
1583 "revert_hidden": true,
1584 "delete_hidden": true
1585 }
1586 ],
1587
1588 [
1589 {"is_active":1,"is_reserved":"1","is_forked":"1"},
1590 {
1591 "more_hidden": false,
1592 "enable_hidden": true,
1593 "disable_hidden": true,
1594 "revert_hidden": false,
1595 "delete_hidden": true
1596 }
1597 ],
1598
1599 [
1600 {"is_active":1,"is_reserved":"1"},
1601 {
1602 "more_hidden": true,
1603 "enable_hidden": true,
1604 "disable_hidden": true,
1605 "revert_hidden": true,
1606 "delete_hidden": true
1607 }
1608 ],
1609
1610 [
1611 {"is_active":1,"is_forked":0},
1612 {
1613 "more_hidden": false,
1614 "enable_hidden": true,
1615 "disable_hidden": false,
1616 "revert_hidden": true,
1617 "delete_hidden": false
1618 }
1619 ],
1620
1621 [
1622 {"is_active":1,"is_forked":1},
1623 {
1624 "more_hidden": false,
1625 "enable_hidden": true,
1626 "disable_hidden": false,
1627 "revert_hidden": false,
1628 "delete_hidden": false
1629 }
1630 ],
1631
1632 [
1633 {"is_active":1,"is_forked":"0"},
1634 {
1635 "more_hidden": false,
1636 "enable_hidden": true,
1637 "disable_hidden": false,
1638 "revert_hidden": true,
1639 "delete_hidden": false
1640 }
1641 ],
1642
1643 [
1644 {"is_active":1,"is_forked":"1"},
1645 {
1646 "more_hidden": false,
1647 "enable_hidden": true,
1648 "disable_hidden": false,
1649 "revert_hidden": false,
1650 "delete_hidden": false
1651 }
1652 ],
1653
1654 [
1655 {"is_active":1},
1656 {
1657 "more_hidden": false,
1658 "enable_hidden": true,
1659 "disable_hidden": false,
1660 "revert_hidden": true,
1661 "delete_hidden": false
1662 }
1663 ],
1664
1665 [
1666 {"is_active":"0","is_reserved":0,"is_forked":0},
1667 {
1668 "more_hidden": false,
1669 "enable_hidden": false,
1670 "disable_hidden": true,
1671 "revert_hidden": true,
1672 "delete_hidden": false
1673 }
1674 ],
1675
1676 [
1677 {"is_active":"0","is_reserved":0,"is_forked":1},
1678 {
1679 "more_hidden": false,
1680 "enable_hidden": false,
1681 "disable_hidden": true,
1682 "revert_hidden": false,
1683 "delete_hidden": false
1684 }
1685 ],
1686
1687 [
1688 {"is_active":"0","is_reserved":0,"is_forked":"0"},
1689 {
1690 "more_hidden": false,
1691 "enable_hidden": false,
1692 "disable_hidden": true,
1693 "revert_hidden": true,
1694 "delete_hidden": false
1695 }
1696 ],
1697
1698 [
1699 {"is_active":"0","is_reserved":0,"is_forked":"1"},
1700 {
1701 "more_hidden": false,
1702 "enable_hidden": false,
1703 "disable_hidden": true,
1704 "revert_hidden": false,
1705 "delete_hidden": false
1706 }
1707 ],
1708
1709 [
1710 {"is_active":"0","is_reserved":0},
1711 {
1712 "more_hidden": false,
1713 "enable_hidden": false,
1714 "disable_hidden": true,
1715 "revert_hidden": true,
1716 "delete_hidden": false
1717 }
1718 ],
1719
1720 [
1721 {"is_active":"0","is_reserved":1,"is_forked":0},
1722 {
1723 "more_hidden": false,
1724 "enable_hidden": false,
1725 "disable_hidden": true,
1726 "revert_hidden": true,
1727 "delete_hidden": true
1728 }
1729 ],
1730
1731 [
1732 {"is_active":"0","is_reserved":1,"is_forked":1},
1733 {
1734 "more_hidden": false,
1735 "enable_hidden": false,
1736 "disable_hidden": true,
1737 "revert_hidden": false,
1738 "delete_hidden": true
1739 }
1740 ],
1741
1742 [
1743 {"is_active":"0","is_reserved":1,"is_forked":"0"},
1744 {
1745 "more_hidden": false,
1746 "enable_hidden": false,
1747 "disable_hidden": true,
1748 "revert_hidden": true,
1749 "delete_hidden": true
1750 }
1751 ],
1752
1753 [
1754 {"is_active":"0","is_reserved":1,"is_forked":"1"},
1755 {
1756 "more_hidden": false,
1757 "enable_hidden": false,
1758 "disable_hidden": true,
1759 "revert_hidden": false,
1760 "delete_hidden": true
1761 }
1762 ],
1763
1764 [
1765 {"is_active":"0","is_reserved":1},
1766 {
1767 "more_hidden": false,
1768 "enable_hidden": false,
1769 "disable_hidden": true,
1770 "revert_hidden": true,
1771 "delete_hidden": true
1772 }
1773 ],
1774
1775 [
1776 {"is_active":"0","is_reserved":"0","is_forked":0},
1777 {
1778 "more_hidden": false,
1779 "enable_hidden": false,
1780 "disable_hidden": true,
1781 "revert_hidden": true,
1782 "delete_hidden": false
1783 }
1784 ],
1785
1786 [
1787 {"is_active":"0","is_reserved":"0","is_forked":1},
1788 {
1789 "more_hidden": false,
1790 "enable_hidden": false,
1791 "disable_hidden": true,
1792 "revert_hidden": false,
1793 "delete_hidden": false
1794 }
1795 ],
1796
1797 [
1798 {"is_active":"0","is_reserved":"0","is_forked":"0"},
1799 {
1800 "more_hidden": false,
1801 "enable_hidden": false,
1802 "disable_hidden": true,
1803 "revert_hidden": true,
1804 "delete_hidden": false
1805 }
1806 ],
1807
1808 [
1809 {"is_active":"0","is_reserved":"0","is_forked":"1"},
1810 {
1811 "more_hidden": false,
1812 "enable_hidden": false,
1813 "disable_hidden": true,
1814 "revert_hidden": false,
1815 "delete_hidden": false
1816 }
1817 ],
1818
1819 [
1820 {"is_active":"0","is_reserved":"0"},
1821 {
1822 "more_hidden": false,
1823 "enable_hidden": false,
1824 "disable_hidden": true,
1825 "revert_hidden": true,
1826 "delete_hidden": false
1827 }
1828 ],
1829
1830 [
1831 {"is_active":"0","is_reserved":"1","is_forked":0},
1832 {
1833 "more_hidden": false,
1834 "enable_hidden": false,
1835 "disable_hidden": true,
1836 "revert_hidden": true,
1837 "delete_hidden": true
1838 }
1839 ],
1840
1841 [
1842 {"is_active":"0","is_reserved":"1","is_forked":1},
1843 {
1844 "more_hidden": false,
1845 "enable_hidden": false,
1846 "disable_hidden": true,
1847 "revert_hidden": false,
1848 "delete_hidden": true
1849 }
1850 ],
1851
1852 [
1853 {"is_active":"0","is_reserved":"1","is_forked":"0"},
1854 {
1855 "more_hidden": false,
1856 "enable_hidden": false,
1857 "disable_hidden": true,
1858 "revert_hidden": true,
1859 "delete_hidden": true
1860 }
1861 ],
1862
1863 [
1864 {"is_active":"0","is_reserved":"1","is_forked":"1"},
1865 {
1866 "more_hidden": false,
1867 "enable_hidden": false,
1868 "disable_hidden": true,
1869 "revert_hidden": false,
1870 "delete_hidden": true
1871 }
1872 ],
1873
1874 [
1875 {"is_active":"0","is_reserved":"1"},
1876 {
1877 "more_hidden": false,
1878 "enable_hidden": false,
1879 "disable_hidden": true,
1880 "revert_hidden": true,
1881 "delete_hidden": true
1882 }
1883 ],
1884
1885 [
1886 {"is_active":"0","is_forked":0},
1887 {
1888 "more_hidden": false,
1889 "enable_hidden": false,
1890 "disable_hidden": true,
1891 "revert_hidden": true,
1892 "delete_hidden": false
1893 }
1894 ],
1895
1896 [
1897 {"is_active":"0","is_forked":1},
1898 {
1899 "more_hidden": false,
1900 "enable_hidden": false,
1901 "disable_hidden": true,
1902 "revert_hidden": false,
1903 "delete_hidden": false
1904 }
1905 ],
1906
1907 [
1908 {"is_active":"0","is_forked":"0"},
1909 {
1910 "more_hidden": false,
1911 "enable_hidden": false,
1912 "disable_hidden": true,
1913 "revert_hidden": true,
1914 "delete_hidden": false
1915 }
1916 ],
1917
1918 [
1919 {"is_active":"0","is_forked":"1"},
1920 {
1921 "more_hidden": false,
1922 "enable_hidden": false,
1923 "disable_hidden": true,
1924 "revert_hidden": false,
1925 "delete_hidden": false
1926 }
1927 ],
1928
1929 [
1930 {"is_active":"0"},
1931 {
1932 "more_hidden": false,
1933 "enable_hidden": false,
1934 "disable_hidden": true,
1935 "revert_hidden": true,
1936 "delete_hidden": false
1937 }
1938 ],
1939
1940 [
1941 {"is_active":"1","is_reserved":0,"is_forked":0},
1942 {
1943 "more_hidden": false,
1944 "enable_hidden": true,
1945 "disable_hidden": false,
1946 "revert_hidden": true,
1947 "delete_hidden": false
1948 }
1949 ],
1950
1951 [
1952 {"is_active":"1","is_reserved":0,"is_forked":1},
1953 {
1954 "more_hidden": false,
1955 "enable_hidden": true,
1956 "disable_hidden": false,
1957 "revert_hidden": false,
1958 "delete_hidden": false
1959 }
1960 ],
1961
1962 [
1963 {"is_active":"1","is_reserved":0,"is_forked":"0"},
1964 {
1965 "more_hidden": false,
1966 "enable_hidden": true,
1967 "disable_hidden": false,
1968 "revert_hidden": true,
1969 "delete_hidden": false
1970 }
1971 ],
1972
1973 [
1974 {"is_active":"1","is_reserved":0,"is_forked":"1"},
1975 {
1976 "more_hidden": false,
1977 "enable_hidden": true,
1978 "disable_hidden": false,
1979 "revert_hidden": false,
1980 "delete_hidden": false
1981 }
1982 ],
1983
1984 [
1985 {"is_active":"1","is_reserved":0},
1986 {
1987 "more_hidden": false,
1988 "enable_hidden": true,
1989 "disable_hidden": false,
1990 "revert_hidden": true,
1991 "delete_hidden": false
1992 }
1993 ],
1994
1995 [
1996 {"is_active":"1","is_reserved":1,"is_forked":0},
1997 {
1998 "more_hidden": true,
1999 "enable_hidden": true,
2000 "disable_hidden": true,
2001 "revert_hidden": true,
2002 "delete_hidden": true
2003 }
2004 ],
2005
2006 [
2007 {"is_active":"1","is_reserved":1,"is_forked":1},
2008 {
2009 "more_hidden": false,
2010 "enable_hidden": true,
2011 "disable_hidden": true,
2012 "revert_hidden": false,
2013 "delete_hidden": true
2014 }
2015 ],
2016
2017 [
2018 {"is_active":"1","is_reserved":1,"is_forked":"0"},
2019 {
2020 "more_hidden": true,
2021 "enable_hidden": true,
2022 "disable_hidden": true,
2023 "revert_hidden": true,
2024 "delete_hidden": true
2025 }
2026 ],
2027
2028 [
2029 {"is_active":"1","is_reserved":1,"is_forked":"1"},
2030 {
2031 "more_hidden": false,
2032 "enable_hidden": true,
2033 "disable_hidden": true,
2034 "revert_hidden": false,
2035 "delete_hidden": true
2036 }
2037 ],
2038
2039 [
2040 {"is_active":"1","is_reserved":1},
2041 {
2042 "more_hidden": true,
2043 "enable_hidden": true,
2044 "disable_hidden": true,
2045 "revert_hidden": true,
2046 "delete_hidden": true
2047 }
2048 ],
2049
2050 [
2051 {"is_active":"1","is_reserved":"0","is_forked":0},
2052 {
2053 "more_hidden": false,
2054 "enable_hidden": true,
2055 "disable_hidden": false,
2056 "revert_hidden": true,
2057 "delete_hidden": false
2058 }
2059 ],
2060
2061 [
2062 {"is_active":"1","is_reserved":"0","is_forked":1},
2063 {
2064 "more_hidden": false,
2065 "enable_hidden": true,
2066 "disable_hidden": false,
2067 "revert_hidden": false,
2068 "delete_hidden": false
2069 }
2070 ],
2071
2072 [
2073 {"is_active":"1","is_reserved":"0","is_forked":"0"},
2074 {
2075 "more_hidden": false,
2076 "enable_hidden": true,
2077 "disable_hidden": false,
2078 "revert_hidden": true,
2079 "delete_hidden": false
2080 }
2081 ],
2082
2083 [
2084 {"is_active":"1","is_reserved":"0","is_forked":"1"},
2085 {
2086 "more_hidden": false,
2087 "enable_hidden": true,
2088 "disable_hidden": false,
2089 "revert_hidden": false,
2090 "delete_hidden": false
2091 }
2092 ],
2093
2094 [
2095 {"is_active":"1","is_reserved":"0"},
2096 {
2097 "more_hidden": false,
2098 "enable_hidden": true,
2099 "disable_hidden": false,
2100 "revert_hidden": true,
2101 "delete_hidden": false
2102 }
2103 ],
2104
2105 [
2106 {"is_active":"1","is_reserved":"1","is_forked":0},
2107 {
2108 "more_hidden": true,
2109 "enable_hidden": true,
2110 "disable_hidden": true,
2111 "revert_hidden": true,
2112 "delete_hidden": true
2113 }
2114 ],
2115
2116 [
2117 {"is_active":"1","is_reserved":"1","is_forked":1},
2118 {
2119 "more_hidden": false,
2120 "enable_hidden": true,
2121 "disable_hidden": true,
2122 "revert_hidden": false,
2123 "delete_hidden": true
2124 }
2125 ],
2126
2127 [
2128 {"is_active":"1","is_reserved":"1","is_forked":"0"},
2129 {
2130 "more_hidden": true,
2131 "enable_hidden": true,
2132 "disable_hidden": true,
2133 "revert_hidden": true,
2134 "delete_hidden": true
2135 }
2136 ],
2137
2138 [
2139 {"is_active":"1","is_reserved":"1","is_forked":"1"},
2140 {
2141 "more_hidden": false,
2142 "enable_hidden": true,
2143 "disable_hidden": true,
2144 "revert_hidden": false,
2145 "delete_hidden": true
2146 }
2147 ],
2148
2149 [
2150 {"is_active":"1","is_reserved":"1"},
2151 {
2152 "more_hidden": true,
2153 "enable_hidden": true,
2154 "disable_hidden": true,
2155 "revert_hidden": true,
2156 "delete_hidden": true
2157 }
2158 ],
2159
2160 [
2161 {"is_active":"1","is_forked":0},
2162 {
2163 "more_hidden": false,
2164 "enable_hidden": true,
2165 "disable_hidden": false,
2166 "revert_hidden": true,
2167 "delete_hidden": false
2168 }
2169 ],
2170
2171 [
2172 {"is_active":"1","is_forked":1},
2173 {
2174 "more_hidden": false,
2175 "enable_hidden": true,
2176 "disable_hidden": false,
2177 "revert_hidden": false,
2178 "delete_hidden": false
2179 }
2180 ],
2181
2182 [
2183 {"is_active":"1","is_forked":"0"},
2184 {
2185 "more_hidden": false,
2186 "enable_hidden": true,
2187 "disable_hidden": false,
2188 "revert_hidden": true,
2189 "delete_hidden": false
2190 }
2191 ],
2192
2193 [
2194 {"is_active":"1","is_forked":"1"},
2195 {
2196 "more_hidden": false,
2197 "enable_hidden": true,
2198 "disable_hidden": false,
2199 "revert_hidden": false,
2200 "delete_hidden": false
2201 }
2202 ],
2203
2204 [
2205 {"is_active":"1"},
2206 {
2207 "more_hidden": false,
2208 "enable_hidden": true,
2209 "disable_hidden": false,
2210 "revert_hidden": true,
2211 "delete_hidden": false
2212 }
2213 ],
2214
2215 [
2216 {"is_reserved":0,"is_forked":0},
2217 {
2218 "more_hidden": false,
2219 "enable_hidden": false,
2220 "disable_hidden": true,
2221 "revert_hidden": true,
2222 "delete_hidden": false
2223 }
2224 ],
2225
2226 [
2227 {"is_reserved":0,"is_forked":1},
2228 {
2229 "more_hidden": false,
2230 "enable_hidden": false,
2231 "disable_hidden": true,
2232 "revert_hidden": false,
2233 "delete_hidden": false
2234 }
2235 ],
2236
2237 [
2238 {"is_reserved":0,"is_forked":"0"},
2239 {
2240 "more_hidden": false,
2241 "enable_hidden": false,
2242 "disable_hidden": true,
2243 "revert_hidden": true,
2244 "delete_hidden": false
2245 }
2246 ],
2247
2248 [
2249 {"is_reserved":0,"is_forked":"1"},
2250 {
2251 "more_hidden": false,
2252 "enable_hidden": false,
2253 "disable_hidden": true,
2254 "revert_hidden": false,
2255 "delete_hidden": false
2256 }
2257 ],
2258
2259 [
2260 {"is_reserved":0},
2261 {
2262 "more_hidden": false,
2263 "enable_hidden": false,
2264 "disable_hidden": true,
2265 "revert_hidden": true,
2266 "delete_hidden": false
2267 }
2268 ],
2269
2270 [
2271 {"is_reserved":1,"is_forked":0},
2272 {
2273 "more_hidden": false,
2274 "enable_hidden": false,
2275 "disable_hidden": true,
2276 "revert_hidden": true,
2277 "delete_hidden": true
2278 }
2279 ],
2280
2281 [
2282 {"is_reserved":1,"is_forked":1},
2283 {
2284 "more_hidden": false,
2285 "enable_hidden": false,
2286 "disable_hidden": true,
2287 "revert_hidden": false,
2288 "delete_hidden": true
2289 }
2290 ],
2291
2292 [
2293 {"is_reserved":1,"is_forked":"0"},
2294 {
2295 "more_hidden": false,
2296 "enable_hidden": false,
2297 "disable_hidden": true,
2298 "revert_hidden": true,
2299 "delete_hidden": true
2300 }
2301 ],
2302
2303 [
2304 {"is_reserved":1,"is_forked":"1"},
2305 {
2306 "more_hidden": false,
2307 "enable_hidden": false,
2308 "disable_hidden": true,
2309 "revert_hidden": false,
2310 "delete_hidden": true
2311 }
2312 ],
2313
2314 [
2315 {"is_reserved":1},
2316 {
2317 "more_hidden": false,
2318 "enable_hidden": false,
2319 "disable_hidden": true,
2320 "revert_hidden": true,
2321 "delete_hidden": true
2322 }
2323 ],
2324
2325 [
2326 {"is_reserved":"0","is_forked":0},
2327 {
2328 "more_hidden": false,
2329 "enable_hidden": false,
2330 "disable_hidden": true,
2331 "revert_hidden": true,
2332 "delete_hidden": false
2333 }
2334 ],
2335
2336 [
2337 {"is_reserved":"0","is_forked":1},
2338 {
2339 "more_hidden": false,
2340 "enable_hidden": false,
2341 "disable_hidden": true,
2342 "revert_hidden": false,
2343 "delete_hidden": false
2344 }
2345 ],
2346
2347 [
2348 {"is_reserved":"0","is_forked":"0"},
2349 {
2350 "more_hidden": false,
2351 "enable_hidden": false,
2352 "disable_hidden": true,
2353 "revert_hidden": true,
2354 "delete_hidden": false
2355 }
2356 ],
2357
2358 [
2359 {"is_reserved":"0","is_forked":"1"},
2360 {
2361 "more_hidden": false,
2362 "enable_hidden": false,
2363 "disable_hidden": true,
2364 "revert_hidden": false,
2365 "delete_hidden": false
2366 }
2367 ],
2368
2369 [
2370 {"is_reserved":"0"},
2371 {
2372 "more_hidden": false,
2373 "enable_hidden": false,
2374 "disable_hidden": true,
2375 "revert_hidden": true,
2376 "delete_hidden": false
2377 }
2378 ],
2379
2380 [
2381 {"is_reserved":"1","is_forked":0},
2382 {
2383 "more_hidden": false,
2384 "enable_hidden": false,
2385 "disable_hidden": true,
2386 "revert_hidden": true,
2387 "delete_hidden": true
2388 }
2389 ],
2390
2391 [
2392 {"is_reserved":"1","is_forked":1},
2393 {
2394 "more_hidden": false,
2395 "enable_hidden": false,
2396 "disable_hidden": true,
2397 "revert_hidden": false,
2398 "delete_hidden": true
2399 }
2400 ],
2401
2402 [
2403 {"is_reserved":"1","is_forked":"0"},
2404 {
2405 "more_hidden": false,
2406 "enable_hidden": false,
2407 "disable_hidden": true,
2408 "revert_hidden": true,
2409 "delete_hidden": true
2410 }
2411 ],
2412
2413 [
2414 {"is_reserved":"1","is_forked":"1"},
2415 {
2416 "more_hidden": false,
2417 "enable_hidden": false,
2418 "disable_hidden": true,
2419 "revert_hidden": false,
2420 "delete_hidden": true
2421 }
2422 ],
2423
2424 [
2425 {"is_reserved":"1"},
2426 {
2427 "more_hidden": false,
2428 "enable_hidden": false,
2429 "disable_hidden": true,
2430 "revert_hidden": true,
2431 "delete_hidden": true
2432 }
2433 ],
2434
2435 [
2436 {"is_forked":0},
2437 {
2438 "more_hidden": false,
2439 "enable_hidden": false,
2440 "disable_hidden": true,
2441 "revert_hidden": true,
2442 "delete_hidden": false
2443 }
2444 ],
2445
2446 [
2447 {"is_forked":1},
2448 {
2449 "more_hidden": false,
2450 "enable_hidden": false,
2451 "disable_hidden": true,
2452 "revert_hidden": false,
2453 "delete_hidden": false
2454 }
2455 ],
2456
2457 [
2458 {"is_forked":"0"},
2459 {
2460 "more_hidden": false,
2461 "enable_hidden": false,
2462 "disable_hidden": true,
2463 "revert_hidden": true,
2464 "delete_hidden": false
2465 }
2466 ],
2467
2468 [
2469 {"is_forked":"1"},
2470 {
2471 "more_hidden": false,
2472 "enable_hidden": false,
2473 "disable_hidden": true,
2474 "revert_hidden": false,
2475 "delete_hidden": false
2476 }
2477 ],
2478
2479 [
2480 {},
2481 {
2482 "more_hidden": false,
2483 "enable_hidden": false,
2484 "disable_hidden": true,
2485 "revert_hidden": true,
2486 "delete_hidden": false
2487 }
2488 ],
2489 ];
2490 caseTypeSimulations.forEach(function(simulation) {
2491 doTest(simulation[0], simulation[1]);
2492 });
2493 });
2494 });
d9aaf033 2495 });
6fc8ca2c 2496
416abe87 2497});