Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
@@ -1,11 +1,18 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { afterEach, beforeEach, describe, expect, it, vi, Mock } from 'vitest';
import ReviewDetailsAddMoreChoiceStage from './ReviewDetailsAddMoreChoiceStage';
import { afterEach, beforeEach, describe, expect, it, Mock, vi } from 'vitest';
import { runAxeTest } from '../../../../helpers/test/axeTestHelper';
import * as documentTypeModule from '../../../../helpers/utils/documentType';
import { ReviewDetails } from '../../../../types/generic/reviews';
import ReviewDetailsAddMoreChoiceStage from './ReviewDetailsAddMoreChoiceStage';
import { DOCUMENT_TYPE } from '../../../../helpers/utils/documentType';

const mockNavigate = vi.fn();
const mockReviewId = 'test-review-123';
const testData = {
yesText: 'Yes, I have more scanned paper notes to add for this patient',
noText: "No, I don't have anymore scanned paper notes to add for this patient",
};

vi.mock('react-router-dom', async (): Promise<unknown> => {
const actual = await vi.importActual('react-router-dom');
Expand All @@ -16,10 +23,23 @@ vi.mock('react-router-dom', async (): Promise<unknown> => {
};
});

describe('ReviewDetailsAddMoreChoicePage', () => {
describe('ReviewDetailsAddMoreChoiceStage', () => {
const mockReviewData = {
snomedCode: DOCUMENT_TYPE.LLOYD_GEORGE,
} as ReviewDetails;

beforeEach(() => {
vi.clearAllMocks();
import.meta.env.VITE_ENVIRONMENT = 'vitest';
const mockGetConfig = vi.spyOn(documentTypeModule, 'getConfigForDocType');
mockGetConfig.mockReturnValue({
...documentTypeModule.getConfigForDocType(DOCUMENT_TYPE.LLOYD_GEORGE),
multifileZipped: true,
content: {
addMoreFilesRadioNoText: testData.noText,
addMoreFilesRadioYesText: testData.yesText,
},
} as any);
});

afterEach(() => {
Expand All @@ -28,29 +48,29 @@ describe('ReviewDetailsAddMoreChoicePage', () => {

describe('Rendering', () => {
it('renders the page heading correctly', () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

expect(
screen.getByRole('heading', {
name: 'Do you want to add more files to this patients record?',
name: "Do you want to add more files to this patient's record?",
}),
).toBeInTheDocument();
});

it('renders back button with correct text', () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

expect(screen.getByText('Go back')).toBeInTheDocument();
});

it('renders both radio button options', () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const yesRadio = screen.getByRole('radio', {
name: /Yes I have more scanned paper records to add for this patient/i,
name: testData.yesText,
});
const noRadio = screen.getByRole('radio', {
name: /No, I don't have anymore scanned paper records to add for this patient/i,
name: testData.noText,
});

expect(yesRadio).toBeInTheDocument();
Expand All @@ -60,21 +80,21 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
});

it('renders continue button', () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

expect(screen.getByRole('button', { name: 'Continue' })).toBeInTheDocument();
});

it('does not show error message initially', () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

expect(screen.queryByText('Select an option')).not.toBeInTheDocument();
});
});

describe('Error Handling', () => {
it('displays error message when continue is clicked without selection', async () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const continueButton = screen.getByRole('button', { name: 'Continue' });
await userEvent.click(continueButton);
Expand All @@ -85,7 +105,7 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
});

it('does not navigate when no selection is made', async () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const continueButton = screen.getByRole('button', { name: 'Continue' });
await userEvent.click(continueButton);
Expand All @@ -97,7 +117,7 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
});

it('clears error message when yes radio button is selected', async () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const continueButton = screen.getByRole('button', { name: 'Continue' });
await userEvent.click(continueButton);
Expand All @@ -107,7 +127,7 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
});

const yesRadio = screen.getByRole('radio', {
name: /Yes I have more scanned paper records to add for this patient/i,
name: testData.yesText,
});
await userEvent.click(yesRadio);

Expand All @@ -117,7 +137,7 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
});

it('clears error message when no radio button is selected', async () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const continueButton = screen.getByRole('button', { name: 'Continue' });
await userEvent.click(continueButton);
Expand All @@ -127,7 +147,7 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
});

const noRadio = screen.getByRole('radio', {
name: /No, I don't have anymore scanned paper records to add for this patient/i,
name: testData.noText,
});
await userEvent.click(noRadio);

