diff --git a/app/cypress/e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js b/app/cypress/e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js index b561a64d2d..cf8265fa1f 100644 --- a/app/cypress/e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js +++ b/app/cypress/e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js @@ -33,7 +33,7 @@ describe('GP Workflow: Download Lloyd George summary report', () => { cy.wait('@downloadReportFinished', { timeout: 20000 }); - cy.url().should('contain', Cypress.config('baseUrl') + `${routes.createReportComplete}?reportType=0`); + cy.url().should('contain', Cypress.config('baseUrl') + `${routes.createReportComplete}?reportType=PATIENT`); }, ); }); diff --git a/app/cypress/e2e/1-ndr-smoke-tests/gp_user_workflows/download_lloyd_george_summary_report_workflow.cy.js b/app/cypress/e2e/1-ndr-smoke-tests/gp_user_workflows/download_lloyd_george_summary_report_workflow.cy.js index f1a629025b..f49ce8be79 100644 --- a/app/cypress/e2e/1-ndr-smoke-tests/gp_user_workflows/download_lloyd_george_summary_report_workflow.cy.js +++ b/app/cypress/e2e/1-ndr-smoke-tests/gp_user_workflows/download_lloyd_george_summary_report_workflow.cy.js @@ -33,7 +33,7 @@ describe('GP Workflow: Download Lloyd George summary report', () => { cy.url().should( 'contain', - Cypress.config('baseUrl') + `${routes.createReportComplete}?reportType=0`, + Cypress.config('baseUrl') + `${routes.createReportComplete}?reportType=PATIENT`, ); cy.getByTestId('logout-btn').click(); diff --git a/app/cypress/support/e2e.ts b/app/cypress/support/e2e.ts index 3c60cc17d5..ffc2fec768 100644 --- a/app/cypress/support/e2e.ts +++ b/app/cypress/support/e2e.ts @@ -122,7 +122,7 @@ Cypress.Commands.add('navigateToDownloadReportPage', () => { cy.getByTestId('download-report-btn').should('exist'); cy.getByTestId('download-report-btn').click(); - cy.url().should('contain', baseUrl + `${routes.createReport}?reportType=0`); + cy.url().should('contain', baseUrl + `${routes.createReport}?reportType=PATIENT`); }); declare global { diff --git a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx index f58788025e..8b79f86385 100644 --- a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx +++ b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx @@ -732,4 +732,18 @@ describe('ReviewsPage', () => { }); }); }); + + describe('Report Download Link', () => { + it('renders download report link with correct href', async () => { + renderComponent(); + + await waitFor(() => { + expect(screen.getByText('900 000 0001')).toBeInTheDocument(); + }); + + const downloadLink = screen.getByText('Download a report on this data'); + expect(downloadLink).toBeInTheDocument(); + expect(downloadLink).toHaveAttribute('href', '/create-report?reportType=REVIEW'); + }); + }); }); diff --git a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx index 8936d3cef3..a037f99f9a 100644 --- a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx +++ b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx @@ -19,6 +19,7 @@ import BackButton from '../../../generic/backButton/BackButton'; import { Pagination } from '../../../generic/paginationV2/Pagination'; import SpinnerButton from '../../../generic/spinnerButton/SpinnerButton'; import SpinnerV2 from '../../../generic/spinnerV2/SpinnerV2'; +import { REPORT_TYPE } from '../../../../types/generic/reports'; import { AxiosError } from 'axios'; import { errorToParams } from '../../../../helpers/utils/errorToParams'; @@ -292,6 +293,13 @@ export const ReviewsPage = ({ setReviewData }: ReviewsPageProps): React.JSX.Elem

