Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,28 @@ exports[`CreateMessagePlanPage on submit it invokes the server action and render
>
Choose which campaign this message plan will link to
</div>
<div
class="nhsuk-warning-callout nhsuk-u-margin-bottom-5 nhsuk-u-margin-top-5"
data-testid="campaign-warning-callout"
>
<h2
class="nhsuk-warning-callout__label"
>
<span
role="text"
>
<span
class="nhsuk-u-visually-hidden"
>
Important:
</span>
Important
</span>
</h2>
<p>
You cannot edit the campaign after you create a message plan. If you need to link to a different campaign later, create a new message plan.
</p>
</div>
<span
class="nhsuk-error-message"
id="campaignId--error-message"
Expand All @@ -181,14 +203,13 @@ exports[`CreateMessagePlanPage on submit it invokes the server action and render
</span>
<select
aria-describedby="campaignId--hint campaignId--error-message"
aria-labelledby="campaignId--label"
class="nhsuk-select nhsuk-select--error"
data-testid="campaign-id-field"
id="campaignId"
name="campaignId"
>
<option
selected=""
/>
<option />
<option
value="campaign-1"
>
Expand Down Expand Up @@ -359,16 +380,37 @@ exports[`CreateMessagePlanPage renders the page 1`] = `
>
Choose which campaign this message plan will link to
</div>
<div
class="nhsuk-warning-callout nhsuk-u-margin-bottom-5 nhsuk-u-margin-top-5"
data-testid="campaign-warning-callout"
>
<h2
class="nhsuk-warning-callout__label"
>
<span
role="text"
>
<span
class="nhsuk-u-visually-hidden"
>
Important:
</span>
Important
</span>
</h2>
<p>
You cannot edit the campaign after you create a message plan. If you need to link to a different campaign later, create a new message plan.
</p>
</div>
<select
aria-describedby="campaignId--hint"
aria-describedby="campaignId--hint campaignId--error-message"
aria-labelledby="campaignId--label"
class="nhsuk-select"
data-testid="campaign-id-field"
id="campaignId"
name="campaignId"
>
<option
selected=""
/>
<option />
<option
value="campaign-1"
>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,152 +6,160 @@ import { verifyFormCsrfToken } from '@utils/csrf-utils';

jest.mock('@providers/form-provider');
const mockAction = jest.fn();
jest.mocked(useNHSNotifyForm).mockReturnValue([{}, mockAction, false]);

jest.mock('@utils/csrf-utils');
jest.mocked(verifyFormCsrfToken).mockResolvedValue(true);

beforeEach(() => {
jest.clearAllMocks();
});
describe('Message plan form', () => {
beforeEach(() => {
jest.clearAllMocks();
jest.mocked(useNHSNotifyForm).mockReturnValue([{}, mockAction, false]);
});

test('renders form with single campaign id displayed', () => {
const container = render(
<MessagePlanForm
backLink={{
href: '/message-plans/choose-message-order',
text: 'Go back',
}}
campaignIds={['campaign-id']}
/>
);
expect(container.asFragment()).toMatchSnapshot();
});
test('renders form with single campaign id displayed', () => {
const container = render(
<MessagePlanForm
backLink={{
href: '/message-plans/choose-message-order',
text: 'Go back',
}}
campaignIds={['campaign-id']}
/>
);
const warningCallout = screen.queryByTestId('campaign-warning-callout');

expect(container.asFragment()).toMatchSnapshot();
expect(warningCallout).not.toBeInTheDocument();
});

test('renders form with select for multiple campaign ids', () => {
const container = render(
<MessagePlanForm
backLink={{
href: '/message-plans/choose-message-order',
text: 'Go back',
}}
campaignIds={['campaign-1', 'campaign-2']}
/>
);
expect(container.asFragment()).toMatchSnapshot();
});
test('renders form with select for multiple campaign ids', () => {
const container = render(
<MessagePlanForm
backLink={{
href: '/message-plans/choose-message-order',
text: 'Go back',
}}
campaignIds={['campaign-1', 'campaign-2']}
/>
);
const warningCallout = screen.queryByTestId('campaign-warning-callout');

expect(container.asFragment()).toMatchSnapshot();
expect(warningCallout).toBeInTheDocument();
});

test('renders form with children', () => {
const container = render(
<MessagePlanForm
backLink={{
href: '/message-plans/choose-message-order',
text: 'Go back',
}}
campaignIds={['campaign-id']}
>
<input type='hidden' name='messagePlanId' value='abc-123' />
</MessagePlanForm>
);
expect(container.asFragment()).toMatchSnapshot();
});
test('renders form with children', () => {
const container = render(
<MessagePlanForm
backLink={{
href: '/message-plans/choose-message-order',
text: 'Go back',
}}
campaignIds={['campaign-id']}
>
<input type='hidden' name='messagePlanId' value='abc-123' />
</MessagePlanForm>
);
expect(container.asFragment()).toMatchSnapshot();
});

test('renders errors', async () => {
jest.mocked(useNHSNotifyForm).mockReturnValueOnce([
{
errorState: {
fieldErrors: {
name: ['Name error'],
campaignId: ['CampaignId error'],
test('renders errors', async () => {
jest.mocked(useNHSNotifyForm).mockReturnValue([
{
errorState: {
fieldErrors: {
name: ['Name error'],
campaignId: ['CampaignId error'],
},
},
},
},
jest.fn(),
false,
]);

const container = render(
<MessagePlanForm
backLink={{
href: '/message-plans/choose-message-order',
text: 'Go back',
}}
campaignIds={['campaign-id', 'campaign-2']}
/>
);

expect(container.asFragment()).toMatchSnapshot();
});
jest.fn(),
false,
]);

const container = render(
<MessagePlanForm
backLink={{
href: '/message-plans/choose-message-order',
text: 'Go back',
}}
campaignIds={['campaign-id', 'campaign-2']}
/>
);

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

test('invokes the action with the form data when the form is submitted - single campaign id', async () => {
const user = userEvent.setup();
test('invokes the action with the form data when the form is submitted - single campaign id', async () => {
const user = userEvent.setup();

render(
<MessagePlanForm
backLink={{
href: '/message-plans/choose-message-order',
text: 'Go back',
}}
campaignIds={['campaign-id']}
>
<input type='hidden' name='messageOrder' value='NHSAPP' />
</MessagePlanForm>
);
render(
<MessagePlanForm
backLink={{
href: '/message-plans/choose-message-order',
text: 'Go back',
}}
campaignIds={['campaign-id']}
>
<input type='hidden' name='messageOrder' value='NHSAPP' />
</MessagePlanForm>
);

await user.click(screen.getByTestId('name-field'));
await user.click(screen.getByTestId('name-field'));

await user.keyboard('My Message Plan');
await user.keyboard('My Message Plan');

await user.click(screen.getByTestId('submit-button'));
await user.click(screen.getByTestId('submit-button'));

expect(mockAction).toHaveBeenCalledTimes(1);
expect(mockAction).toHaveBeenCalledTimes(1);

expect(mockAction).toHaveBeenLastCalledWith(expect.any(FormData));
expect(mockAction).toHaveBeenLastCalledWith(expect.any(FormData));

const formData = mockAction.mock.lastCall?.at(0) as FormData;
const formData = mockAction.mock.lastCall?.at(0) as FormData;

expect(Object.fromEntries(formData.entries())).toMatchObject({
campaignId: 'campaign-id',
messageOrder: 'NHSAPP',
name: 'My Message Plan',
expect(Object.fromEntries(formData.entries())).toMatchObject({
campaignId: 'campaign-id',
messageOrder: 'NHSAPP',
name: 'My Message Plan',
});
});
});

test('invokes the action with the form data when the form is submitted - multiple campaign id', async () => {
const user = userEvent.setup();
test('invokes the action with the form data when the form is submitted - multiple campaign id', async () => {
const user = userEvent.setup();

render(
<MessagePlanForm
backLink={{
href: '/message-plans/choose-message-order',
text: 'Go back',
}}
campaignIds={['campaign-id', 'campaign-id-2']}
>
<input type='hidden' name='messagePlanId' value='abc-123' />
</MessagePlanForm>
);
render(
<MessagePlanForm
backLink={{
href: '/message-plans/choose-message-order',
text: 'Go back',
}}
campaignIds={['campaign-id', 'campaign-id-2']}
>
<input type='hidden' name='messagePlanId' value='abc-123' />
</MessagePlanForm>
);

await user.click(screen.getByTestId('name-field'));
await user.click(screen.getByTestId('name-field'));

await user.keyboard('My Message Plan');
await user.keyboard('My Message Plan');

await user.selectOptions(
screen.getByTestId('campaign-id-field'),
'campaign-id-2'
);
await user.selectOptions(
screen.getByTestId('campaign-id-field'),
'campaign-id-2'
);

await user.click(screen.getByTestId('submit-button'));
await user.click(screen.getByTestId('submit-button'));

expect(mockAction).toHaveBeenCalledTimes(1);
expect(mockAction).toHaveBeenCalledTimes(1);

expect(mockAction).toHaveBeenLastCalledWith(expect.any(FormData));
expect(mockAction).toHaveBeenLastCalledWith(expect.any(FormData));

const formData = mockAction.mock.lastCall?.at(0) as FormData;
const formData = mockAction.mock.lastCall?.at(0) as FormData;

expect(Object.fromEntries(formData.entries())).toMatchObject({
campaignId: 'campaign-id-2',
messagePlanId: 'abc-123',
name: 'My Message Plan',
expect(Object.fromEntries(formData.entries())).toMatchObject({
campaignId: 'campaign-id-2',
messagePlanId: 'abc-123',
name: 'My Message Plan',
});
});
});
Loading
Loading