Skip to content
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
68f1074
CCM-11474: initial message plan create form
harrim91 Oct 6, 2025
46607cd
CCM-11474: multiple campaigns, update to use context in other places
harrim91 Oct 7, 2025
4514cb4
Merge branch 'main' into feature/CCM-11474_message-plan-name-screen
harrim91 Oct 8, 2025
024d8b0
Merge branch 'main' into feature/CCM-11474_message-plan-name-screen
harrim91 Oct 8, 2025
f68d3ad
Merge branch 'main' into feature/CCM-11474_message-plan-name-screen
harrim91 Oct 9, 2025
ee911bc
CCM-11474: require campaign id; refactoring
harrim91 Oct 10, 2025
57f823c
Merge branch 'main' into feature/CCM-11474_message-plan-name-screen
harrim91 Oct 10, 2025
ad7201a
CCM-11474: playwright
harrim91 Oct 10, 2025
ca7d677
CCM-11474: review feedback
harrim91 Oct 10, 2025
b3eba93
CCM-11474: missing playwright tests
harrim91 Oct 13, 2025
57f7daa
CCM-11474: lockfile
harrim91 Oct 13, 2025
0152577
CCM-11474: feedback
harrim91 Oct 13, 2025
be63172
Merge branch 'main' into feature/CCM-11474_message-plan-name-screen
harrim91 Oct 13, 2025
8e80410
CCM-11474: allow nullable default template id
harrim91 Oct 13, 2025
73709bc
CCM-11474: null tests
harrim91 Oct 14, 2025
48d22e9
Merge branch 'main' into feature/CCM-11474_message-plan-name-screen
harrim91 Oct 14, 2025
80a16c6
CCM-11474: spacing
harrim91 Oct 14, 2025
3322d94
Merge branch 'main' into feature/CCM-11474_message-plan-name-screen
harrim91 Oct 14, 2025
fdd4b77
CCM-11474: error display feedback
harrim91 Oct 15, 2025
82e120e
CCM-11474: lockfile
harrim91 Oct 15, 2025
b5519bc
Merge branch 'main' into feature/CCM-11474_message-plan-name-screen
harrim91 Oct 16, 2025
780af03
CCM-11474: fix tests
harrim91 Oct 16, 2025
333954f
CCM-11474: pr feedback
harrim91 Oct 16, 2025
4621423
Merge branch 'main' into feature/CCM-11474_message-plan-name-screen
harrim91 Oct 16, 2025
7be9e3d
CCM-11474: coverage
harrim91 Oct 16, 2025
a7572e1
Merge branch 'main' into feature/CCM-11474_message-plan-name-screen
harrim91 Oct 17, 2025
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 @@ -9,7 +9,11 @@ import EditNhsAppTemplatePage, {
generateMetadata,
} from '@app/edit-nhs-app-template/[templateId]/page';
import { TemplateDto } from 'nhs-notify-backend-client';
import { EMAIL_TEMPLATE, LETTER_TEMPLATE, SMS_TEMPLATE } from '../../helpers';
import {
EMAIL_TEMPLATE,
LETTER_TEMPLATE,
SMS_TEMPLATE,
} from '@testhelpers/helpers';
import content from '@content/content';

