Skip to content

Commit 6caf062

Browse files
committed
CCM-11494 Update cascade group
1 parent b42cc08 commit 6caf062

File tree

2 files changed

+165
-2
lines changed

2 files changed

+165
-2
lines changed

frontend/src/__tests__/utils/routing-utils.test.ts

Lines changed: 131 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@ import {
66
getRemainingAccessibleFormats,
77
getRemainingLanguages,
88
updateCascadeGroupOverrides,
9+
buildCascadeGroupsForItem,
10+
getConditionalTemplatesForItem,
911
type ConditionalTemplate,
12+
type MessagePlanTemplates,
1013
} from '@utils/routing-utils';
1114
import type {
1215
CascadeItem,
1316
Language,
1417
LetterType,
1518
RoutingConfig,
19+
TemplateDto,
1620
} from 'nhs-notify-backend-client';
1721

1822
const baseConfig: RoutingConfig = {
@@ -257,10 +261,41 @@ describe('removeTemplatesFromCascadeItem', () => {
257261
removeTemplatesFromCascadeItem(cascadeItem, ['template-1', 'template-2']);
258262

259263
expect(cascadeItem.defaultTemplateId).toBe(originalDefaultId);
260-
expect(cascadeItem.conditionalTemplates?.length).toBe(
261-
originalConditionalLength
264+
expect(cascadeItem.conditionalTemplates).toHaveLength(
265+
originalConditionalLength!
262266
);
263267
});
268+
269+
it('should update cascadeGroups when removing all conditional templates', () => {
270+
const cascadeItem: CascadeItem = {
271+
cascadeGroups: ['standard', 'translations'],
272+
channel: 'LETTER',
273+
channelType: 'primary',
274+
defaultTemplateId: 'standard-template',
275+
conditionalTemplates: [{ templateId: 'template-1', language: 'fr' }],
276+
};
277+
278+
const result = removeTemplatesFromCascadeItem(cascadeItem, ['template-1']);
279+
280+
expect(result.cascadeGroups).toEqual(['standard']);
281+
});
282+
283+
it('should update cascadeGroups when removing some but not all conditional templates', () => {
284+
const cascadeItem: CascadeItem = {
285+
cascadeGroups: ['standard', 'accessible', 'translations'],
286+
channel: 'LETTER',
287+
channelType: 'primary',
288+
defaultTemplateId: 'standard-template',
289+
conditionalTemplates: [
290+
{ templateId: 'template-1', language: 'fr' },
291+
{ templateId: 'template-2', accessibleFormat: 'q4' },
292+
],
293+
};
294+
295+
const result = removeTemplatesFromCascadeItem(cascadeItem, ['template-1']);
296+
297+
expect(result.cascadeGroups).toEqual(['standard', 'accessible']);
298+
});
264299
});
265300

266301
describe('getConditionalTemplatesForItem', () => {
@@ -377,6 +412,100 @@ describe('getConditionalTemplatesForItem', () => {
377412
});
378413
});
379414

