]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Chore: miscellaneous frontend testing
authorshamoon <4887959+shamoon@users.noreply.github.com>
Sat, 24 Feb 2024 07:36:03 +0000 (23:36 -0800)
committershamoon <4887959+shamoon@users.noreply.github.com>
Sat, 24 Feb 2024 07:36:03 +0000 (23:36 -0800)
src-ui/setup-jest.ts
src-ui/src/app/components/admin/settings/settings.component.spec.ts
src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts
src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts
src-ui/src/app/components/common/input/select/select.component.spec.ts
src-ui/src/app/components/common/input/tags/tags.component.spec.ts
src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.spec.ts
src-ui/src/app/guards/dirty-form.guard.spec.ts
src-ui/src/app/services/open-documents.service.spec.ts
src-ui/src/app/services/rest/mail-account.service.spec.ts
src-ui/src/app/services/rest/mail-rule.service.spec.ts

index f2767ebf014ba2baaea5239c293f8b5d75838f28..39f018c6df216e088a6d317c308a2c2a991b7f9c 100644 (file)
@@ -94,6 +94,10 @@ Object.defineProperty(navigator, 'clipboard', {
 })
 Object.defineProperty(navigator, 'canShare', { value: () => true })
 Object.defineProperty(window, 'ResizeObserver', { value: mock() })
+Object.defineProperty(window, 'location', {
+  configurable: true,
+  value: { reload: jest.fn() },
+})
 
 HTMLCanvasElement.prototype.getContext = <
   typeof HTMLCanvasElement.prototype.getContext
index 6a9ca36da95c136be849bc7720ec1095fa8841bd..6256f646bdc05b89d5b0e689a1ac4254fbadfca7 100644 (file)
@@ -309,10 +309,15 @@ describe('SettingsComponent', () => {
     component.store.getValue()['displayLanguage'] = 'en-US'
     component.store.getValue()['updateCheckingEnabled'] = false
     component.settingsForm.value.displayLanguage = 'en-GB'
+    jest.spyOn(settingsService, 'storeSettings').mockReturnValue(of(true))
+    component.saveSettings()
+    expect(toast.actionName).toEqual('Reload now')
+
     component.settingsForm.value.updateCheckingEnabled = true
-    jest.spyOn(settingsService, 'storeSettings').mockReturnValueOnce(of(true))
     component.saveSettings()
+
     expect(toast.actionName).toEqual('Reload now')
+    toast.action()
   })
 
   it('should allow setting theme color, visually apply change immediately but not save', () => {
index 58aa029ee51e668bba512634cb67ec4ed3914b77..fe377cc7074e4c99186c188d51c814a8460ddf8f 100644 (file)
@@ -493,12 +493,17 @@ describe('FilterableDropdownComponent & FilterableDropdownSelectionModel', () =>
     expect(changedResult.getExcludedItems()).toEqual(items)
   }))
 
-  it('FilterableDropdownSelectionModel should sort items by state', () => {
-    component.items = items
+  it('selection model should sort items by state', () => {
+    component.items = items.concat([{ id: null, name: 'Null B' }])
     component.selectionModel = selectionModel
     selectionModel.toggle(items[1].id)
     selectionModel.apply()
-    expect(selectionModel.itemsSorted).toEqual([nullItem, items[1], items[0]])
+    expect(selectionModel.itemsSorted).toEqual([
+      nullItem,
+      { id: null, name: 'Null B' },
+      items[1],
+      items[0],
+    ])
   })
 
   it('should set support create, keep open model and call createRef method', fakeAsync(() => {
@@ -542,4 +547,34 @@ describe('FilterableDropdownComponent & FilterableDropdownSelectionModel', () =>
     tick(300)
     expect(createSpy).toHaveBeenCalled()
   }))
+
+  it('should exclude item and trigger change event', () => {
+    const id = 1
+    const state = ToggleableItemState.Selected
+    component.selectionModel = selectionModel
+    component.manyToOne = true
+    component.selectionModel.singleSelect = true
+    component.selectionModel.intersection = Intersection.Include
+    component.selectionModel['temporarySelectionStates'].set(id, state)
+    const changedSpy = jest.spyOn(component.selectionModel.changed, 'next')
+    component.selectionModel.exclude(id)
+    expect(component.selectionModel.temporaryLogicalOperator).toBe(
+      LogicalOperator.And
+    )
+    expect(component.selectionModel['temporarySelectionStates'].get(id)).toBe(
+      ToggleableItemState.Excluded
+    )
+    expect(component.selectionModel['temporarySelectionStates'].size).toBe(1)
+    expect(changedSpy).toHaveBeenCalled()
+  })
+
+  it('should initialize selection states and apply changes', () => {
+    selectionModel.items = items
+    const map = new Map<number, ToggleableItemState>()
+    map.set(1, ToggleableItemState.Selected)
+    map.set(2, ToggleableItemState.Excluded)
+    selectionModel.init(map)
+    expect(selectionModel.getSelectedItems()).toEqual([items[0]])
+    expect(selectionModel.getExcludedItems()).toEqual([items[1]])
+  })
 })
index bb1a9da2715a556b8f0ba2842523dbbc4c6a8bdf..4f39d32c339e9ed7902faf264830791223652ec6 100644 (file)
@@ -275,7 +275,7 @@ export class FilterableDropdownSelectionModel {
     )
   }
 