+
+ + Download a report on this data + +
{/* Search box */}
; const mockUseConfig = vi.fn(); - const mockedUseNavigate = vi.fn(); vi.mock('react-router-dom', async () => { const actual = await vi.importActual('react-router-dom'); @@ -46,7 +45,7 @@ describe('DownloadReportSelectStage', () => { const report = getReportByType(REPORT_TYPE.ODS_PATIENT_SUMMARY); render(); - expect(screen.getByTestId('return-to-home-button')).toBeInTheDocument(); + expect(screen.getByTestId('go-back-button')).toBeInTheDocument(); const title = screen.getByTestId('title'); expect(title).toBeInTheDocument(); expect(title.innerHTML).toContain(report!.title); @@ -56,7 +55,7 @@ describe('DownloadReportSelectStage', () => { ).toBeInTheDocument(); }); expect(screen.queryByTestId('error-notification-banner')).not.toBeInTheDocument(); - expect(screen.getByText('Go to home')).toBeInTheDocument(); + expect(screen.getByText('Go back')).toBeInTheDocument(); }); it('should render error notification when download fails', async () => { @@ -107,33 +106,16 @@ describe('DownloadReportSelectStage', () => { }); }); - it('should navigate to home when clicking go to home link', async () => { + it('should navigate to back when clicking go back link', async () => { const report = getReportByType(REPORT_TYPE.ODS_PATIENT_SUMMARY); render(); - - await userEvent.click(screen.getByText('Go to home')); - await waitFor(() => { - expect(mockedUseNavigate).toHaveBeenCalledWith(routes.HOME); - }); - }); - - it ('should navigate to admin hub, upload version 3 enabled', async () => { - mockUseConfig.mockReturnValue({ - featureFlags: { uploadDocumentIteration3Enabled: true }, - }); - - const report = getReportByType(REPORT_TYPE.ODS_PATIENT_SUMMARY); - render(); - let backLink: Element; - backLink = screen.getByTestId('return-to-home-button'); - + backLink = screen.getByTestId('go-back-button'); expect(backLink).toHaveTextContent('Go back'); await userEvent.click(backLink); - await waitFor(() => { - expect(mockedUseNavigate).toHaveBeenCalledWith(routes.ADMIN_ROUTE); - }) + expect(mockedUseNavigate).toHaveBeenCalledWith(-1); + }); }); }); diff --git a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx index cf83dd887d..8ea05a92f6 100644 --- a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx +++ b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx @@ -1,17 +1,17 @@ import { useNavigate } from 'react-router-dom'; import { FileTypeData, ReportData } from '../../../../types/generic/reports'; import { routeChildren, routes } from '../../../../types/generic/routes'; -import { BackLink, Button } from 'nhsuk-react-components'; +import { Button } from 'nhsuk-react-components'; import downloadReport from '../../../../helpers/requests/downloadReport'; import useBaseAPIUrl from '../../../../helpers/hooks/useBaseAPIUrl'; import useBaseAPIHeaders from '../../../../helpers/hooks/useBaseAPIHeaders'; -import useConfig from '../../../../helpers/hooks/useConfig'; import { AxiosError } from 'axios'; import { isMock } from '../../../../helpers/utils/isLocal'; import { JSX, ReactNode, useRef } from 'react'; import NotificationBanner from '../../../layout/notificationBanner/NotificationBanner'; import SpinnerButton from '../../../generic/spinnerButton/SpinnerButton'; import React from 'react'; +import BackButton from '../../../generic/backButton/BackButton'; type Props = { report: ReportData; @@ -20,7 +20,6 @@ type Props = { const DownloadReportSelectStage = (props: Props): JSX.Element => { const baseUrl = useBaseAPIUrl(); const baseHeaders = useBaseAPIHeaders(); - const config = useConfig(); const navigate = useNavigate(); const [downloading, setDownloading] = React.useState(false); const [downloadError, setDownloadError] = React.useState(null); @@ -30,7 +29,6 @@ const DownloadReportSelectStage = (props: Props): JSX.Element => { navigate(`${routeChildren.REPORT_DOWNLOAD_COMPLETE}?reportType=${props.report.reportType}`); }; - const uploadV3Enabled: boolean = !!config.featureFlags.uploadDocumentIteration3Enabled; const noDataContent = (): JSX.Element => { return ( <> @@ -88,7 +86,12 @@ const DownloadReportSelectStage = (props: Props): JSX.Element => { setDownloading(true); try { - await downloadReport({ report: props.report, fileType, baseUrl, baseHeaders }); + await downloadReport({ + report: props.report, + fileType, + baseUrl, + baseHeaders, + }); handleSuccess(); } catch (e) { const error = e as AxiosError; @@ -129,17 +132,7 @@ const DownloadReportSelectStage = (props: Props): JSX.Element => { return ( <> - { - uploadV3Enabled ? navigate(routes.ADMIN_ROUTE) : navigate(routes.HOME); - }} - className="mb-5" - > - {uploadV3Enabled ? 'Go back' : 'Go to home'} - + {downloadError && ( { + return ( + <> +

This report contains:

+
    +
  • + the details of pending document records stored within this service for your + organisation +
  • +
+ + ); +}; + +export default ReviewSummaryDescription; diff --git a/app/src/helpers/requests/downloadReport.test.ts b/app/src/helpers/requests/downloadReport.test.ts index 0001848c52..9e45730eff 100644 --- a/app/src/helpers/requests/downloadReport.test.ts +++ b/app/src/helpers/requests/downloadReport.test.ts @@ -1,8 +1,8 @@ import axios, { AxiosError } from 'axios'; import downloadReport from './downloadReport'; -import { ReportData } from '../../types/generic/reports'; +import { REPORT_TYPE, ReportData } from '../../types/generic/reports'; import { AuthHeaders } from '../../types/blocks/authHeaders'; -import { describe, expect, it, vi, Mocked, beforeEach, afterEach, Mock } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, Mock, Mocked, vi } from 'vitest'; import { Procedure } from '@vitest/spy'; vi.mock('axios'); @@ -12,6 +12,7 @@ const mockedAxios = axios as Mocked; describe('downloadReport', () => { const report = { endpoint: '/download', + reportType: REPORT_TYPE.ODS_REVIEW_SUMMARY, } as ReportData; let clickSpy: Mock; @@ -55,7 +56,7 @@ describe('downloadReport', () => { expect(getSpy).toHaveBeenCalledWith(args.baseUrl + report.endpoint, { headers: args.baseHeaders, - params: { outputFileFormat: args.fileType, odsReportType: 'PATIENT' }, + params: { outputFileFormat: args.fileType, odsReportType: 'REVIEW' }, }); expect(mockAnchor.setAttribute).toHaveBeenCalledWith('download', ''); @@ -90,7 +91,7 @@ describe('downloadReport', () => { expect(errorCode).toBe(404); expect(getSpy).toHaveBeenCalledWith(args.baseUrl + report.endpoint, { headers: args.baseHeaders, - params: { outputFileFormat: args.fileType, odsReportType: 'PATIENT' }, + params: { outputFileFormat: args.fileType, odsReportType: 'REVIEW' }, }); }); }); diff --git a/app/src/helpers/requests/downloadReport.ts b/app/src/helpers/requests/downloadReport.ts index 25a213e431..32c1d3b5f0 100644 --- a/app/src/helpers/requests/downloadReport.ts +++ b/app/src/helpers/requests/downloadReport.ts @@ -12,7 +12,6 @@ type Args = { type DownloadReportResponseData = { data: { url: string }; }; - const downloadReport = async ({ report, fileType, baseUrl, baseHeaders }: Args): Promise => { const gatewayUrl = baseUrl + report.endpoint; @@ -23,7 +22,7 @@ const downloadReport = async ({ report, fileType, baseUrl, baseHeaders }: Args): }, params: { outputFileFormat: fileType, - odsReportType: 'PATIENT', + odsReportType: report.reportType, }, }); diff --git a/app/src/pages/adminPage/AdminPage.test.tsx b/app/src/pages/adminPage/AdminPage.test.tsx index d0654e26db..3074033dd4 100644 --- a/app/src/pages/adminPage/AdminPage.test.tsx +++ b/app/src/pages/adminPage/AdminPage.test.tsx @@ -55,7 +55,7 @@ describe('AdminPage', (): void => { it('renders the Download a report card with correct href', (): void => { render(); const reportLink = screen.getByTestId('download-report-btn'); - expect(reportLink).toHaveAttribute('href', '/create-report?reportType=0'); + expect(reportLink).toHaveAttribute('href', '/create-report?reportType=PATIENT'); }); it('renders the Download a report card description', (): void => { diff --git a/app/src/pages/homePage/HomePage.tsx b/app/src/pages/homePage/HomePage.tsx index d24a8cb0cc..02252a3934 100644 --- a/app/src/pages/homePage/HomePage.tsx +++ b/app/src/pages/homePage/HomePage.tsx @@ -93,7 +93,8 @@ const HomePage = (): React.JSX.Element => { { + onClick={(e): void => { + e.preventDefault() navigate( `${routes.REPORT_DOWNLOAD}?reportType=${REPORT_TYPE.ODS_PATIENT_SUMMARY}`, ); diff --git a/app/src/types/generic/reports.ts b/app/src/types/generic/reports.ts index 69fec15640..90846dda7e 100644 --- a/app/src/types/generic/reports.ts +++ b/app/src/types/generic/reports.ts @@ -1,8 +1,10 @@ import LloydGeorgeSummaryDescription from '../../components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/LloydGeorgeSummaryDescription'; import { endpoints } from './endpoints'; +import ReviewSummaryDescription from '../../components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/ReviewSummaryDescription'; export enum REPORT_TYPE { - ODS_PATIENT_SUMMARY = '0', + ODS_PATIENT_SUMMARY = 'PATIENT', + ODS_REVIEW_SUMMARY = 'REVIEW', } export type FileTypeData = { @@ -34,4 +36,11 @@ export const reports: ReportData[] = [ reportType: REPORT_TYPE.ODS_PATIENT_SUMMARY, endpoint: endpoints.ODS_REPORT, }, + { + title: 'Documents review summary report', + description: ReviewSummaryDescription, + fileTypes: [{ extension: 'csv', label: 'a CSV' }], + reportType: REPORT_TYPE.ODS_REVIEW_SUMMARY, + endpoint: endpoints.ODS_REPORT, + }, ]; diff --git a/lambdas/services/ods_report_service.py b/lambdas/services/ods_report_service.py index 71aac847dc..e892b09004 100644 --- a/lambdas/services/ods_report_service.py +++ b/lambdas/services/ods_report_service.py @@ -64,7 +64,7 @@ def get_documents_for_review( if output_file_type != FileType.CSV: raise OdsReportException(400, LambdaError.UnsupportedFileType) - query_filter = self.document_upload_review_service.build_review_query_filter() + query_filter = self.document_upload_review_service.build_review_dynamo_filter() results = self.document_upload_review_service.fetch_documents_from_table( search_key="Custodian", diff --git a/lambdas/tests/unit/services/test_ods_report_service.py b/lambdas/tests/unit/services/test_ods_report_service.py index c959db8ff0..2740f83278 100644 --- a/lambdas/tests/unit/services/test_ods_report_service.py +++ b/lambdas/tests/unit/services/test_ods_report_service.py @@ -421,7 +421,7 @@ def test_get_documents_for_review( mocker.patch.object( ods_report_service.document_upload_review_service, - "build_review_query_filter", + "build_review_dynamo_filter", return_value=expected_query_filter, )