176 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { HttpClientTestingModule } from '@angular/common/http/testing'
 | 
						|
import { ComponentFixture, TestBed } from '@angular/core/testing'
 | 
						|
import { FormsModule, ReactiveFormsModule } from '@angular/forms'
 | 
						|
import { By } from '@angular/platform-browser'
 | 
						|
import {
 | 
						|
  NgbModal,
 | 
						|
  NgbPaginationModule,
 | 
						|
  NgbModalRef,
 | 
						|
  NgbModalModule,
 | 
						|
} from '@ng-bootstrap/ng-bootstrap'
 | 
						|
import { of, throwError } from 'rxjs'
 | 
						|
import {
 | 
						|
  DocumentSource,
 | 
						|
  ConsumptionTemplate,
 | 
						|
} from 'src/app/data/consumption-template'
 | 
						|
import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive'
 | 
						|
import { ConsumptionTemplateService } from 'src/app/services/rest/consumption-template.service'
 | 
						|
import { ToastService } from 'src/app/services/toast.service'
 | 
						|
import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component'
 | 
						|
import { PageHeaderComponent } from '../../common/page-header/page-header.component'
 | 
						|
import { ConsumptionTemplatesComponent } from './consumption-templates.component'
 | 
						|
import { ConsumptionTemplateEditDialogComponent } from '../../common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component'
 | 
						|
import { PermissionsService } from 'src/app/services/permissions.service'
 | 
						|
 | 
						|
const templates: ConsumptionTemplate[] = [
 | 
						|
  {
 | 
						|
    id: 0,
 | 
						|
    name: 'Template 1',
 | 
						|
    order: 0,
 | 
						|
    sources: [
 | 
						|
      DocumentSource.ConsumeFolder,
 | 
						|
      DocumentSource.ApiUpload,
 | 
						|
      DocumentSource.MailFetch,
 | 
						|
    ],
 | 
						|
    filter_filename: 'foo',
 | 
						|
    filter_path: 'bar',
 | 
						|
    assign_tags: [1, 2, 3],
 | 
						|
  },
 | 
						|
  {
 | 
						|
    id: 1,
 | 
						|
    name: 'Template 2',
 | 
						|
    order: 1,
 | 
						|
    sources: [DocumentSource.MailFetch],
 | 
						|
    filter_filename: null,
 | 
						|
    filter_path: 'foo/bar',
 | 
						|
    assign_owner: 1,
 | 
						|
  },
 | 
						|
]
 | 
						|
 | 
						|