-  init(map) {
+  init(map: Map<number, ToggleableItemState>) {
     this.temporarySelectionStates = map
     this.apply()
   }
index e9eee1648d2fbc96ef19c46b57c4432542a2c348..79eec16e86e15ee14121dc8b538e2c3140edafc9 100644 (file)
@@ -118,4 +118,18 @@ describe('SelectComponent', () => {
     tick(3000)
     expect(clearSpy).toHaveBeenCalled()
   }))
+
+  it('should emit filtered documents', () => {
+    component.value = 10
+    component.items = items
+    const emitSpy = jest.spyOn(component.filterDocuments, 'emit')
+    component.onFilterDocuments()
+    expect(emitSpy).toHaveBeenCalledWith([items[2]])
+  })
+
+  it('should return the correct filter button title', () => {
+    component.title = 'Tag'
+    const expectedTitle = `Filter documents with this ${component.title}`
+    expect(component.filterButtonTitle).toEqual(expectedTitle)
+  })
 })
index af321ab9e2c823c088b1ef95c969b74172c657dc..f08fed4f87593b70c265d1b2d385612d3f0a9285 100644 (file)
@@ -169,4 +169,12 @@ describe('TagsComponent', () => {
     expect(component.getTag(2)).toEqual(tags[1])
     expect(component.getTag(4)).toBeUndefined()
   })
+
+  it('should emit filtered documents', () => {
+    component.value = [10]
+    component.tags = tags
+    const emitSpy = jest.spyOn(component.filterDocuments, 'emit')
+    component.onFilterDocuments()
+    expect(emitSpy).toHaveBeenCalledWith([tags[2]])
+  })
 })