415+
describe('buildCascadeGroupsForItem', () => {
416+
it('should return only standard group when no conditional templates', () => {
417+
const cascadeItem: CascadeItem = {
418+
cascadeGroups: ['standard'],
419+
channel: 'EMAIL',
420+
channelType: 'primary',
421+
defaultTemplateId: 'template-1',
422+
};
423+
424+
expect(buildCascadeGroupsForItem(cascadeItem)).toEqual(['standard']);
425+
});
426+
427+
it('should return standard and accessible groups when accessible format present', () => {
428+
const cascadeItem: CascadeItem = {
429+
cascadeGroups: ['standard'],
430+
channel: 'LETTER',
431+
channelType: 'primary',
432+
defaultTemplateId: 'template-1',
433+
conditionalTemplates: [
434+
{ templateId: 'template-2', accessibleFormat: 'q4' },
435+
],
436+
};
437+
438+
expect(buildCascadeGroupsForItem(cascadeItem)).toEqual([
439+
'standard',
440+
'accessible',
441+
]);
442+
});
443+
444+
it('should return standard and translations groups when language present', () => {
445+
const cascadeItem: CascadeItem = {
446+
cascadeGroups: ['standard'],
447+
channel: 'LETTER',
448+
channelType: 'primary',
449+
defaultTemplateId: 'template-1',
450+
conditionalTemplates: [{ templateId: 'template-2', language: 'fr' }],
451+
};
452+
453+
expect(buildCascadeGroupsForItem(cascadeItem)).toEqual([
454+
'standard',
455+
'translations',
456+
]);
457+
});
458+
459+
it('should return all groups when both accessible format and language present', () => {
460+
const cascadeItem: CascadeItem = {
461+
cascadeGroups: ['standard'],
462+
channel: 'LETTER',
463+
channelType: 'primary',
464+
defaultTemplateId: 'template-1',
465+
conditionalTemplates: [
466+
{ templateId: 'template-2', accessibleFormat: 'q4' },
467+
{ templateId: 'template-3', language: 'fr' },
468+
],
469+
};
470+
471+
expect(buildCascadeGroupsForItem(cascadeItem)).toEqual([
472+
'standard',
473+
'accessible',
474+
'translations',
475+
]);
476+
});
477+
478+
it('should return only standard group when conditional templates have missing templateIds', () => {
479+
const cascadeItem: CascadeItem = {
480+
cascadeGroups: ['standard'],
481+
channel: 'LETTER',
482+
channelType: 'primary',
483+
defaultTemplateId: 'template-1',
484+
conditionalTemplates: [
485+
{ templateId: null, accessibleFormat: 'q4' },
486+
{ templateId: 'template-2', language: 'fr' },
487+
],
488+
};
489+
490+
expect(buildCascadeGroupsForItem(cascadeItem)).toEqual([
491+
'standard',
492+
'translations',
493+
]);
494+
});
495+
496+
it('should return only standard when conditional templates array is empty', () => {
497+
const cascadeItem: CascadeItem = {
498+
cascadeGroups: ['standard'],
499+
channel: 'LETTER',
500+
channelType: 'primary',
501+
defaultTemplateId: 'template-1',
502+
conditionalTemplates: [],
503+
};
504+
505+
expect(buildCascadeGroupsForItem(cascadeItem)).toEqual(['standard']);
506+
});
507+
});
508+
380509
describe('getRemainingAccessibleFormats', () => {
381510
it('should collect all unique accessible format types', () => {
382511
const cascade: CascadeItem[] = [

frontend/src/utils/routing-utils.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
CascadeGroup,
3+
CascadeGroupName,
34
CascadeItem,
45
ConditionalTemplateAccessible,
56
ConditionalTemplateLanguage,
@@ -77,6 +78,36 @@ export function removeTemplatesFromConditionalTemplates(
7778
);
7879
}
7980

81+
/**
82+
* Determines which cascade groups should be present based on conditional templates
83+
*/
84+
export function buildCascadeGroupsForItem(
85+
cascadeItem: CascadeItem
86+
): CascadeGroupName[] {
87+
const groups: CascadeGroupName[] = ['standard'];
88+
89+
if (
90+
cascadeItem.conditionalTemplates &&
91+
cascadeItem.conditionalTemplates.length > 0
92+
) {
93+
const hasAccessibleFormat = cascadeItem.conditionalTemplates.some(
94+
(template) => 'accessibleFormat' in template && template.templateId
95+
);
96+
const hasLanguage = cascadeItem.conditionalTemplates.some(
97+
(template) => 'language' in template && template.templateId
98+
);
99+
100+
if (hasAccessibleFormat) {
101+
groups.push('accessible');
102+
}
103+
if (hasLanguage) {
104+
groups.push('translations');
105+
}
106+
}
107+
108+
return groups;
109+
}
110+
80111
/**
81112
* Removes templates from a cascade item by ID, updating both default and conditional templates
82113
*/
@@ -103,6 +134,9 @@ export function removeTemplatesFromCascadeItem(
103134
);
104135
}
105136

137+
updatedCascadeItem.cascadeGroups =
138+
buildCascadeGroupsForItem(updatedCascadeItem);
139+
106140
return updatedCascadeItem;
107141
}
108142

0 commit comments

Comments
 (0)