UNPKG

@ngneat/spectator

Version:

A powerful tool to simplify your Angular tests

64 lines 13.5 kB
import { TestBed, waitForAsync } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; import { addMatchers } from '../core'; import { nodeByDirective } from '../internals/node-by-directive'; import { setHostProps } from '../internals/query'; import * as customMatchers from '../matchers'; import { isType } from '../types'; import { overrideComponents, overrideDirectives, overrideModules, overridePipes } from '../spectator/create-factory'; import { initialSpectatorDirectiveModule } from './initial-module'; import { getSpectatorDirectiveDefaultOptions } from './options'; import { SpectatorDirective } from './spectator-directive'; export function createDirectiveFactory(typeOrOptions) { const options = isType(typeOrOptions) ? getSpectatorDirectiveDefaultOptions({ directive: typeOrOptions }) : getSpectatorDirectiveDefaultOptions(typeOrOptions); const moduleMetadata = initialSpectatorDirectiveModule(options); beforeEach(waitForAsync(() => { addMatchers(customMatchers); TestBed.configureTestingModule(moduleMetadata); overrideModules(options); overrideComponents(options); overrideDirectives(options); overridePipes(options); })); return (template, overrides) => { const defaults = { hostProps: {}, detectChanges: true, providers: [], }; const { detectChanges, hostProps, providers } = { ...defaults, ...overrides }; if (providers && providers.length) { providers.forEach((provider) => { TestBed.overrideProvider(provider.provide, provider); }); } TestBed.overrideModule(BrowserDynamicTestingModule, {}).overrideComponent(options.host, { set: { template: template || options.template }, }); if (options.directiveProviders.length || options.directiveMocks.length) { TestBed.overrideDirective(options.directive, { set: { providers: [...options.directiveProviders, ...options.directiveMocks.map((p) => options.mockProvider(p))] }, }); } const spectator = createSpectatorDirective(options, hostProps); if (options.detectChanges && detectChanges) { spectator.detectChanges(); } return spectator; }; } function createSpectatorDirective(options, hostProps) { const hostFixture = TestBed.createComponent(options.host); const debugElement = hostFixture.debugElement.query(By.directive(options.directive)) || hostFixture.debugElement; const debugNode = hostFixture.debugElement.queryAllNodes(nodeByDirective(options.directive))[0]; if (!debugNode) { throw new Error(`Cannot find directive ${options.directive} in host template 😔`); } const hostComponent = setHostProps(hostFixture.componentRef, hostProps); const directive = debugNode.injector.get(options.directive); return new SpectatorDirective(hostComponent, hostFixture, hostFixture.debugElement, directive, debugElement.nativeElement); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVjdGF0b3Ivc3JjL2xpYi9zcGVjdGF0b3ItZGlyZWN0aXZlL2NyZWF0ZS1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9DLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBR3hGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssY0FBYyxNQUFNLGFBQWEsQ0FBQztBQUU5QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRWxDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckgsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUE2QixtQ0FBbUMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMzRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQXVDM0QsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxhQUF3RDtJQUV4RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQ25DLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUN6RSxDQUFDLENBQUMsbUNBQW1DLENBQUMsYUFBYSxDQUFD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LE9BQU8sQ0FBQyxTQUFTLHNCQUFzQixDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUU1RCxPQUFPLElBQUksa0JBQWtCLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDN0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3ZpZGVyLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZXN0QmVkLCB3YWl0Rm9yQXN5bmMgfSBmcm9tICdAYW5ndWxhci9jb3JlL3Rlc3RpbmcnO1xuaW1wb3J0IHsgQnkgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEJyb3dzZXJEeW5hbWljVGVzdGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYy90ZXN0aW5nJztcblxuaW1wb3J0IHsgQmFzZVNwZWN0YXRvck92ZXJyaWRlcyB9IGZyb20gJy4uL2Jhc2Uvb3B0aW9ucyc7XG5pbXBvcnQgeyBhZGRNYXRjaGVycyB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgbm9kZUJ5RGlyZWN0aXZlIH0gZnJvbSAnLi4vaW50ZXJuYWxzL25vZGUtYnktZGlyZWN0aXZlJztcbmltcG9ydCB7IHNldEhvc3RQcm9wcyB9IGZyb20gJy4uL2ludGVybmFscy9xdWVyeSc7XG5pbXBvcnQgKiBhcyBjdXN0b21NYXRjaGVycyBmcm9tICcuLi9tYXRjaGVycyc7XG5pbXBvcnQgeyBIb3N0Q29tcG9uZW50IH0gZnJvbSAnLi4vc3BlY3RhdG9yLWhvc3QvaG9zdC1jb21wb25lbnQnO1xuaW1wb3J0IHsgaXNUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBvdmVycmlkZUNvbXBvbmVudHMsIG92ZXJyaWRlRGlyZWN0aXZlcywgb3ZlcnJpZGVNb2R1bGVzLCBvdmVycmlkZVBpcGVzIH0gZnJvbSAnLi4vc3BlY3RhdG9yL2NyZWF0ZS1mYWN0b3J5JztcbmltcG9ydCB7IGluaXRpYWxTcGVjdGF0b3JEaXJlY3RpdmVNb2R1bGUgfSBmcm9tICcuL2luaXRpYWwtbW9kdWxlJztcbmltcG9ydCB7IFNwZWN0YXRvckRpcmVjdGl2ZU9wdGlvbnMsIGdldFNwZWN0YXRvckRpcmVjdGl2ZURlZmF1bHRPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IFNwZWN0YXRvckRpcmVjdGl2ZSB9IGZyb20gJy4vc3BlY3RhdG9yLWRpcmVjdGl2ZSc7XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgdHlwZSBTcGVjdGF0b3JEaXJlY3RpdmVGYWN0b3J5PEQsIEg+ID0gPEhQPihcbiAgdGVtcGxhdGU6IHN0cmluZyxcbiAgb3ZlcnJpZGVzPzogU3BlY3RhdG9yRGlyZWN0aXZlT3ZlcnJpZGVzPEgsIEhQPixcbikgPT4gU3BlY3RhdG9yRGlyZWN0aXZlPEQsIEggJiAoSG9zdENvbXBvbmVudCBleHRlbmRzIEggPyBIUCA6IHVua25vd24pPjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCB0eXBlIFByZXNldFNwZWN0YXRvckRpcmVjdGl2ZUZhY3Rvcnk8RCwgSD4gPSA8SFA+KFxuICB0ZW1wbGF0ZT86IHN0cmluZyxcbiAgb3ZlcnJpZGVzPzogU3BlY3RhdG9yRGlyZWN0aXZlT3ZlcnJpZGVzPEgsIEhQPixcbikgPT4gU3BlY3RhdG9yRGlyZWN0aXZlPEQsIEggJiAoSG9zdENvbXBvbmVudCBleHRlbmRzIEggPyBIUCA6IHVua25vd24pPjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BlY3RhdG9yRGlyZWN0aXZlT3ZlcnJpZGVzPEgsIEhQPiBleHRlbmRzIEJhc2VTcGVjdGF0b3JPdmVycmlkZXMge1xuICBkZXRlY3RDaGFuZ2VzPzogYm9vbGVhbjtcbiAgaG9zdFByb3BzPzogSG9zdENvbXBvbmVudCBleHRlbmRzIEggPyBIUCA6IFBhcnRpYWw8SD47XG4gIGRpcmVjdGl2ZVByb3ZpZGVycz86IFByb3ZpZGVyW107XG59XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGlyZWN0aXZlRmFjdG9yeTxELCBIID0gSG9zdENvbXBvbmVudD4oXG4gIG9wdGlvbnM6IFNwZWN0YXRvckRpcmVjdGl2ZU9wdGlvbnM8RCwgSD4gJiB7IHRlbXBsYXRlOiBzdHJpbmcgfSxcbik6IFByZXNldFNwZWN0YXRvckRpcmVjdGl2ZUZhY3Rvcnk8RCwgSD47XG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpcmVjdGl2ZUZhY3Rvcnk8RCwgSCA9IEhvc3RDb21wb25lbnQ+KFxuICB0eXBlT3JPcHRpb25zOiBUeXBlPEQ+IHwgU3BlY3RhdG9yRGlyZWN0aXZlT3B0aW9uczxELCBIPixcbik6IFNwZWN0YXRvckRpcmVjdGl2ZUZhY3Rvcnk8RCwgSD47XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGlyZWN0aXZlRmFjdG9yeTxELCBIID0gSG9zdENvbXBvbmVudD4oXG4gIHR5cGVPck9wdGlvbnM6IFR5cGU8RD4gfCBTcGVjdGF0b3JEaXJlY3RpdmVPcHRpb25zPEQsIEg+LFxuKTogU3BlY3RhdG9yRGlyZWN0aXZlRmFjdG9yeTxELCBIPiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBpc1R5cGUodHlwZU9yT3B0aW9ucylcbiAgICA/IGdldFNwZWN0YXRvckRpcmVjdGl2ZURlZmF1bHRPcHRpb25zPEQsIEg+KHsgZGlyZWN0aXZlOiB0eXBlT3JPcHRpb25zIH0pXG4gICAgOiBnZXRTcGVjdGF0b3JEaXJlY3RpdmVEZWZhdWx0T3B0aW9ucyh0eXBlT3JPcHRpb25zKTtcblxuICBjb25zdCBtb2R1bGVNZXRhZGF0YSA9IGluaXRpYWxTcGVjdGF0b3JEaXJlY3RpdmVNb2R1bGU8RCwgSD4ob3B0aW9ucyk7XG5cbiAgYmVmb3JlRWFjaCh3YWl0Rm9yQXN5bmMoKCkgPT4ge1xuICAgIGFkZE1hdGNoZXJzKGN1c3RvbU1hdGNoZXJzKTtcbiAgICBUZXN0QmVkLmNvbmZpZ3VyZVRlc3RpbmdNb2R1bGUobW9kdWxlTWV0YWRhdGEpO1xuICAgIG92ZXJyaWRlTW9kdWxlcyhvcHRpb25zKTtcbiAgICBvdmVycmlkZUNvbXBvbmVudHMob3B0aW9ucyk7XG4gICAgb3ZlcnJpZGVEaXJlY3RpdmVzKG9wdGlvbnMpO1xuICAgIG92ZXJyaWRlUGlwZXMob3B0aW9ucyk7XG4gIH0pKTtcblxuICByZXR1cm4gPEhQPih0ZW1wbGF0ZT86IHN0cmluZywgb3ZlcnJpZGVzPzogU3BlY3RhdG9yRGlyZWN0aXZlT3ZlcnJpZGVzPEgsIEhQPikgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBTcGVjdGF0b3JEaXJlY3RpdmVPdmVycmlkZXM8SCwgSFA+ID0ge1xuICAgICAgaG9zdFByb3BzOiB7fSBhcyBhbnksXG4gICAgICBkZXRlY3RDaGFuZ2VzOiB0cnVlLFxuICAgICAgcHJvdmlkZXJzOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IHsgZGV0ZWN0Q2hhbmdlcywgaG9zdFByb3BzLCBwcm92aWRlcnMgfSA9IHsgLi4uZGVmYXVsdHMsIC4uLm92ZXJyaWRlcyB9O1xuXG4gICAgaWYgKHByb3ZpZGVycyAmJiBwcm92aWRlcnMubGVuZ3RoKSB7XG4gICAgICBwcm92aWRlcnMuZm9yRWFjaCgocHJvdmlkZXI6IFByb3ZpZGVyKSA9PiB7XG4gICAgICAgIFRlc3RCZWQub3ZlcnJpZGVQcm92aWRlcigocHJvdmlkZXIgYXMgYW55KS5wcm92aWRlLCBwcm92aWRlciBhcyBhbnkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgVGVzdEJlZC5vdmVycmlkZU1vZHVsZShCcm93c2VyRHluYW1pY1Rlc3RpbmdNb2R1bGUsIHt9KS5vdmVycmlkZUNvbXBvbmVudChvcHRpb25zLmhvc3QsIHtcbiAgICAgIHNldDogeyB0ZW1wbGF0ZTogdGVtcGxhdGUgfHwgb3B0aW9ucy50ZW1wbGF0ZSB9LFxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMuZGlyZWN0aXZlUHJvdmlkZXJzLmxlbmd0aCB8fCBvcHRpb25zLmRpcmVjdGl2ZU1vY2tzLmxlbmd0aCkge1xuICAgICAgVGVzdEJlZC5vdmVycmlkZURpcmVjdGl2ZShvcHRpb25zLmRpcmVjdGl2ZSwge1xuICAgICAgICBzZXQ6IHsgcHJvdmlkZXJzOiBbLi4ub3B0aW9ucy5kaXJlY3RpdmVQcm92aWRlcnMsIC4uLm9wdGlvbnMuZGlyZWN0aXZlTW9ja3MubWFwKChwKSA9PiBvcHRpb25zLm1vY2tQcm92aWRlcihwKSldIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGVjdGF0b3IgPSBjcmVhdGVTcGVjdGF0b3JEaXJlY3RpdmUob3B0aW9ucywgaG9zdFByb3BzKTtcblxuICAgIGlmIChvcHRpb25zLmRldGVjdENoYW5nZXMgJiYgZGV0ZWN0Q2hhbmdlcykge1xuICAgICAgc3BlY3RhdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3BlY3RhdG9yO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTcGVjdGF0b3JEaXJlY3RpdmU8RCwgSCwgSFA+KFxuICBvcHRpb25zOiBSZXF1aXJlZDxTcGVjdGF0b3JEaXJlY3RpdmVPcHRpb25zPEQsIEg+PixcbiAgaG9zdFByb3BzPzogSFAsXG4pOiBTcGVjdGF0b3JEaXJlY3RpdmU8RCwgSCAmIEhQPiB7XG4gIGNvbnN0IGhvc3RGaXh0dXJlID0gVGVzdEJlZC5jcmVhdGVDb21wb25lbnQob3B0aW9ucy5ob3N0KTtcbiAgY29uc3QgZGVidWdFbGVtZW50ID0gaG9zdEZpeHR1cmUuZGVidWdFbGVtZW50LnF1ZXJ5KEJ5LmRpcmVjdGl2ZShvcHRpb25zLmRpcmVjdGl2ZSkpIHx8IGhvc3RGaXh0dXJlLmRlYnVnRWxlbWVudDtcbiAgY29uc3QgZGVidWdOb2RlID0gaG9zdEZpeHR1cmUuZGVidWdFbGVtZW50LnF1ZXJ5QWxsTm9kZXMobm9kZUJ5RGlyZWN0aXZlKG9wdGlvbnMuZGlyZWN0aXZlKSlbMF07XG5cbiAgaWYgKCFkZWJ1Z05vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGRpcmVjdGl2ZSAke29wdGlvbnMuZGlyZWN0aXZlfSBpbiBob3N0IHRlbXBsYXRlIPCfmJRgKTtcbiAgfVxuXG4gIGNvbnN0IGhvc3RDb21wb25lbnQgPSBzZXRIb3N0UHJvcHMoaG9zdEZpeHR1cmUuY29tcG9uZW50UmVmLCBob3N0UHJvcHMpO1xuICBjb25zdCBkaXJlY3RpdmUgPSBkZWJ1Z05vZGUuaW5qZWN0b3IuZ2V0KG9wdGlvbnMuZGlyZWN0aXZlKTtcblxuICByZXR1cm4gbmV3IFNwZWN0YXRvckRpcmVjdGl2ZShob3N0Q29tcG9uZW50LCBob3N0Rml4dHVyZSwgaG9zdEZpeHR1cmUuZGVidWdFbGVtZW50LCBkaXJlY3RpdmUsIGRlYnVnRWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbn1cbiJdfQ==