1+ import { describe , it , expect , vi , beforeEach , afterEach , Mocked } from 'vitest' ;
2+ import axios from 'axios' ;
3+ import { uploadDocumentForReview , getDocumentReviewStatus } from './documentReview' ;
4+ import { AuthHeaders } from '../../types/blocks/authHeaders' ;
5+ import { DOCUMENT_UPLOAD_STATE , UploadDocument } from '../../types/pages/UploadDocumentsPage/types' ;
6+ import { endpoints } from '../../types/generic/endpoints' ;
7+ import { DOCUMENT_TYPE } from '../utils/documentType' ;
8+
9+ vi . mock ( 'axios' ) ;
10+ const mockedAxios = axios as Mocked < typeof axios > ;
11+ ( mockedAxios . get as any ) = vi . fn ( ) ;
12+
13+ describe ( 'documentReview' , ( ) => {
14+ const mockAuthHeaders : AuthHeaders = {
15+ authorization : 'Bearer token' ,
16+ "Content-Type" : 'string' ,
17+ } ;
18+
19+ const mockDocument : UploadDocument = {
20+ id : 'doc-123' ,
21+ versionId : 'v1' ,
22+ docType : DOCUMENT_TYPE . LLOYD_GEORGE ,
23+ file : { name : 'test-document.pdf' } as File ,
24+ state : DOCUMENT_UPLOAD_STATE . UPLOADING ,
25+ attempts : 0 ,
26+ } ;
27+
28+ const mockArgs = {
29+ document : mockDocument ,
30+ nhsNumber : '1234567890' ,
31+ baseUrl : 'https://api.example.com' ,
32+ baseHeaders : mockAuthHeaders ,
33+ } ;
34+
35+ beforeEach ( ( ) => {
36+ vi . clearAllMocks ( ) ;
37+ } ) ;
38+
39+ afterEach ( ( ) => {
40+ vi . restoreAllMocks ( ) ;
41+ } ) ;
42+
43+ describe ( 'uploadDocumentForReview' , ( ) => {
44+ it ( 'should successfully upload document for review' , async ( ) => {
45+ const mockResponse = { data : { reviewId : 'review-123' , status : 'pending' } } ;
46+ mockedAxios . post . mockResolvedValue ( mockResponse ) ;
47+
48+ const result = await uploadDocumentForReview ( mockArgs ) ;
49+
50+ expect ( mockedAxios . post ) . toHaveBeenCalledWith (
51+ `${ mockArgs . baseUrl } ${ endpoints . DOCUMENT_REVIEW } ` ,
52+ JSON . stringify ( {
53+ nhsNumber : mockArgs . nhsNumber ,
54+ snomedCode : mockArgs . document . docType ,
55+ documents : [ mockArgs . document . file . name ] ,
56+ } ) ,
57+ {
58+ headers : mockAuthHeaders ,
59+ params : {
60+ patientId : mockArgs . nhsNumber ,
61+ } ,
62+ }
63+ ) ;
64+ expect ( result ) . toEqual ( mockResponse . data ) ;
65+ } ) ;
66+
67+ it ( 'should throw error when request fails' , async ( ) => {
68+ const mockError = new Error ( 'Network error' ) ;
69+ mockedAxios . post . mockRejectedValue ( mockError ) ;
70+
71+ await expect ( uploadDocumentForReview ( mockArgs ) ) . rejects . toThrow ( 'Network error' ) ;
72+ } ) ;
73+ } ) ;
74+
75+ describe ( 'getDocumentReviewStatus' , ( ) => {
76+ it ( 'should successfully get document review status' , async ( ) => {
77+ const mockResponse = { data : { status : 'completed' , result : 'approved' } } ;
78+ mockedAxios . get . mockResolvedValue ( mockResponse ) ;
79+
80+ const result = await getDocumentReviewStatus ( mockArgs ) ;
81+
82+ expect ( mockedAxios . get ) . toHaveBeenCalledWith (
83+ `${ mockArgs . baseUrl } ${ endpoints . DOCUMENT_REVIEW } /${ mockArgs . document . id } /${ mockArgs . document . versionId } /Status` ,
84+ {
85+ headers : mockAuthHeaders ,
86+ params : {
87+ patientId : mockArgs . nhsNumber ,
88+ } ,
89+ }
90+ ) ;
91+ expect ( result ) . toEqual ( mockResponse . data ) ;
92+ } ) ;
93+
94+ it ( 'should throw error when status request fails' , async ( ) => {
95+ const mockError = new Error ( 'Status fetch failed' ) ;
96+ mockedAxios . get . mockRejectedValue ( mockError ) ;
97+
98+ await expect ( getDocumentReviewStatus ( mockArgs ) ) . rejects . toThrow ( 'Status fetch failed' ) ;
99+ } ) ;
100+ } ) ;
101+ } ) ;
0 commit comments