import { Component, NgModule, Injectable } from '@angular/core'; import { fakeAsync, TestBed, tick } from '@angular/core/testing'; import { NbOverlayContainerAdapter } from '../cdk/adapter/overlay-container-adapter'; import { NbViewportRulerAdapter } from '../cdk/adapter/viewport-ruler-adapter'; import { NbOverlayService } from '../cdk/overlay/overlay-service'; import { NbDialogService } from './dialog.service'; import { NbDialogModule } from './dialog.module'; import { NbThemeModule } from '../../theme.module'; import { NB_DOCUMENT } from '../../theme.options'; @Injectable() export class NbViewportRulerMockAdapter extends NbViewportRulerAdapter { getViewportSize(): Readonly<{ width: number; height: number; }> { return { width: 1600, height: 900 }; } } @Component({ selector: 'nb-test-dialog', template: '' }) class NbTestDialogComponent { } @NgModule({ declarations: [NbTestDialogComponent], entryComponents: [NbTestDialogComponent], }) class NbTestDialogModule { } describe('dialog-service', () => { let dialog: NbDialogService; let overlayContainerService: NbOverlayContainerAdapter; let overlayContainer: HTMLElement; let overlayService: NbOverlayService; let document: Document; const queryBackdrop = () => overlayContainer.querySelector('.overlay-backdrop'); beforeEach(() => { TestBed.configureTestingModule({ imports: [ NbTestDialogModule, NbThemeModule.forRoot(), NbDialogModule.forRoot(), ], providers: [{ provide: NbViewportRulerAdapter, useClass: NbViewportRulerMockAdapter }], }); dialog = TestBed.inject(NbDialogService); overlayContainerService = TestBed.inject(NbOverlayContainerAdapter); document = TestBed.inject(NB_DOCUMENT); overlayService = TestBed.inject(NbOverlayService); }); beforeEach(() => { overlayContainer = document.createElement('div'); overlayContainerService.setContainer(overlayContainer); }); afterAll(() => { overlayContainerService.clearContainer(); }); it('should render dialog', () => { const ref = dialog.open(NbTestDialogComponent); expect(ref.componentRef).toBeTruthy(); expect(ref.componentRef.instance instanceof NbTestDialogComponent).toBeTruthy(); }); it('should assign default backdropClass', () => { dialog.open(NbTestDialogComponent); expect(queryBackdrop()).toBeTruthy(); }); it('should assign backdropClass if provided', () => { dialog.open(NbTestDialogComponent, { backdropClass: 'nb-overlay-test-backdrop-class' }); expect(overlayContainer.querySelector('.nb-overlay-test-backdrop-class')).toBeTruthy(); }); it('should assign dialogClass if provided', () => { dialog.open(NbTestDialogComponent, { dialogClass: 'nb-overlay-test-dialog-class' }); expect(overlayContainer.querySelector('.nb-overlay-test-dialog-class')).toBeTruthy(); }); it('should render with backdrop if hasBackdrop is true', () => { dialog.open(NbTestDialogComponent, { hasBackdrop: true }); expect(queryBackdrop()).toBeTruthy(); }); it('should render without backdrop if hasBackdrop is false', () => { dialog.open(NbTestDialogComponent, { hasBackdrop: false }); expect(queryBackdrop()).toBeFalsy(); }); it('should leave capability scroll content under dialog if hasScroll is true', () => { const noopSpy = spyOn(overlayService.scrollStrategies, 'noop'); const blockSpy = spyOn(overlayService.scrollStrategies, 'block'); dialog.open(NbTestDialogComponent, { hasScroll: true }); expect(noopSpy).toHaveBeenCalledTimes(1); expect(blockSpy).toHaveBeenCalledTimes(0); }); it('should disable scroll under dialog if hasScroll is false', () => { const noopSpy = spyOn(overlayService.scrollStrategies, 'noop'); const blockSpy = spyOn(overlayService.scrollStrategies, 'block'); dialog.open(NbTestDialogComponent, { hasScroll: false }); expect(noopSpy).toHaveBeenCalledTimes(0); expect(blockSpy).toHaveBeenCalledTimes(1); }); it('should fire onBackdropClick if backdrop was clicked', done => { const ref = dialog.open(NbTestDialogComponent, { closeOnBackdropClick: false }); const backdrop = queryBackdrop(); ref.onBackdropClick.subscribe(e => { expect(e.target).toBe(backdrop); done(); }); backdrop.dispatchEvent(new Event('click')); }); it('should not fire onBackdropClick if backdrop wasn\'t clicked', () => { const ref = dialog.open(NbTestDialogComponent, { closeOnBackdropClick: false }); const spy = jasmine.createSpy(); ref.onBackdropClick.subscribe(spy); expect(spy).toHaveBeenCalledTimes(0); }); it('should close on backdrop click if closeOnBackdropClick is true', fakeAsync(() => { dialog.open(NbTestDialogComponent, { closeOnBackdropClick: true, autoFocus: false }); queryBackdrop().dispatchEvent(new Event('click')); tick(500); expect(queryBackdrop()).toBeFalsy(); })); it('should not close on backdrop click if closeOnBackdropClick is false', fakeAsync(() => { dialog.open(NbTestDialogComponent, { closeOnBackdropClick: false }); queryBackdrop().dispatchEvent(new Event('click')); tick(500); expect(queryBackdrop()).toBeTruthy(); })); it('should close on escape press if closeOnEsc is true', fakeAsync(() => { dialog.open(NbTestDialogComponent, { closeOnEsc: true }); document.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 27 })); tick(500); expect(queryBackdrop()).toBeFalsy(); })); it('should not close on escape press if closeOnEsc is false', fakeAsync(() => { dialog.open(NbTestDialogComponent, { closeOnEsc: false }); document.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 27 })); tick(500); expect(queryBackdrop()).toBeTruthy(); })); });