UNPKG

@ngneat/spectator

Version:

A powerful tool to simplify your Angular tests

127 lines 18 kB
import { isStandalone, reflectComponentType } from '@angular/core'; import { TestBed, waitForAsync } from '@angular/core/testing'; import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; import { addMatchers } from '../core'; import { setProps } from '../internals/query'; import * as customMatchers from '../matchers'; import { isType } from '../types'; import { initialSpectatorModule } from './initial-module'; import { getSpectatorDefaultOptions } from './options'; import { Spectator } from './spectator'; /** * @internal */ export function overrideComponentIfProviderOverridesSpecified(options) { const hasProviderOverrides = options.componentProviders.length || options.componentMocks.length; const hasViewProviders = options.componentViewProviders.length || options.componentViewProvidersMocks.length; if (hasProviderOverrides || hasViewProviders) { let providerConfiguration = {}; if (hasProviderOverrides) { providerConfiguration = { providers: [...options.componentProviders, ...options.componentMocks.map((p) => options.mockProvider(p))], }; } if (hasViewProviders) { providerConfiguration = { ...providerConfiguration, viewProviders: [...options.componentViewProviders, ...options.componentViewProvidersMocks.map((p) => options.mockProvider(p))], }; } TestBed.overrideComponent(options.component, { set: providerConfiguration, }); } } /** * @internal */ export function overrideModules(options) { if (options.overrideModules.length) { options.overrideModules.forEach((overrideModule) => { const [ngModule, override] = overrideModule; TestBed.overrideModule(ngModule, override); }); } } /** * @internal */ export function overrideComponents(options) { if (options.overrideComponents.length) { options.overrideComponents.forEach((overrideComponent) => { const [component, override] = overrideComponent; if (!reflectComponentType(component)?.isStandalone) { throw new Error(`Can not override non standalone component`); } TestBed.overrideComponent(component, override); }); } } /** * @internal */ export function overrideDirectives(options) { if (options.overrideDirectives.length) { options.overrideDirectives.forEach((overrideDirective) => { const [directive, override] = overrideDirective; if (!isStandalone(directive)) { throw new Error(`Can not override non standalone directive`); } TestBed.overrideDirective(directive, override); }); } } /** * @internal */ export function overridePipes(options) { if (options.overridePipes.length) { options.overridePipes.forEach((overridePipe) => { const [pipe, override] = overridePipe; if (!isStandalone(pipe)) { throw new Error(`Can not override non standalone pipe`); } TestBed.overridePipe(pipe, override); }); } } /** * @publicApi */ export function createComponentFactory(typeOrOptions) { const options = isType(typeOrOptions) ? getSpectatorDefaultOptions({ component: typeOrOptions }) : getSpectatorDefaultOptions(typeOrOptions); const moduleMetadata = initialSpectatorModule(options); beforeEach(waitForAsync(() => { addMatchers(customMatchers); TestBed.configureTestingModule(moduleMetadata).overrideModule(BrowserDynamicTestingModule, {}); overrideModules(options); overrideComponents(options); overrideDirectives(options); overridePipes(options); overrideComponentIfProviderOverridesSpecified(options); TestBed.compileComponents(); })); return (overrides) => { const defaults = { props: {}, detectChanges: true, providers: [] }; const { detectChanges, props, providers } = { ...defaults, ...overrides }; if (providers && providers.length) { providers.forEach((provider) => { TestBed.overrideProvider(provider.provide, provider); }); } const spectator = createSpectator(options, props); if (options.detectChanges && detectChanges) { spectator.detectChanges(); } return spectator; }; } function createSpectator(options, props) { const fixture = TestBed.createComponent(options.component); const debugElement = fixture.debugElement; const component = setProps(fixture.componentRef, props); return new Spectator(fixture, debugElement, component, debugElement.nativeElement); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVjdGF0b3Ivc3JjL2xpYi9zcGVjdGF0b3IvY3JlYXRlLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBWSxvQkFBb0IsRUFBUSxNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBR3hGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxjQUFjLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBcUIsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXJELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSwwQkFBMEIsRUFBb0IsTUFBTSxXQUFXLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWV4Qzs7R0FFRztBQUNILE1BQU0sVUFBVSw2Q0FBNkMsQ0FBSSxPQUFzQztJQUNyRyxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7SUFDaEcsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUM7SUFDN0csSUFBSSxvQkFBb0IsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQzdDLElBQUkscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQy9C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dFR5cGUsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRlc3RCZWQsIHdhaXRGb3JBc3luYyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvdGVzdGluZyc7XG5pbXBvcnQgeyBCcm93c2VyRHluYW1pY1Rlc3RpbmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMvdGVzdGluZyc7XG5cbmltcG9ydCB7IEJhc2VTcGVjdGF0b3JPcHRpb25zLCBCYXNlU3BlY3RhdG9yT3ZlcnJpZGVzIH0gZnJvbSAnLi4vYmFzZS9vcHRpb25zJztcbmltcG9ydCB7IGFkZE1hdGNoZXJzIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyBzZXRQcm9wcyB9IGZyb20gJy4uL2ludGVybmFscy9xdWVyeSc7XG5pbXBvcnQgKiBhcyBjdXN0b21NYXRjaGVycyBmcm9tICcuLi9tYXRjaGVycyc7XG5pbXBvcnQgeyBJbmZlcklucHV0U2lnbmFscywgaXNUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBpbml0aWFsU3BlY3RhdG9yTW9kdWxlIH0gZnJvbSAnLi9pbml0aWFsLW1vZHVsZSc7XG5pbXBvcnQgeyBnZXRTcGVjdGF0b3JEZWZhdWx0T3B0aW9ucywgU3BlY3RhdG9yT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBTcGVjdGF0b3IgfSBmcm9tICcuL3NwZWN0YXRvcic7XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgdHlwZSBTcGVjdGF0b3JGYWN0b3J5PEM+ID0gKG9wdGlvbnM/OiBTcGVjdGF0b3JPdmVycmlkZXM8Qz4pID0+IFNwZWN0YXRvcjxDPjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BlY3RhdG9yT3ZlcnJpZGVzPEM+IGV4dGVuZHMgQmFzZVNwZWN0YXRvck92ZXJyaWRlcyB7XG4gIGRldGVjdENoYW5nZXM/OiBib29sZWFuO1xuICBwcm9wcz86IEluZmVySW5wdXRTaWduYWxzPEM+O1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gb3ZlcnJpZGVDb21wb25lbnRJZlByb3ZpZGVyT3ZlcnJpZGVzU3BlY2lmaWVkPEM+KG9wdGlvbnM6IFJlcXVpcmVkPFNwZWN0YXRvck9wdGlvbnM8Qz4+KTogdm9pZCB7XG4gIGNvbnN0IGhhc1Byb3ZpZGVyT3ZlcnJpZGVzID0gb3B0aW9ucy5jb21wb25lbnRQcm92aWRlcnMubGVuZ3RoIHx8IG9wdGlvbnMuY29tcG9uZW50TW9ja3MubGVuZ3RoO1xuICBjb25zdCBoYXNWaWV3UHJvdmlkZXJzID0gb3B0aW9ucy5jb21wb25lbnRWaWV3UHJvdmlkZXJzLmxlbmd0aCB8fCBvcHRpb25zLmNvbXBvbmVudFZpZXdQcm92aWRlcnNNb2Nrcy5sZW5ndGg7XG4gIGlmIChoYXNQcm92aWRlck92ZXJyaWRlcyB8fCBoYXNWaWV3UHJvdmlkZXJzKSB7XG4gICAgbGV0IHByb3ZpZGVyQ29uZmlndXJhdGlvbiA9IHt9O1xuICAgIGlmIChoYXNQcm92aWRlck92ZXJyaWRlcykge1xuICAgICAgcHJvdmlkZXJDb25maWd1cmF0aW9uID0ge1xuICAgICAgICBwcm92aWRlcnM6IFsuLi5vcHRpb25zLmNvbXBvbmVudFByb3ZpZGVycywgLi4ub3B0aW9ucy5jb21wb25lbnRNb2Nrcy5tYXAoKHApID0+IG9wdGlvbnMubW9ja1Byb3ZpZGVyKHApKV0sXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoaGFzVmlld1Byb3ZpZGVycykge1xuICAgICAgcHJvdmlkZXJDb25maWd1cmF0aW9uID0ge1xuICAgICAgICAuLi5wcm92aWRlckNvbmZpZ3VyYXRpb24sXG4gICAgICAgIHZpZXdQcm92aWRlcnM6IFsuLi5vcHRpb25zLmNvbXBvbmVudFZpZXdQcm92aWRlcnMsIC4uLm9wdGlvbnMuY29tcG9uZW50Vmlld1Byb3ZpZGVyc01vY2tzLm1hcCgocCkgPT4gb3B0aW9ucy5tb2NrUHJvdmlkZXIocCkpXSxcbiAgICAgIH07XG4gICAgfVxuICAgIFRlc3RCZWQub3ZlcnJpZGVDb21wb25lbnQob3B0aW9ucy5jb21wb25lbnQsIHtcbiAgICAgIHNldDogcHJvdmlkZXJDb25maWd1cmF0aW9uLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdmVycmlkZU1vZHVsZXMob3B0aW9uczogUmVxdWlyZWQ8QmFzZVNwZWN0YXRvck9wdGlvbnM+KTogdm9pZCB7XG4gIGlmIChvcHRpb25zLm92ZXJyaWRlTW9kdWxlcy5sZW5ndGgpIHtcbiAgICBvcHRpb25zLm92ZXJyaWRlTW9kdWxlcy5mb3JFYWNoKChvdmVycmlkZU1vZHVsZSkgPT4ge1xuICAgICAgY29uc3QgW25nTW9kdWxlLCBvdmVycmlkZV0gPSBvdmVycmlkZU1vZHVsZTtcblxuICAgICAgVGVzdEJlZC5vdmVycmlkZU1vZHVsZShuZ01vZHVsZSwgb3ZlcnJpZGUpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdmVycmlkZUNvbXBvbmVudHMob3B0aW9uczogUmVxdWlyZWQ8QmFzZVNwZWN0YXRvck9wdGlvbnM+KTogdm9pZCB7XG4gIGlmIChvcHRpb25zLm92ZXJyaWRlQ29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICBvcHRpb25zLm92ZXJyaWRlQ29tcG9uZW50cy5mb3JFYWNoKChvdmVycmlkZUNvbXBvbmVudCkgPT4ge1xuICAgICAgY29uc3QgW2NvbXBvbmVudCwgb3ZlcnJpZGVdID0gb3ZlcnJpZGVDb21wb25lbnQ7XG5cbiAgICAgIGlmICghcmVmbGVjdENvbXBvbmVudFR5cGUoY29tcG9uZW50KT8uaXNTdGFuZGFsb25lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuIG5vdCBvdmVycmlkZSBub24gc3RhbmRhbG9uZSBjb21wb25lbnRgKTtcbiAgICAgIH1cblxuICAgICAgVGVzdEJlZC5vdmVycmlkZUNvbXBvbmVudChjb21wb25lbnQsIG92ZXJyaWRlKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gb3ZlcnJpZGVEaXJlY3RpdmVzKG9wdGlvbnM6IFJlcXVpcmVkPEJhc2VTcGVjdGF0b3JPcHRpb25zPik6IHZvaWQge1xuICBpZiAob3B0aW9ucy5vdmVycmlkZURpcmVjdGl2ZXMubGVuZ3RoKSB7XG4gICAgb3B0aW9ucy5vdmVycmlkZURpcmVjdGl2ZXMuZm9yRWFjaCgob3ZlcnJpZGVEaXJlY3RpdmUpID0+IHtcbiAgICAgIGNvbnN0IFtkaXJlY3RpdmUsIG92ZXJyaWRlXSA9IG92ZXJyaWRlRGlyZWN0aXZlO1xuXG4gICAgICBpZiAoIWlzU3RhbmRhbG9uZShkaXJlY3RpdmUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuIG5vdCBvdmVycmlkZSBub24gc3RhbmRhbG9uZSBkaXJlY3RpdmVgKTtcbiAgICAgIH1cblxuICAgICAgVGVzdEJlZC5vdmVycmlkZURpcmVjdGl2ZShkaXJlY3RpdmUsIG92ZXJyaWRlKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gb3ZlcnJpZGVQaXBlcyhvcHRpb25zOiBSZXF1aXJlZDxCYXNlU3BlY3RhdG9yT3B0aW9ucz4pOiB2b2lkIHtcbiAgaWYgKG9wdGlvbnMub3ZlcnJpZGVQaXBlcy5sZW5ndGgpIHtcbiAgICBvcHRpb25zLm92ZXJyaWRlUGlwZXMuZm9yRWFjaCgob3ZlcnJpZGVQaXBlKSA9PiB7XG4gICAgICBjb25zdCBbcGlwZSwgb3ZlcnJpZGVdID0gb3ZlcnJpZGVQaXBlO1xuXG4gICAgICBpZiAoIWlzU3RhbmRhbG9uZShwaXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbiBub3Qgb3ZlcnJpZGUgbm9uIHN0YW5kYWxvbmUgcGlwZWApO1xuICAgICAgfVxuXG4gICAgICBUZXN0QmVkLm92ZXJyaWRlUGlwZShwaXBlLCBvdmVycmlkZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb21wb25lbnRGYWN0b3J5PEM+KHR5cGVPck9wdGlvbnM6IFR5cGU8Qz4gfCBTcGVjdGF0b3JPcHRpb25zPEM+KTogU3BlY3RhdG9yRmFjdG9yeTxDPiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBpc1R5cGUodHlwZU9yT3B0aW9ucylcbiAgICA/IGdldFNwZWN0YXRvckRlZmF1bHRPcHRpb25zPEM+KHsgY29tcG9uZW50OiB0eXBlT3JPcHRpb25zIH0pXG4gICAgOiBnZXRTcGVjdGF0b3JEZWZhdWx0T3B0aW9ucyh0eXBlT3JPcHRpb25zKTtcblxuICBjb25zdCBtb2R1bGVNZXRhZGF0YSA9IGluaXRpYWxTcGVjdGF0b3JNb2R1bGU8Qz4ob3B0aW9ucyk7XG5cbiAgYmVmb3JlRWFjaCh3YWl0Rm9yQXN5bmMoKCkgPT4ge1xuICAgIGFkZE1hdGNoZXJzKGN1c3RvbU1hdGNoZXJzKTtcbiAgICBUZXN0QmVkLmNvbmZpZ3VyZVRlc3RpbmdNb2R1bGUobW9kdWxlTWV0YWRhdGEpLm92ZXJyaWRlTW9kdWxlKEJyb3dzZXJEeW5hbWljVGVzdGluZ01vZHVsZSwge30pO1xuXG4gICAgb3ZlcnJpZGVNb2R1bGVzKG9wdGlvbnMpO1xuICAgIG92ZXJyaWRlQ29tcG9uZW50cyhvcHRpb25zKTtcbiAgICBvdmVycmlkZURpcmVjdGl2ZXMob3B0aW9ucyk7XG4gICAgb3ZlcnJpZGVQaXBlcyhvcHRpb25zKTtcblxuICAgIG92ZXJyaWRlQ29tcG9uZW50SWZQcm92aWRlck92ZXJyaWRlc1NwZWNpZmllZChvcHRpb25zKTtcblxuICAgIFRlc3RCZWQuY29tcGlsZUNvbXBvbmVudHMoKTtcbiAgfSkpO1xuXG4gIHJldHVybiAob3ZlcnJpZGVzPzogU3BlY3RhdG9yT3ZlcnJpZGVzPEM+KSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHM6IFNwZWN0YXRvck92ZXJyaWRlczxDPiA9IHsgcHJvcHM6IHt9LCBkZXRlY3RDaGFuZ2VzOiB0cnVlLCBwcm92aWRlcnM6IFtdIH07XG4gICAgY29uc3QgeyBkZXRlY3RDaGFuZ2VzLCBwcm9wcywgcHJvdmlkZXJzIH0gPSB7IC4uLmRlZmF1bHRzLCAuLi5vdmVycmlkZXMgfTtcblxuICAgIGlmIChwcm92aWRlcnMgJiYgcHJvdmlkZXJzLmxlbmd0aCkge1xuICAgICAgcHJvdmlkZXJzLmZvckVhY2goKHByb3ZpZGVyOiBQcm92aWRlcikgPT4ge1xuICAgICAgICBUZXN0QmVkLm92ZXJyaWRlUHJvdmlkZXIoKHByb3ZpZGVyIGFzIGFueSkucHJvdmlkZSwgcHJvdmlkZXIgYXMgYW55KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNwZWN0YXRvciA9IGNyZWF0ZVNwZWN0YXRvcihvcHRpb25zLCBwcm9wcyk7XG5cbiAgICBpZiAob3B0aW9ucy5kZXRlY3RDaGFuZ2VzICYmIGRldGVjdENoYW5nZXMpIHtcbiAgICAgIHNwZWN0YXRvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNwZWN0YXRvcjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3BlY3RhdG9yPEM+KG9wdGlvbnM6IFJlcXVpcmVkPFNwZWN0YXRvck9wdGlvbnM8Qz4+LCBwcm9wcz86IEluZmVySW5wdXRTaWduYWxzPEM+KTogU3BlY3RhdG9yPEM+IHtcbiAgY29uc3QgZml4dHVyZSA9IFRlc3RCZWQuY3JlYXRlQ29tcG9uZW50KG9wdGlvbnMuY29tcG9uZW50KTtcbiAgY29uc3QgZGVidWdFbGVtZW50ID0gZml4dHVyZS5kZWJ1Z0VsZW1lbnQ7XG5cbiAgY29uc3QgY29tcG9uZW50ID0gc2V0UHJvcHMoZml4dHVyZS5jb21wb25lbnRSZWYsIHByb3BzKTtcblxuICByZXR1cm4gbmV3IFNwZWN0YXRvcihmaXh0dXJlLCBkZWJ1Z0VsZW1lbnQsIGNvbXBvbmVudCwgZGVidWdFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xufVxuIl19