import { ComponentFixture, TestBed } from '@angular/core/testing' import { TrashComponent } from './trash.component' import { HttpClientTestingModule } from '@angular/common/http/testing' import { PageHeaderComponent } from '../../common/page-header/page-header.component' import { NgbModal, NgbPaginationModule, NgbPopoverModule, } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' import { FormsModule, ReactiveFormsModule } from '@angular/forms' import { TrashService } from 'src/app/services/trash.service' import { of } from 'rxjs' import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component' import { By } from '@angular/platform-browser' import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' const documentsInTrash = [ { id: 1, name: 'test1', created: new Date('2023-03-01T10:26:03.093116Z'), deleted_at: new Date('2023-03-01T10:26:03.093116Z'), }, { id: 2, name: 'test2', created: new Date('2023-03-01T10:26:03.093116Z'), deleted_at: new Date('2023-03-01T10:26:03.093116Z'), }, ] describe('TrashComponent', () => { let component: TrashComponent let fixture: ComponentFixture let trashService: TrashService let modalService: NgbModal beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [ TrashComponent, PageHeaderComponent, ConfirmDialogComponent, SafeHtmlPipe, ], imports: [ HttpClientTestingModule, FormsModule, ReactiveFormsModule, NgbPopoverModule, NgbPaginationModule, NgxBootstrapIconsModule.pick(allIcons), ], }).compileComponents() fixture = TestBed.createComponent(TrashComponent) trashService = TestBed.inject(TrashService) modalService = TestBed.inject(NgbModal) component = fixture.componentInstance fixture.detectChanges() }) it('should call correct service method on reload', () => { const trashSpy = jest.spyOn(trashService, 'getTrash') trashSpy.mockReturnValue( of({ count: 2, all: documentsInTrash.map((d) => d.id), results: documentsInTrash, }) ) component.reload() expect(trashSpy).toHaveBeenCalled() expect(component.documentsInTrash).toEqual(documentsInTrash) }) it('should support delete document', () => { const trashSpy = jest.spyOn(trashService, 'emptyTrash') let modal modalService.activeInstances.subscribe((instances) => { modal = instances[0] }) trashSpy.mockReturnValue(of('OK')) component.delete(documentsInTrash[0]) expect(modal).toBeDefined() modal.componentInstance.confirmClicked.next() expect(trashSpy).toHaveBeenCalled() }) it('should support empty trash', () => { const trashSpy = jest.spyOn(trashService, 'emptyTrash') let modal modalService.activeInstances.subscribe((instances) => { modal = instances[instances.length - 1] }) trashSpy.mockReturnValue(of('OK')) component.emptyTrash() expect(modal).toBeDefined() modal.componentInstance.confirmClicked.next() expect(trashSpy).toHaveBeenCalled() modal.close() component.emptyTrash(new Set([1, 2])) modal.componentInstance.confirmClicked.next() expect(trashSpy).toHaveBeenCalledWith([1, 2]) }) it('should support restore document', () => { const restoreSpy = jest.spyOn(trashService, 'restoreDocuments') const reloadSpy = jest.spyOn(component, 'reload') restoreSpy.mockReturnValue(of('OK')) component.restore(documentsInTrash[0]) expect(restoreSpy).toHaveBeenCalledWith([documentsInTrash[0].id]) expect(reloadSpy).toHaveBeenCalled() }) it('should support restore all documents', () => { const restoreSpy = jest.spyOn(trashService, 'restoreDocuments') const reloadSpy = jest.spyOn(component, 'reload') restoreSpy.mockReturnValue(of('OK')) component.restoreAll() expect(restoreSpy).toHaveBeenCalled() expect(reloadSpy).toHaveBeenCalled() component.restoreAll(new Set([1, 2])) expect(restoreSpy).toHaveBeenCalledWith([1, 2]) }) it('should support toggle all items in view', () => { component.documentsInTrash = documentsInTrash expect(component.selectedDocuments.size).toEqual(0) const toggleAllSpy = jest.spyOn(component, 'toggleAll') const checkButton = fixture.debugElement.queryAll( By.css('input.form-check-input') )[0] checkButton.nativeElement.dispatchEvent(new Event('click')) checkButton.nativeElement.checked = true checkButton.nativeElement.dispatchEvent(new Event('click')) expect(toggleAllSpy).toHaveBeenCalled() expect(component.selectedDocuments.size).toEqual(documentsInTrash.length) }) it('should support toggle item', () => { component.selectedDocuments = new Set([1]) component.toggleSelected(documentsInTrash[0]) expect(component.selectedDocuments.size).toEqual(0) component.toggleSelected(documentsInTrash[0]) expect(component.selectedDocuments.size).toEqual(1) }) it('should support clear selection', () => { component.selectedDocuments = new Set([1]) component.clearSelection() expect(component.selectedDocuments.size).toEqual(0) }) it('should correctly display days remaining', () => { expect(component.getDaysRemaining(documentsInTrash[0])).toBeLessThan(0) const tenDaysAgo = new Date() tenDaysAgo.setDate(tenDaysAgo.getDate() - 10) expect( component.getDaysRemaining({ deleted_at: tenDaysAgo }) ).toBeGreaterThan(0) // 10 days ago but depends on month }) })