From 158aa46f9a0bf6703cb4f532a541a5d386e579d4 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 11 Feb 2026 22:08:31 -0800 Subject: [PATCH] Frontend coverage, at least --- .../pdf-viewer/pdf-viewer.component.spec.ts | 19 ++++++++++++ .../document-detail.component.spec.ts | 29 +++++++++++++++++++ .../services/rest/document.service.spec.ts | 8 +++++ 3 files changed, 56 insertions(+) diff --git a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.spec.ts b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.spec.ts index af3d4baf6..4e239a2a8 100644 --- a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.spec.ts +++ b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.spec.ts @@ -219,6 +219,25 @@ describe('PngxPdfViewerComponent', () => { expect(scaleSpy).not.toHaveBeenCalled() }) + it('resets viewer state on src change', () => { + const mockViewer = { + setDocument: jest.fn(), + currentPageNumber: 7, + cleanup: jest.fn(), + } + ;(component as any).pdfViewer = mockViewer + ;(component as any).loadingTask = { destroy: jest.fn() } + jest.spyOn(component as any, 'loadDocument').mockImplementation(() => {}) + + component.src = 'test.pdf' + component.ngOnChanges({ + src: new SimpleChange(undefined, 'test.pdf', true), + }) + + expect(mockViewer.setDocument).toHaveBeenCalledWith(null) + expect(mockViewer.currentPageNumber).toBe(1) + }) + it('applies viewer state after view init when already loaded', () => { const applySpy = jest.spyOn(component as any, 'applyViewerState') ;(component as any).hasLoaded = true diff --git a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts index 6ba9eaef6..d9382a380 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts @@ -410,6 +410,35 @@ describe('DocumentDetailComponent', () => { }) }) + it('should navigate to 404 when root lookup fails', () => { + const navigateSpy = jest.spyOn(router, 'navigate') + jest + .spyOn(activatedRoute, 'paramMap', 'get') + .mockReturnValue(of(convertToParamMap({ id: 10, section: 'details' }))) + jest + .spyOn(documentService, 'get') + .mockReturnValueOnce(throwError(() => ({ status: 404 }) as any)) + jest + .spyOn(documentService, 'getRootId') + .mockReturnValue(throwError(() => new Error('boom'))) + jest.spyOn(openDocumentsService, 'getOpenDocument').mockReturnValue(null) + jest + .spyOn(openDocumentsService, 'openDocument') + .mockReturnValueOnce(of(true)) + jest.spyOn(customFieldsService, 'listAll').mockReturnValue( + of({ + count: customFields.length, + all: customFields.map((f) => f.id), + results: customFields, + }) + ) + + fixture.detectChanges() + httpTestingController.expectOne(component.previewUrl).flush('preview') + + expect(navigateSpy).toHaveBeenCalledWith(['404'], { replaceUrl: true }) + }) + it('should not render a delete button for the root/original version', () => { const docWithVersions = { ...doc, diff --git a/src-ui/src/app/services/rest/document.service.spec.ts b/src-ui/src/app/services/rest/document.service.spec.ts index 83b1dee2b..77a54dbc7 100644 --- a/src-ui/src/app/services/rest/document.service.spec.ts +++ b/src-ui/src/app/services/rest/document.service.spec.ts @@ -306,6 +306,14 @@ describe(`DocumentService`, () => { req.flush({ root_id: documents[0].id }) }) + it('should call appropriate api endpoint for getting document versions', () => { + subscription = service.getVersions(documents[0].id).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/?fields=id,versions` + ) + expect(req.request.method).toEqual('GET') + }) + it('should call appropriate api endpoint for deleting a document version', () => { subscription = service.deleteVersion(documents[0].id, 10).subscribe() const req = httpTestingController.expectOne(