describe('ConsumptionTemplatesComponent', () => {
 | 
						|
  let component: ConsumptionTemplatesComponent
 | 
						|
  let fixture: ComponentFixture<ConsumptionTemplatesComponent>
 | 
						|
  let consumptionTemplateService: ConsumptionTemplateService
 | 
						|
  let modalService: NgbModal
 | 
						|
  let toastService: ToastService
 | 
						|
 | 
						|
  beforeEach(() => {
 | 
						|
    TestBed.configureTestingModule({
 | 
						|
      declarations: [
 | 
						|
        ConsumptionTemplatesComponent,
 | 
						|
        IfPermissionsDirective,
 | 
						|
        PageHeaderComponent,
 | 
						|
        ConfirmDialogComponent,
 | 
						|
      ],
 | 
						|
      providers: [
 | 
						|
        {
 | 
						|
          provide: PermissionsService,
 | 
						|
          useValue: {
 | 
						|
            currentUserCan: () => true,
 | 
						|
            currentUserHasObjectPermissions: () => true,
 | 
						|
            currentUserOwnsObject: () => true,
 | 
						|
          },
 | 
						|
        },
 | 
						|
      ],
 | 
						|
      imports: [
 | 
						|
        HttpClientTestingModule,
 | 
						|
        NgbPaginationModule,
 | 
						|
        FormsModule,
 | 
						|
        ReactiveFormsModule,
 | 
						|
        NgbModalModule,
 | 
						|
      ],
 | 
						|
    })
 | 
						|
 | 
						|
    consumptionTemplateService = TestBed.inject(ConsumptionTemplateService)
 | 
						|
    jest.spyOn(consumptionTemplateService, 'listAll').mockReturnValue(
 | 
						|
      of({
 | 
						|
        count: templates.length,
 | 
						|
        all: templates.map((o) => o.id),
 | 
						|
        results: templates,
 | 
						|
      })
 | 
						|
    )
 | 
						|
    modalService = TestBed.inject(NgbModal)
 | 
						|
    toastService = TestBed.inject(ToastService)
 | 
						|
 | 
						|
    fixture = TestBed.createComponent(ConsumptionTemplatesComponent)
 | 
						|
    component = fixture.componentInstance
 | 
						|
    fixture.detectChanges()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should support create, show notification on error / success', () => {
 | 
						|
    let modal: NgbModalRef
 | 
						|
    modalService.activeInstances.subscribe((m) => (modal = m[m.length - 1]))
 | 
						|
    const toastErrorSpy = jest.spyOn(toastService, 'showError')
 | 
						|
    const toastInfoSpy = jest.spyOn(toastService, 'showInfo')
 | 
						|
    const reloadSpy = jest.spyOn(component, 'reload')
 | 
						|
 | 
						|
    const createButton = fixture.debugElement.queryAll(By.css('button'))[0]
 | 
						|
    createButton.triggerEventHandler('click')
 | 
						|
 | 
						|
    expect(modal).not.toBeUndefined()
 | 
						|
    const editDialog =
 | 
						|
      modal.componentInstance as ConsumptionTemplateEditDialogComponent
 | 
						|
 | 
						|
    // fail first
 | 
						|
    editDialog.failed.emit({ error: 'error creating item' })
 | 
						|
    expect(toastErrorSpy).toHaveBeenCalled()
 | 
						|
    expect(reloadSpy).not.toHaveBeenCalled()
 | 
						|
 | 
						|
    // succeed
 | 
						|
    editDialog.succeeded.emit(templates[0])
 | 
						|
    expect(toastInfoSpy).toHaveBeenCalled()
 | 
						|
    expect(reloadSpy).toHaveBeenCalled()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should support edit, show notification on error / success', () => {
 | 
						|
    let modal: NgbModalRef
 | 
						|
    modalService.activeInstances.subscribe((m) => (modal = m[m.length - 1]))
 | 
						|
    const toastErrorSpy = jest.spyOn(toastService, 'showError')
 | 
						|
    const toastInfoSpy = jest.spyOn(toastService, 'showInfo')
 | 
						|
    const reloadSpy = jest.spyOn(component, 'reload')
 | 
						|
 | 
						|
    const editButton = fixture.debugElement.queryAll(By.css('button'))[1]
 | 
						|
    editButton.triggerEventHandler('click')
 | 
						|
 | 
						|
    expect(modal).not.toBeUndefined()
 | 
						|
    const editDialog =
 | 
						|
      modal.componentInstance as ConsumptionTemplateEditDialogComponent
 | 
						|
    expect(editDialog.object).toEqual(templates[0])
 | 
						|
 | 
						|
    // fail first
 | 
						|
    editDialog.failed.emit({ error: 'error editing item' })
 | 
						|
    expect(toastErrorSpy).toHaveBeenCalled()
 | 
						|
    expect(reloadSpy).not.toHaveBeenCalled()
 | 
						|
 | 
						|
    // succeed
 | 
						|
    editDialog.succeeded.emit(templates[0])
 | 
						|
    expect(toastInfoSpy).toHaveBeenCalled()
 | 
						|
    expect(reloadSpy).toHaveBeenCalled()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should support delete, show notification on error / success', () => {
 | 
						|
    let modal: NgbModalRef
 | 
						|
    modalService.activeInstances.subscribe((m) => (modal = m[m.length - 1]))
 | 
						|
    const toastErrorSpy = jest.spyOn(toastService, 'showError')
 | 
						|
    const deleteSpy = jest.spyOn(consumptionTemplateService, 'delete')
 | 
						|
    const reloadSpy = jest.spyOn(component, 'reload')
 | 
						|
 | 
						|
    const deleteButton = fixture.debugElement.queryAll(By.css('button'))[3]
 | 
						|
    deleteButton.triggerEventHandler('click')
 | 
						|
 | 
						|
    expect(modal).not.toBeUndefined()
 | 
						|
    const editDialog = modal.componentInstance as ConfirmDialogComponent
 | 
						|
 | 
						|
    // fail first
 | 
						|
    deleteSpy.mockReturnValueOnce(throwError(() => new Error('error deleting')))
 | 
						|
    editDialog.confirmClicked.emit()
 | 
						|
    expect(toastErrorSpy).toHaveBeenCalled()
 | 
						|
    expect(reloadSpy).not.toHaveBeenCalled()
 | 
						|
 | 
						|
    // succeed
 | 
						|
    deleteSpy.mockReturnValueOnce(of(true))
 | 
						|
    editDialog.confirmClicked.emit()
 | 
						|
    expect(reloadSpy).toHaveBeenCalled()
 | 
						|
  })
 | 
						|
})
 |