const { editPageTitle } = content.components.templateFormNhsApp;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import LetterTemplateSubmittedPage, {
} from '@app/letter-template-submitted/[templateId]/page';
import content from '@content/content';
import { TemplateSubmitted } from '@molecules/TemplateSubmitted/TemplateSubmitted';
import { LETTER_TEMPLATE } from '@testhelpers';
import { LETTER_TEMPLATE } from '@testhelpers/helpers';
import { getTemplate } from '@utils/form-actions';
import { redirect } from 'next/navigation';

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`matches snapshot 1`] = `
<DocumentFragment>
<main
class="nhsuk-main-wrapper"
id="maincontent"
role="main"
>
<div
class="nhsuk-grid-row"
data-testid="page-content-wrapper"
>
<div
class="nhsuk-grid-column-two-thirds"
>
<h1
class="nhsuk-heading-xl"
data-testid="page-heading"
>
You cannot create message plans yet
</h1>
<p>
To get access, contact your onboarding manager and give them this error message:
</p>
<div
class="nhsuk-inset-text"
>
<p>
Account needs a campaign ID
</p>
</div>
<p>
<a
data-testid="back-link"
href="/message-plans"
>
Go back
</a>
</p>
</div>
</div>
</main>
</DocumentFragment>
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { render } from '@testing-library/react';
import MessagePlanCampaignIdRequiredPage from '@app/message-plans/campaign-id-required/page';

test('matches snapshot', () => {
const container = render(MessagePlanCampaignIdRequiredPage());

expect(container.asFragment()).toMatchSnapshot();
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`CreateMessagePlanPage renders the page when messageOrder is "LETTER" 1`] = `
<DocumentFragment>
<main
class="nhsuk-main-wrapper"
id="maincontent"
role="main"
>
<div
class="nhsuk-grid-row"
>
<div
class="nhsuk-grid-column-two-thirds"
>
<h1
class="nhsuk-heading-xl"
>
Create a message plan
</h1>
<div
data-testid="mocked-message-plan-form"
/>
</div>
</div>
</main>
</DocumentFragment>
`;

exports[`CreateMessagePlanPage renders the page when messageOrder is "NHSAPP" 1`] = `
<DocumentFragment>
<main
class="nhsuk-main-wrapper"
id="maincontent"
role="main"
>
<div
class="nhsuk-grid-row"
>
<div
class="nhsuk-grid-column-two-thirds"
>
<h1
class="nhsuk-heading-xl"
>
Create a message plan
</h1>
<div
data-testid="mocked-message-plan-form"
/>
</div>
</div>
</main>
</DocumentFragment>
`;

exports[`CreateMessagePlanPage renders the page when messageOrder is "NHSAPP,EMAIL" 1`] = `
<DocumentFragment>
<main
class="nhsuk-main-wrapper"
id="maincontent"
role="main"
>
<div
class="nhsuk-grid-row"
>
<div
class="nhsuk-grid-column-two-thirds"
>
<h1
class="nhsuk-heading-xl"
>
Create a message plan
</h1>
<div
data-testid="mocked-message-plan-form"
/>
</div>
</div>
</main>
</DocumentFragment>
`;

exports[`CreateMessagePlanPage renders the page when messageOrder is "NHSAPP,EMAIL,SMS" 1`] = `
<DocumentFragment>
<main
class="nhsuk-main-wrapper"
id="maincontent"
role="main"
>
<div
class="nhsuk-grid-row"
>
<div
class="nhsuk-grid-column-two-thirds"
>
<h1
class="nhsuk-heading-xl"
>
Create a message plan
</h1>
<div
data-testid="mocked-message-plan-form"
/>
</div>
</div>
</main>
</DocumentFragment>
`;

exports[`CreateMessagePlanPage renders the page when messageOrder is "NHSAPP,EMAIL,SMS,LETTER" 1`] = `
<DocumentFragment>
<main
class="nhsuk-main-wrapper"
id="maincontent"
role="main"
>
<div
class="nhsuk-grid-row"
>
<div
class="nhsuk-grid-column-two-thirds"
>
<h1
class="nhsuk-heading-xl"
>
Create a message plan
</h1>
<div
data-testid="mocked-message-plan-form"
/>
</div>
</div>
</main>
</DocumentFragment>
`;

exports[`CreateMessagePlanPage renders the page when messageOrder is "NHSAPP,SMS" 1`] = `
<DocumentFragment>
<main
class="nhsuk-main-wrapper"
id="maincontent"
role="main"
>
<div
class="nhsuk-grid-row"
>
<div
class="nhsuk-grid-column-two-thirds"
>
<h1
class="nhsuk-heading-xl"
>
Create a message plan
</h1>
<div
data-testid="mocked-message-plan-form"
/>
</div>
</div>
</main>
</DocumentFragment>
`;

exports[`CreateMessagePlanPage renders the page when messageOrder is "NHSAPP,SMS,EMAIL" 1`] = `
<DocumentFragment>
<main
class="nhsuk-main-wrapper"
id="maincontent"
role="main"
>
<div
class="nhsuk-grid-row"
>
<div
class="nhsuk-grid-column-two-thirds"
>
<h1
class="nhsuk-heading-xl"
>
Create a message plan
</h1>
<div
data-testid="mocked-message-plan-form"
/>
</div>
</div>
</main>
</DocumentFragment>
`;

exports[`CreateMessagePlanPage renders the page when messageOrder is "NHSAPP,SMS,LETTER" 1`] = `
<DocumentFragment>
<main
class="nhsuk-main-wrapper"
id="maincontent"
role="main"
>
<div
class="nhsuk-grid-row"
>
<div
class="nhsuk-grid-column-two-thirds"
>
<h1
class="nhsuk-heading-xl"
>
Create a message plan
</h1>
<div
data-testid="mocked-message-plan-form"
/>
</div>
</div>
</main>
</DocumentFragment>
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import { render } from '@testing-library/react';
import { redirect, RedirectType } from 'next/navigation';
import { MESSAGE_ORDER_OPTIONS_LIST } from 'nhs-notify-web-template-management-utils';
import CreateMessagePlanPage from '@app/message-plans/create-message-plan/page';
import { MessagePlanForm } from '@forms/MessagePlan/MessagePlan';
import { fetchClient } from '@utils/server-features';
import { NextRedirectError } from '@testhelpers/next-redirect';