index 5ecc116c2dde6ba25c8bb772df39a7df15bac42a..172239dbbf4fe420f17fcd50888b3d6ee7e794c8 100644 (file)
@@ -119,6 +119,8 @@ describe('UploadFileWidgetComponent', () => {
     const processingStatus = new FileStatus()
     processingStatus.phase = FileStatusPhase.WORKING
     expect(component.getStatusColor(processingStatus)).toEqual('primary')
+    processingStatus.phase = FileStatusPhase.UPLOADING
+    expect(component.getStatusColor(processingStatus)).toEqual('primary')
     const failedStatus = new FileStatus()
     failedStatus.phase = FileStatusPhase.FAILED
     expect(component.getStatusColor(failedStatus)).toEqual('danger')
index 24ee24f745a20f3ad5ddb1f1486e2d99ec0ea42c..c5c473b27723a9d5532c69eb7ca30e4eaeb19750 100644 (file)
@@ -17,6 +17,7 @@ describe('DirtyFormGuard', () => {
   let guard: DirtyFormGuard
   let component: DirtyComponent
   let route: ActivatedRoute
+  let modalService: NgbModal
 
   beforeEach(() => {
     TestBed.configureTestingModule({
@@ -37,6 +38,7 @@ describe('DirtyFormGuard', () => {
 
     guard = TestBed.inject(DirtyFormGuard)
     route = TestBed.inject(ActivatedRoute)
+    modalService = TestBed.inject(NgbModal)
     const fixture = TestBed.createComponent(GenericDirtyComponent)
     component = fixture.componentInstance
 
@@ -57,9 +59,14 @@ describe('DirtyFormGuard', () => {
     component.isDirty$ = true
     const confirmSpy = jest.spyOn(guard, 'confirmChanges')
     const canDeactivate = guard.canDeactivate(component, route.snapshot)
+    let modal
+    modalService.activeInstances.subscribe((instances) => {
+      modal = instances[0]
+    })
     canDeactivate.subscribe()
 
     expect(canDeactivate).toHaveProperty('source') // Observable
     expect(confirmSpy).toHaveBeenCalled()
+    modal.componentInstance.confirmClicked.next()
   })
 })
index 3c8e29eddf9f54a8ee86fc319e87210f0daae068..69d2a4a37fa685387ce4024a2c2db1e5c89d9db1 100644 (file)
@@ -108,6 +108,7 @@ describe('OpenDocumentsService', () => {
   })
 
   it('should close documents', () => {
+    openDocumentsService.closeDocument({ id: 999 } as any)
     subscriptions.push(
       openDocumentsService.openDocument(documents[0]).subscribe()
     )
@@ -128,15 +129,21 @@ describe('OpenDocumentsService', () => {
     subscriptions.push(
       openDocumentsService.openDocument(documents[0]).subscribe()
     )
+    openDocumentsService.setDirty({ id: 999 }, true) // coverage
     openDocumentsService.setDirty(documents[0], false)
     expect(openDocumentsService.hasDirty()).toBeFalsy()
     openDocumentsService.setDirty(documents[0], true)
     expect(openDocumentsService.hasDirty()).toBeTruthy()
+    let openModal
+    modalService.activeInstances.subscribe((instances) => {
+      openModal = instances[0]
+    })
     const modalSpy = jest.spyOn(modalService, 'open')
     subscriptions.push(
       openDocumentsService.closeDocument(documents[0]).subscribe()
     )
     expect(modalSpy).toHaveBeenCalled()
+    openModal.componentInstance.confirmClicked.next()
   })
 
   it('should allow set dirty status, warn on closeAll', () => {
@@ -148,9 +155,14 @@ describe('OpenDocumentsService', () => {
     )
     openDocumentsService.setDirty(documents[0], true)
     expect(openDocumentsService.hasDirty()).toBeTruthy()
+    let openModal
+    modalService.activeInstances.subscribe((instances) => {
+      openModal = instances[0]
+    })
     const modalSpy = jest.spyOn(modalService, 'open')
     subscriptions.push(openDocumentsService.closeAll().subscribe())
     expect(modalSpy).toHaveBeenCalled()
+    openModal.componentInstance.confirmClicked.next()
   })
 
   it('should load open documents from localStorage', () => {
index 80a66f28bbc22697c185add53138f1bf19300a26..64974d834389255d771af6ff039649c7727da2ea 100644 (file)
@@ -58,12 +58,25 @@ describe(`Additional service tests for MailAccountService`, () => {
   it('should support patchMany', () => {
     subscription = service.patchMany(mail_accounts).subscribe()
     mail_accounts.forEach((mail_account) => {
-      const reqs = httpTestingController.match(
+      const req = httpTestingController.expectOne(
         `${environment.apiBaseUrl}${endpoint}/${mail_account.id}/`
       )
-      expect(reqs).toHaveLength(1)
-      expect(reqs[0].request.method).toEqual('PATCH')
+      expect(req.request.method).toEqual('PATCH')
+      req.flush(mail_account)
     })
+    httpTestingController.expectOne(
+      `${environment.apiBaseUrl}${endpoint}/?page=1&page_size=100000`
+    )
+  })
+
+  it('should support reload', () => {
+    service['reload']()
+    const req = httpTestingController.expectOne(
+      `${environment.apiBaseUrl}${endpoint}/?page=1&page_size=100000`
+    )
+    expect(req.request.method).toEqual('GET')
+    req.flush({ results: mail_accounts })
+    expect(service.allAccounts).toEqual(mail_accounts)
   })
 
   beforeEach(() => {
index cc5ac992862b37d3d60656b8412a648c0637b9d3..ea84e8b86fe644e71f7d9d268bc031530aafa9d5 100644 (file)
@@ -76,12 +76,26 @@ describe(`Additional service tests for MailRuleService`, () => {
   it('should support patchMany', () => {
     subscription = service.patchMany(mail_rules).subscribe()
     mail_rules.forEach((mail_rule) => {
-      const reqs = httpTestingController.match(
+      const req = httpTestingController.expectOne(
         `${environment.apiBaseUrl}${endpoint}/${mail_rule.id}/`
       )
-      expect(reqs).toHaveLength(1)
-      expect(reqs[0].request.method).toEqual('PATCH')
+      expect(req.request.method).toEqual('PATCH')
+      req.flush(mail_rule)
     })
+    const reloadReq = httpTestingController.expectOne(
+      `${environment.apiBaseUrl}${endpoint}/?page=1&page_size=100000`
+    )
+    reloadReq.flush({ results: mail_rules })
+  })
+
+  it('should support reload', () => {
+    service['reload']()
+    const req = httpTestingController.expectOne(
+      `${environment.apiBaseUrl}${endpoint}/?page=1&page_size=100000`
+    )
+    expect(req.request.method).toEqual('GET')
+    req.flush({ results: mail_rules })
+    expect(service.allRules).toEqual(mail_rules)
   })
 
   beforeEach(() => {