Expand All @@ -139,10 +159,10 @@ describe('ReviewDetailsAddMoreChoicePage', () => {

describe('User Interactions', () => {
it('allows selecting the yes radio button', async () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const yesRadio = screen.getByRole('radio', {
name: /Yes I have more scanned paper records to add for this patient/i,
name: testData.yesText,
});
await userEvent.click(yesRadio);

Expand All @@ -152,10 +172,10 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
});

it('allows selecting the no radio button', async () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const noRadio = screen.getByRole('radio', {
name: /No, I don't have anymore scanned paper records to add for this patient/i,
name: testData.noText,
});
await userEvent.click(noRadio);

Expand All @@ -165,13 +185,13 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
});

it('allows changing selection from yes to no', async () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const yesRadio = screen.getByRole('radio', {
name: /Yes I have more scanned paper records to add for this patient/i,
name: testData.yesText,
});
const noRadio = screen.getByRole('radio', {
name: /No, I don't have anymore scanned paper records to add for this patient/i,
name: testData.noText,
});

await userEvent.click(yesRadio);
Expand All @@ -187,7 +207,7 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
});

it('prevents default form submission', async () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const form = screen.getByRole('button', { name: 'Continue' }).closest('form');
const submitHandler = vi.fn((e: Event) => e.preventDefault());
Expand All @@ -202,10 +222,10 @@ describe('ReviewDetailsAddMoreChoicePage', () => {

describe('Navigation', () => {
it('navigates to add more files when yes is selected', async () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const yesRadio = screen.getByRole('radio', {
name: /Yes I have more scanned paper records to add for this patient/i,
name: testData.yesText,
});
await userEvent.click(yesRadio);

Expand All @@ -229,7 +249,7 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const noRadio = screen.getByRole('radio', {
name: /No, I don't have anymore scanned paper records to add for this patient/i,
name: testData.noText,
});
await userEvent.click(noRadio);

Expand All @@ -253,7 +273,7 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const noRadio = screen.getByRole('radio', {
name: /No, I don't have anymore scanned paper records to add for this patient/i,
name: testData.noText,
});
await userEvent.click(noRadio);

Expand All @@ -277,7 +297,7 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
render(<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />);

const noRadio = screen.getByRole('radio', {
name: /No, I don't have anymore scanned paper records to add for this patient/i,
name: testData.noText,
});
await userEvent.click(noRadio);

Expand All @@ -295,14 +315,18 @@ describe('ReviewDetailsAddMoreChoicePage', () => {

describe('Accessibility', () => {
it('passes axe accessibility tests in initial state', async () => {
const { container } = render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
const { container } = render(
<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />,
);

const results = await runAxeTest(container);
expect(results).toHaveNoViolations();
});

it('passes axe accessibility tests in error state', async () => {
const { container } = render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
const { container } = render(
<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />,
);

const continueButton = screen.getByRole('button', { name: 'Continue' });
await userEvent.click(continueButton);
Expand All @@ -316,10 +340,12 @@ describe('ReviewDetailsAddMoreChoicePage', () => {
});

it('passes axe accessibility tests with radio button selected', async () => {
const { container } = render(<ReviewDetailsAddMoreChoiceStage reviewData={null} />);
const { container } = render(
<ReviewDetailsAddMoreChoiceStage reviewData={mockReviewData} />,
);

const yesRadio = screen.getByRole('radio', {
name: /Yes I have more scanned paper records to add for this patient/i,
name: testData.yesText,
});
await userEvent.click(yesRadio);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { useNavigate, useParams } from 'react-router-dom';
import { navigateUrlParam, routeChildren } from '../../../../types/generic/routes';
import BackButton from '../../../generic/backButton/BackButton';
import { ReviewDetails } from '../../../../types/generic/reviews';
import { getConfigForDocType } from '../../../../helpers/utils/documentType';

type ReviewDetailsAddMoreChoicePageProps = {
reviewData: ReviewDetails | null;
Expand All @@ -19,6 +20,13 @@ const ReviewDetailsAddMoreChoiceStage: React.FC<ReviewDetailsAddMoreChoicePagePr
const [showError, setShowError] = useState(false);
const { reviewId } = useParams<{ reviewId: string }>();

if (!reviewData) {
navigate(routeChildren.ADMIN_REVIEW);
return <></>;
}

const reviewConfig = getConfigForDocType(reviewData?.snomedCode || '');

const handleContinue = (): void => {
if (!addMoreChoice || !reviewId) {
setShowError(true);
Expand All @@ -33,7 +41,7 @@ const ReviewDetailsAddMoreChoiceStage: React.FC<ReviewDetailsAddMoreChoicePagePr
);
} else {
navigateUrlParam(
reviewData!.files!.length > 1
reviewData.files!.length > 1
? routeChildren.ADMIN_REVIEW_UPLOAD_FILE_ORDER
: routeChildren.ADMIN_REVIEW_UPLOAD,
{ reviewId },
Expand All @@ -54,7 +62,7 @@ const ReviewDetailsAddMoreChoiceStage: React.FC<ReviewDetailsAddMoreChoicePagePr
>
<Fieldset>
<Fieldset.Legend isPageHeading>
Do you want to add more files to this patients record?
Do you want to add more files to this patient's record?
</Fieldset.Legend>
<Radios
name="add-more-choice"
Expand All @@ -72,7 +80,7 @@ const ReviewDetailsAddMoreChoiceStage: React.FC<ReviewDetailsAddMoreChoicePagePr
}
}}
>
Yes I have more scanned paper records to add for this patient
{reviewConfig.content.addMoreFilesRadioYesText}
</Radios.Radio>
<Radios.Radio
value="no"
Expand All @@ -85,8 +93,7 @@ const ReviewDetailsAddMoreChoiceStage: React.FC<ReviewDetailsAddMoreChoicePagePr
}
}}
>
No, I don&apos;t have anymore scanned paper records to add for this
patient
{reviewConfig.content.addMoreFilesRadioNoText}
</Radios.Radio>
</Radios>
</Fieldset>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const ExistingRecordTable = ({
return (
<section className="existing-files mb-4">
<h2>Existing files</h2>
<Table caption="Existing record files">
<Table>
<Table.Head>
<Table.Row>
<Table.Cell className="word-break-keep-all">Filename</Table.Cell>
Expand Down
Loading
Loading