UNPKG

@ngneat/spectator

Version:

A powerful tool to simplify your Angular tests

70 lines 12.3 kB
import { NgZone } from '@angular/core'; import { TestBed, waitForAsync } from '@angular/core/testing'; import { ActivatedRoute, Router } from '@angular/router'; import { addMatchers } from '../core'; import { setProps } from '../internals/query'; import * as customMatchers from '../matchers'; import { overrideComponentIfProviderOverridesSpecified, overrideComponents, overrideDirectives, overrideModules, overridePipes, } from '../spectator/create-factory'; import { isType } from '../types'; import { ActivatedRouteStub } from './activated-route-stub'; import { initialRoutingModule } from './initial-module'; import { getRoutingDefaultOptions } from './options'; import { SpectatorRouting } from './spectator-routing'; /** * @publicApi */ export function createRoutingFactory(typeOrOptions) { const options = isType(typeOrOptions) ? getRoutingDefaultOptions({ component: typeOrOptions }) : getRoutingDefaultOptions(typeOrOptions); const moduleMetadata = initialRoutingModule(options); beforeEach(waitForAsync(() => { addMatchers(customMatchers); TestBed.configureTestingModule(moduleMetadata); 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 { params, queryParams, data, fragment, url, root, parent, children, firstChild } = { ...options, ...overrides }; TestBed.overrideProvider(ActivatedRoute, { useValue: new ActivatedRouteStub({ params, queryParams, data, fragment, url, root, parent, children, firstChild }), }); const ngZone = TestBed.inject ? TestBed.inject(NgZone) : TestBed.get(NgZone); return ngZone.run(() => { const spectator = createSpectatorRouting(options, props); spectator.router.initialNavigation(); if (options.detectChanges && detectChanges) { spectator.detectChanges(); } return spectator; }); }; } function createSpectatorRouting(options, props) { const fixture = TestBed.createComponent(options.component); const debugElement = fixture.debugElement; const component = setProps(fixture.componentRef, props); /** * Back compatibility, angular under 9 version doesnt have a inject function */ if (!TestBed.inject) { return new SpectatorRouting(fixture, debugElement, component, TestBed.get(Router), TestBed.get(ActivatedRoute)); } return new SpectatorRouting(fixture, debugElement, component, TestBed.inject(Router), TestBed.inject(ActivatedRoute)); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVjdGF0b3Ivc3JjL2xpYi9zcGVjdGF0b3Itcm91dGluZy9jcmVhdGUtZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxLQUFLLGNBQWMsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUNMLDZDQUE2QyxFQUM3QyxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixhQUFhLEdBRWQsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQXFCLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUdyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQTJCLE1BQU0sV0FBVyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBWXZEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFJLGFBQW1EO0lBQ3pGLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDbkMsQ0FBQyxDQUFDLHdCQUF3QixDQUFJLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQzNE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RDs7T0FFRztJQUNILElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEIsT0FBTyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFRCxPQUFPLElBQUksZ0JBQWdCLENBQ3pCLE9BQU8sRUFDUCxZQUFZLEVBQ1osU0FBUyxFQUNULE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQ3RCLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFrQyxDQUNoRSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nWm9uZSwgUHJvdmlkZXIsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRlc3RCZWQsIHdhaXRGb3JBc3luYyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvdGVzdGluZyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgYWRkTWF0Y2hlcnMgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IHNldFByb3BzIH0gZnJvbSAnLi4vaW50ZXJuYWxzL3F1ZXJ5JztcbmltcG9ydCAqIGFzIGN1c3RvbU1hdGNoZXJzIGZyb20gJy4uL21hdGNoZXJzJztcbmltcG9ydCB7XG4gIG92ZXJyaWRlQ29tcG9uZW50SWZQcm92aWRlck92ZXJyaWRlc1NwZWNpZmllZCxcbiAgb3ZlcnJpZGVDb21wb25lbnRzLFxuICBvdmVycmlkZURpcmVjdGl2ZXMsXG4gIG92ZXJyaWRlTW9kdWxlcyxcbiAgb3ZlcnJpZGVQaXBlcyxcbiAgU3BlY3RhdG9yT3ZlcnJpZGVzLFxufSBmcm9tICcuLi9zcGVjdGF0b3IvY3JlYXRlLWZhY3RvcnknO1xuaW1wb3J0IHsgSW5mZXJJbnB1dFNpZ25hbHMsIGlzVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgU3B5T2JqZWN0IH0gZnJvbSAnLi4vbW9jayc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVN0dWIgfSBmcm9tICcuL2FjdGl2YXRlZC1yb3V0ZS1zdHViJztcbmltcG9ydCB7IGluaXRpYWxSb3V0aW5nTW9kdWxlIH0gZnJvbSAnLi9pbml0aWFsLW1vZHVsZSc7XG5pbXBvcnQgeyBnZXRSb3V0aW5nRGVmYXVsdE9wdGlvbnMsIFNwZWN0YXRvclJvdXRpbmdPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IFJvdXRlT3B0aW9ucyB9IGZyb20gJy4vcm91dGUtb3B0aW9ucyc7XG5pbXBvcnQgeyBTcGVjdGF0b3JSb3V0aW5nIH0gZnJvbSAnLi9zcGVjdGF0b3Itcm91dGluZyc7XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgdHlwZSBTcGVjdGF0b3JSb3V0aW5nT3ZlcnJpZGVzPEM+ID0gU3BlY3RhdG9yT3ZlcnJpZGVzPEM+ICYgUm91dGVPcHRpb25zO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IHR5cGUgU3BlY3RhdG9yUm91dGluZ0ZhY3Rvcnk8Qz4gPSAob3B0aW9ucz86IFNwZWN0YXRvclJvdXRpbmdPdmVycmlkZXM8Qz4pID0+IFNwZWN0YXRvclJvdXRpbmc8Qz47XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGluZ0ZhY3Rvcnk8Qz4odHlwZU9yT3B0aW9uczogVHlwZTxDPiB8IFNwZWN0YXRvclJvdXRpbmdPcHRpb25zPEM+KTogU3BlY3RhdG9yUm91dGluZ0ZhY3Rvcnk8Qz4ge1xuICBjb25zdCBvcHRpb25zID0gaXNUeXBlKHR5cGVPck9wdGlvbnMpXG4gICAgPyBnZXRSb3V0aW5nRGVmYXVsdE9wdGlvbnM8Qz4oeyBjb21wb25lbnQ6IHR5cGVPck9wdGlvbnMgfSlcbiAgICA6IGdldFJvdXRpbmdEZWZhdWx0T3B0aW9ucyh0eXBlT3JPcHRpb25zKTtcblxuICBjb25zdCBtb2R1bGVNZXRhZGF0YSA9IGluaXRpYWxSb3V0aW5nTW9kdWxlPEM+KG9wdGlvbnMpO1xuXG4gIGJlZm9yZUVhY2god2FpdEZvckFzeW5jKCgpID0+IHtcbiAgICBhZGRNYXRjaGVycyhjdXN0b21NYXRjaGVycyk7XG4gICAgVGVzdEJlZC5jb25maWd1cmVUZXN0aW5nTW9kdWxlKG1vZHVsZU1ldGFkYXRhKTtcblxuICAgIG92ZXJyaWRlTW9kdWxlcyhvcHRpb25zKTtcbiAgICBvdmVycmlkZUNvbXBvbmVudHMob3B0aW9ucyk7XG4gICAgb3ZlcnJpZGVEaXJlY3RpdmVzKG9wdGlvbnMpO1xuICAgIG92ZXJyaWRlUGlwZXMob3B0aW9ucyk7XG5cbiAgICBvdmVycmlkZUNvbXBvbmVudElmUHJvdmlkZXJPdmVycmlkZXNTcGVjaWZpZWQob3B0aW9ucyk7XG5cbiAgICBUZXN0QmVkLmNvbXBpbGVDb21wb25lbnRzKCk7XG4gIH0pKTtcblxuICByZXR1cm4gKG92ZXJyaWRlcz86IFNwZWN0YXRvclJvdXRpbmdPdmVycmlkZXM8Qz4pID0+IHtcbiAgICBjb25zdCBkZWZhdWx0czogU3BlY3RhdG9yUm91dGluZ092ZXJyaWRlczxDPiA9IHtcbiAgICAgIHByb3BzOiB7fSxcbiAgICAgIGRldGVjdENoYW5nZXM6IHRydWUsXG4gICAgICBwcm92aWRlcnM6IFtdLFxuICAgIH07XG5cbiAgICBjb25zdCB7IGRldGVjdENoYW5nZXMsIHByb3BzLCBwcm92aWRlcnMgfSA9IHsgLi4uZGVmYXVsdHMsIC4uLm92ZXJyaWRlcyB9O1xuXG4gICAgaWYgKHByb3ZpZGVycyAmJiBwcm92aWRlcnMubGVuZ3RoKSB7XG4gICAgICBwcm92aWRlcnMuZm9yRWFjaCgocHJvdmlkZXI6IFByb3ZpZGVyKSA9PiB7XG4gICAgICAgIFRlc3RCZWQub3ZlcnJpZGVQcm92aWRlcigocHJvdmlkZXIgYXMgYW55KS5wcm92aWRlLCBwcm92aWRlciBhcyBhbnkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYXJhbXMsIHF1ZXJ5UGFyYW1zLCBkYXRhLCBmcmFnbWVudCwgdXJsLCByb290LCBwYXJlbnQsIGNoaWxkcmVuLCBmaXJzdENoaWxkIH0gPSB7IC4uLm9wdGlvbnMsIC4uLm92ZXJyaWRlcyB9O1xuXG4gICAgVGVzdEJlZC5vdmVycmlkZVByb3ZpZGVyKEFjdGl2YXRlZFJvdXRlLCB7XG4gICAgICB1c2VWYWx1ZTogbmV3IEFjdGl2YXRlZFJvdXRlU3R1Yih7IHBhcmFtcywgcXVlcnlQYXJhbXMsIGRhdGEsIGZyYWdtZW50LCB1cmwsIHJvb3QsIHBhcmVudCwgY2hpbGRyZW4sIGZpcnN0Q2hpbGQgfSksXG4gICAgfSk7XG4gICAgY29uc3Qgbmdab25lID0gKDxhbnk+VGVzdEJlZCkuaW5qZWN0ID8gVGVzdEJlZC5pbmplY3QoTmdab25lKSA6IFRlc3RCZWQuZ2V0KE5nWm9uZSk7XG5cbiAgICByZXR1cm4gbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICBjb25zdCBzcGVjdGF0b3IgPSBjcmVhdGVTcGVjdGF0b3JSb3V0aW5nKG9wdGlvbnMsIHByb3BzKTtcblxuICAgICAgc3BlY3RhdG9yLnJvdXRlci5pbml0aWFsTmF2aWdhdGlvbigpO1xuXG4gICAgICBpZiAob3B0aW9ucy5kZXRlY3RDaGFuZ2VzICYmIGRldGVjdENoYW5nZXMpIHtcbiAgICAgICAgc3BlY3RhdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNwZWN0YXRvcjtcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3BlY3RhdG9yUm91dGluZzxDPihvcHRpb25zOiBSZXF1aXJlZDxTcGVjdGF0b3JSb3V0aW5nT3B0aW9uczxDPj4sIHByb3BzPzogSW5mZXJJbnB1dFNpZ25hbHM8Qz4pOiBTcGVjdGF0b3JSb3V0aW5nPEM+IHtcbiAgY29uc3QgZml4dHVyZSA9IFRlc3RCZWQuY3JlYXRlQ29tcG9uZW50KG9wdGlvbnMuY29tcG9uZW50KTtcbiAgY29uc3QgZGVidWdFbGVtZW50ID0gZml4dHVyZS5kZWJ1Z0VsZW1lbnQ7XG5cbiAgY29uc3QgY29tcG9uZW50ID0gc2V0UHJvcHMoZml4dHVyZS5jb21wb25lbnRSZWYsIHByb3BzKTtcblxuICAvKipcbiAgICogQmFjayBjb21wYXRpYmlsaXR5LCBhbmd1bGFyIHVuZGVyIDkgdmVyc2lvbiBkb2VzbnQgaGF2ZSBhIGluamVjdCBmdW5jdGlvblxuICAgKi9cbiAgaWYgKCFUZXN0QmVkLmluamVjdCkge1xuICAgIHJldHVybiBuZXcgU3BlY3RhdG9yUm91dGluZyhmaXh0dXJlLCBkZWJ1Z0VsZW1lbnQsIGNvbXBvbmVudCwgVGVzdEJlZC5nZXQoUm91dGVyKSwgVGVzdEJlZC5nZXQoQWN0aXZhdGVkUm91dGUpKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU3BlY3RhdG9yUm91dGluZyhcbiAgICBmaXh0dXJlLFxuICAgIGRlYnVnRWxlbWVudCxcbiAgICBjb21wb25lbnQsXG4gICAgVGVzdEJlZC5pbmplY3QoUm91dGVyKSxcbiAgICBUZXN0QmVkLmluamVjdChBY3RpdmF0ZWRSb3V0ZSkgYXMgU3B5T2JqZWN0PEFjdGl2YXRlZFJvdXRlU3R1Yj4sXG4gICk7XG59XG4iXX0=