Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
9c456c1
CCM-15562: Add campaignId check to update routing config
m-salaudeen Apr 8, 2026
60525e9
Merge remote-tracking branch 'origin' into feature/CCM-15562_matching…
m-salaudeen Apr 8, 2026
eaa5ae5
Filter message plan letter options by campaign
ClareJonesBJSS Apr 14, 2026
47cb407
CCM-15562: Get campaignId from routing config
m-salaudeen Apr 15, 2026
a5e8fcd
CCM-15562: Fix unit test issues
m-salaudeen Apr 16, 2026
bbfbafa
Merge branch 'main' into feature/CCM-16467_filter-templates-by-campaign
ClareJonesBJSS Apr 16, 2026
ff7dd30
Consolidate content
ClareJonesBJSS Apr 17, 2026
8a7b41e
lockfile
ClareJonesBJSS Apr 17, 2026
aead291
Acceptance test fixes
ClareJonesBJSS Apr 17, 2026
f3f3542
CCM-15562: Fix unit test issues
m-salaudeen Apr 17, 2026
4390489
Consolidate fetching
ClareJonesBJSS Apr 20, 2026
49de807
Package lock
ClareJonesBJSS Apr 20, 2026
e7e6ea5
c&p fix
ClareJonesBJSS Apr 20, 2026
a129454
Remove component static text tests and add no templates tests
ClareJonesBJSS Apr 21, 2026
3fe315f
CCM-15562: fix review comments
m-salaudeen Apr 21, 2026
66db30e
Package lock
ClareJonesBJSS Apr 21, 2026
dbf8281
CCM-15562: fix review comments and tests coverage
m-salaudeen Apr 21, 2026
bcee99b
Merge remote-tracking branch 'origin' into feature/CCM-15562_matching…
m-salaudeen Apr 21, 2026
211204f
Add letterVariantId
ClareJonesBJSS Apr 22, 2026
af4f1fd
Merge commit '450e23c11eb57b577959a97679c35aee4f2de5a0' into feature/…
ClareJonesBJSS Apr 22, 2026
87d1e57
Remove no template message assertions
ClareJonesBJSS Apr 22, 2026
c8c9a4b
CCM-15562: fix api tests
m-salaudeen Apr 22, 2026
976ae05
CCM-15562: new package lock
m-salaudeen Apr 22, 2026
3a7e837
CCM-15562: fix api tests
m-salaudeen Apr 22, 2026
6d2de12
CCM-15562: new package lock and test fix
m-salaudeen Apr 22, 2026
c9c71be
CCM-15562: new package lock
m-salaudeen Apr 22, 2026
1ffdc08
Merge commit '1fe95c063a1b5e69531125ae3e5ca08fa045e06b' into feature/…
ClareJonesBJSS Apr 22, 2026
4a5afe2
Revert package lock
ClareJonesBJSS Apr 23, 2026
52f57f3
Isolate no-template tests
ClareJonesBJSS Apr 23, 2026
89a700e
Merge commit '52f57f32864252c1dd5a2b332b3c701417370e75' into feature/…
ClareJonesBJSS Apr 23, 2026
89155ed
Acceptance test corrections & stray scope change
ClareJonesBJSS Apr 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ exports[`ChooseBritishSignLanguageLetterTemplate page renders British Sign Langu
class="nhsuk-hint nhsuk-u-reading-width"
data-testid="table-hint"
>
Choose one option
Choose one option. You can only choose templates linked to the same campaign as your message plan.
</div>
<div
class="nhsuk-form-group"
Expand Down Expand Up @@ -248,3 +248,86 @@ exports[`ChooseBritishSignLanguageLetterTemplate page renders British Sign Langu
</div>
</DocumentFragment>
`;

exports[`ChooseBritishSignLanguageLetterTemplate page renders the empty state message when there are no templates 1`] = `
<DocumentFragment>
<div
class="nhsuk-width-container"
>
<main
class="nhsuk-main-wrapper"
id="maincontent"
role="main"
>
<div
class="nhsuk-grid-row"
>
<div
class="nhsuk-grid-column-full"
>
<div
class="nhsuk-u-reading-width"
>
<span
class="nhsuk-caption-l"
>
Autumn Campaign Plan
</span>
<h1
class="nhsuk-heading-xl"
>
Choose a British Sign Language letter template
</h1>
</div>
<form
action="javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')"
>
<input
name="form-id"
readonly=""
type="hidden"
value="choose-channel-template"
/>
<input
name="csrf_token"
readonly=""
type="hidden"
value="no_token"
/>
<input
name="lockNumber"
readonly=""
type="hidden"
value="42"
/>
<p
data-testid="no-templates-message"
>
You do not have any British Sign Language letter templates linked to the campaign you chose for this message plan.
</p>
<div
class="nhsuk-form-group"
data-testid="channel-template-actions"
>
<a
class="nhsuk-u-font-size-19 nhsuk-body-m fit-content"
data-testid="go-to-templates-link"
href="/message-templates"
>
Go to templates
</a>
<a
class="nhsuk-u-font-size-19"
data-testid="back-link-bottom"
href="/message-plans/edit-message-plan/fbb81055-79b9-4759-ac07-d191ae57be34"
>
Go back
</a>
</div>
</form>
</div>
</div>
</main>
</div>
</DocumentFragment>
`;
Original file line number Diff line number Diff line change
Expand Up @@ -5,72 +5,16 @@ import { BSL_LETTER_TEMPLATE, ROUTING_CONFIG } from '@testhelpers/helpers';
import { render } from '@testing-library/react';
import { getTemplates } from '@utils/form-actions';
import { getRoutingConfig } from '@utils/message-plans';
import { redirect } from 'next/navigation';

jest.mock('@utils/message-plans');
jest.mock('@utils/form-actions');
jest.mock('next/navigation');

const getRoutingConfigMock = jest.mocked(getRoutingConfig);
const getTemplatesMock = jest.mocked(getTemplates);
const redirectMock = jest.mocked(redirect);

describe('ChooseBritishSignLanguageLetterTemplate page', () => {
it('should redirect to invalid page for invalid routing config id', async () => {
getRoutingConfigMock.mockResolvedValueOnce(undefined);
getTemplatesMock.mockResolvedValueOnce([BSL_LETTER_TEMPLATE]);

await ChooseBritishSignLanguageLetterTemplate({
params: Promise.resolve({
routingConfigId: 'invalid-id',
}),
searchParams: Promise.resolve({
lockNumber: '42',
}),
});

expect(getRoutingConfigMock).toHaveBeenCalledWith('invalid-id');
expect(getTemplatesMock).toHaveBeenCalledWith({
templateType: 'LETTER',
language: 'en',
letterType: 'q4',
templateStatus: ['SUBMITTED', 'PROOF_APPROVED'],
letterVersion: 'AUTHORING',
});

expect(redirectMock).toHaveBeenCalledWith(
'/message-plans/invalid',
'replace'
);
});

it('should redirect to invalid page if plan has no letter cascade entry', async () => {
getRoutingConfigMock.mockResolvedValueOnce({
...ROUTING_CONFIG,
cascade: ROUTING_CONFIG.cascade.filter(
(item) => item.channel !== 'LETTER'
),
});
getTemplatesMock.mockResolvedValueOnce([BSL_LETTER_TEMPLATE]);

await ChooseBritishSignLanguageLetterTemplate({
params: Promise.resolve({
routingConfigId: ROUTING_CONFIG.id,
}),
searchParams: Promise.resolve({
lockNumber: '42',
}),
});

expect(getRoutingConfigMock).toHaveBeenCalledWith(ROUTING_CONFIG.id);

expect(redirectMock).toHaveBeenCalledWith(
'/message-plans/invalid',
'replace'
);
});

it('fetches routing config and templates in parallel', async () => {
it('calls getTemplates with correct filters', async () => {
getRoutingConfigMock.mockResolvedValueOnce(ROUTING_CONFIG);
getTemplatesMock.mockResolvedValueOnce([BSL_LETTER_TEMPLATE]);

Expand All @@ -90,6 +34,7 @@ describe('ChooseBritishSignLanguageLetterTemplate page', () => {
letterType: 'q4',
templateStatus: ['SUBMITTED', 'PROOF_APPROVED'],
letterVersion: 'AUTHORING',
campaignId: ROUTING_CONFIG.campaignId,
});
});

Expand All @@ -115,6 +60,7 @@ describe('ChooseBritishSignLanguageLetterTemplate page', () => {
letterType: 'q4',
templateStatus: ['SUBMITTED', 'PROOF_APPROVED'],
letterVersion: 'AUTHORING',
campaignId: ROUTING_CONFIG.campaignId,
});

expect(await generateMetadata()).toEqual({
Expand All @@ -123,16 +69,21 @@ describe('ChooseBritishSignLanguageLetterTemplate page', () => {
expect(container.asFragment()).toMatchSnapshot();
});

it('redirects to the edit message plan page if the lockNumber is missing', async () => {
await ChooseBritishSignLanguageLetterTemplate({
it('renders the empty state message when there are no templates', async () => {
getRoutingConfigMock.mockResolvedValueOnce(ROUTING_CONFIG);
getTemplatesMock.mockResolvedValueOnce([]);

const page = await ChooseBritishSignLanguageLetterTemplate({
params: Promise.resolve({
routingConfigId: ROUTING_CONFIG.id,
}),
searchParams: Promise.resolve({
lockNumber: '42',
}),
});

expect(redirectMock).toHaveBeenCalledWith(
`/message-plans/edit-message-plan/${ROUTING_CONFIG.id}`,
'replace'
);
const container = render(page);

expect(container.asFragment()).toMatchSnapshot();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ exports[`PreviewBritishSignLanguageLetterTemplateFromMessagePlan page renders Br
/>
</div>
<div
class="nhsuk-summary-list__row missing-value"
class="nhsuk-summary-list__row"
id="campaign-id"
>
<dt
Expand All @@ -89,7 +89,9 @@ exports[`PreviewBritishSignLanguageLetterTemplateFromMessagePlan page renders Br
</dt>
<dd
class="nhsuk-summary-list__value"
/>
>
campaign-2
</dd>
<dd
aria-hidden="true"
class="nhsuk-summary-list__actions"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -268,3 +268,103 @@ exports[`ChooseEmailTemplate page renders Email template selection 1`] = `
</div>
</DocumentFragment>
`;

exports[`ChooseEmailTemplate page renders the empty state message when there are no templates 1`] = `
<DocumentFragment>
<div
class="nhsuk-width-container"
>
<main
class="nhsuk-main-wrapper"
id="maincontent"
role="main"
>
<div
class="nhsuk-grid-row"
>
<div
class="nhsuk-grid-column-full"
>
<div
class="nhsuk-u-reading-width"
>
<span
class="nhsuk-caption-l"
>
Autumn Campaign Plan
</span>
<h1
class="nhsuk-heading-xl"
>
Choose an email template
</h1>
</div>
<form
action="javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')"
>
<input
name="form-id"
readonly=""
type="hidden"
value="choose-channel-template"
/>
<input
name="csrf_token"
readonly=""
type="hidden"
value="no_token"
/>
<input
name="lockNumber"
readonly=""
type="hidden"
value="42"
/>
<dl
class="nhsuk-summary-list"
data-testid="previous-selection-details"
>
<div
class="nhsuk-summary-list__row"
>
<dt
class="nhsuk-summary-list__key"
>
Previously selected template
</dt>
<dd
class="nhsuk-summary-list__value"
/>
</div>
</dl>
<p
data-testid="no-templates-message"
>
You do not have any email templates yet.
</p>
<div
class="nhsuk-form-group"
data-testid="channel-template-actions"
>
<a
class="nhsuk-u-font-size-19 nhsuk-body-m fit-content"
data-testid="go-to-templates-link"
href="/message-templates"
>
Go to templates
</a>
<a
class="nhsuk-u-font-size-19"
data-testid="back-link-bottom"
href="/message-plans/edit-message-plan/fbb81055-79b9-4759-ac07-d191ae57be34"
>
Go back
</a>
</div>
</form>
</div>
</div>
</main>
</div>
</DocumentFragment>
`;
Loading
Loading