import 'reflect-metadata'; import { requiredMocks, } from './../../../../test-mocks'; requiredMocks(jest); import { ChangeDetectorRef, } from '@angular/core'; import { Subscription, } from 'rxjs'; import { empty, of, } from 'rxjs'; import { BackgroundImageFadeInDirective, } from './background-image-fade-in.directive'; import { ImagePreloaderService, } from './../../services/index'; const initBackgroundImageFadeInDirective = ( imagePreloaderService?: ImagePreloaderService, changeDetectorRef?: ChangeDetectorRef, ) => { return new BackgroundImageFadeInDirective( imagePreloaderService, changeDetectorRef, ); }; describe('ngOnChanges', () => { const initNgOnChanges = ( imagePreloaderResult?, ) => { const imagePreloaderService = {} as ImagePreloaderService; imagePreloaderService.load = jest.fn().mockReturnValue( imagePreloaderResult || of(''), ); const changeDetectorRef = {} as ChangeDetectorRef; changeDetectorRef.markForCheck = jest.fn(); const backgroundImageFadeInDirective = initBackgroundImageFadeInDirective( imagePreloaderService, changeDetectorRef, ); backgroundImageFadeInDirective.backgroundImageUrl = 'testBackgroundUrl'; return { backgroundImageFadeInDirective, changeDetectorRef, imagePreloaderService, }; }; test('Sets isLoaded to true', () => { const { backgroundImageFadeInDirective, } = initNgOnChanges(empty()); backgroundImageFadeInDirective.ngOnChanges(); expect(backgroundImageFadeInDirective.isLoaded).toBe(false); }); test('Calls imagePreloaderService.load with the backgroundUrl', () => { const { backgroundImageFadeInDirective, imagePreloaderService, } = initNgOnChanges(); backgroundImageFadeInDirective.ngOnChanges(); expect(imagePreloaderService.load).toHaveBeenCalledWith( 'testBackgroundUrl', ); }); test('Does not change hostBackgroundUrl until the image is loaded', () => { const { backgroundImageFadeInDirective, } = initNgOnChanges(empty()); backgroundImageFadeInDirective.hostBackgroundUrl = null; backgroundImageFadeInDirective.ngOnChanges(); expect(backgroundImageFadeInDirective.hostBackgroundUrl) .toBeNull(); }); // tslint:disable-next-line test('When the image is loaded sets hostBackgroundUrl to the expected url', () => { const { backgroundImageFadeInDirective, imagePreloaderService, } = initNgOnChanges(); backgroundImageFadeInDirective.ngOnChanges(); expect(backgroundImageFadeInDirective.hostBackgroundUrl) .toBe('url(testBackgroundUrl)'); }); // tslint:disable-next-line test('When the image is loaded sets isLoaded to true', () => { const { backgroundImageFadeInDirective, } = initNgOnChanges(); backgroundImageFadeInDirective.ngOnChanges(); expect(backgroundImageFadeInDirective.isLoaded) .toBe(true); }); // tslint:disable-next-line test('When the image is loaded calls changeDetectorRef.markForCheck', () => { const { backgroundImageFadeInDirective, changeDetectorRef, } = initNgOnChanges(); backgroundImageFadeInDirective.ngOnChanges(); expect(changeDetectorRef.markForCheck).toHaveBeenCalled(); }); }); describe('ngOnDestroy', () => { test('Unsubscribes from the imagePreloaderService.load observable', () => { const subscription = new Subscription(); subscription.unsubscribe = jest.fn(); const imagePreloaderObservable = of(''); imagePreloaderObservable.subscribe = jest.fn().mockReturnValue( subscription, ); const imagePreloaderService = {} as ImagePreloaderService; imagePreloaderService.load = jest.fn().mockReturnValue( imagePreloaderObservable, ); const backgroundImageFadeInDirective = initBackgroundImageFadeInDirective(imagePreloaderService); backgroundImageFadeInDirective.ngOnChanges(); backgroundImageFadeInDirective.ngOnDestroy(); expect(subscription.unsubscribe).toHaveBeenCalled(); }); });