jest.mock('next/navigation');
jest.mock('@forms/MessagePlan/MessagePlan');
jest.mock('@utils/server-features');

beforeEach(() => {
jest.resetAllMocks();

jest.mocked(redirect).mockImplementation((url, type) => {
throw new NextRedirectError(url, type);
});

jest
.mocked(MessagePlanForm)
.mockImplementation(() => <div data-testid='mocked-message-plan-form' />);

jest
.mocked(fetchClient)
.mockResolvedValue({ campaignIds: ['campaign-1'], features: {} });
});

describe('CreateMessagePlanPage', () => {
test('redirects when there are no campaignIds', async () => {
jest.mocked(fetchClient).mockResolvedValueOnce({ features: {} });

await expect(
CreateMessagePlanPage({ searchParams: Promise.resolve({}) })
).rejects.toMatchObject({
message: 'NEXT_REDIRECT',
url: '/message-plans/campaign-id-required',
type: RedirectType.replace,
});
});

test('redirects when searchParams are missing', async () => {
await expect(
CreateMessagePlanPage({ searchParams: Promise.resolve({}) })
).rejects.toMatchObject({
message: 'NEXT_REDIRECT',
url: '/message-plans/choose-message-order',
type: RedirectType.replace,
});
});

test('redirects when messageOrder is invalid', async () => {
await expect(
CreateMessagePlanPage({
searchParams: Promise.resolve({ messageOrder: 'invalid' }),
})
).rejects.toMatchObject({
message: 'NEXT_REDIRECT',
url: '/message-plans/choose-message-order',
type: RedirectType.replace,
});
});

test.each(MESSAGE_ORDER_OPTIONS_LIST)(
'renders the page when messageOrder is "%s"',
async (messageOrder) => {
const ui = await CreateMessagePlanPage({
searchParams: Promise.resolve({ messageOrder }),
});

const container = render(ui);

expect(container.asFragment()).toMatchSnapshot();

expect(jest.mocked(MessagePlanForm).mock.calls[0][0]).toEqual({
messageOrder,
campaignIds: ['campaign-1'],
});
}
);
});
Loading
Loading