{"version":3,"file":"testing.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/packages/router/testing/src/router_testing_module.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/packages/router/testing/src/router_testing_harness.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {provideLocationMocks} from '@angular/common/testing';\nimport {ModuleWithProviders, NgModule} from '@angular/core';\nimport {\n  ExtraOptions,\n  NoPreloading,\n  ROUTER_CONFIGURATION,\n  RouterModule,\n  ROUTES,\n  Routes,\n  withPreloading,\n  ɵROUTER_PROVIDERS as ROUTER_PROVIDERS,\n} from '../../index';\n\n/**\n * @description\n *\n * Sets up the router to be used for testing.\n *\n * The modules sets up the router to be used for testing.\n * It provides spy implementations of `Location` and `LocationStrategy`.\n *\n * @usageNotes\n * ### Example\n *\n * ```ts\n * beforeEach(() => {\n *   TestBed.configureTestingModule({\n *     imports: [\n *       RouterModule.forRoot(\n *         [{path: '', component: BlankCmp}, {path: 'simple', component: SimpleCmp}]\n *       )\n *     ]\n *   });\n * });\n * ```\n *\n * @publicApi\n * @deprecated Use `provideRouter` or `RouterModule`/`RouterModule.forRoot` instead.\n * This module was previously used to provide a helpful collection of test fakes,\n * most notably those for `Location` and `LocationStrategy`.  These are generally not\n * required anymore, as `MockPlatformLocation` is provided in `TestBed` by default.\n * However, you can use them directly with `provideLocationMocks`.\n */\n@NgModule({\n  exports: [RouterModule],\n  providers: [\n    ROUTER_PROVIDERS,\n    provideLocationMocks(),\n    withPreloading(NoPreloading).ɵproviders,\n    {provide: ROUTES, multi: true, useValue: []},\n  ],\n})\nexport class RouterTestingModule {\n  static withRoutes(\n    routes: Routes,\n    config?: ExtraOptions,\n  ): ModuleWithProviders<RouterTestingModule> {\n    return {\n      ngModule: RouterTestingModule,\n      providers: [\n        {provide: ROUTES, multi: true, useValue: routes},\n        {provide: ROUTER_CONFIGURATION, useValue: config ? config : {}},\n      ],\n    };\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  DebugElement,\n  Injectable,\n  Type,\n  ViewChild,\n  WritableSignal,\n  signal,\n} from '@angular/core';\nimport {ComponentFixture, TestBed} from '@angular/core/testing';\nimport {Router, RouterOutlet, ɵafterNextNavigation as afterNextNavigation} from '../../index';\n\n@Injectable({providedIn: 'root'})\nexport class RootFixtureService {\n  private fixture?: ComponentFixture<RootCmp>;\n  private harness?: RouterTestingHarness;\n\n  createHarness(): RouterTestingHarness {\n    if (this.harness) {\n      throw new Error('Only one harness should be created per test.');\n    }\n    this.harness = new RouterTestingHarness(this.getRootFixture());\n    return this.harness;\n  }\n\n  private getRootFixture(): ComponentFixture<RootCmp> {\n    if (this.fixture !== undefined) {\n      return this.fixture;\n    }\n    this.fixture = TestBed.createComponent(RootCmp);\n    this.fixture.detectChanges();\n    return this.fixture;\n  }\n}\n\n@Component({\n  template: '<router-outlet [routerOutletData]=\"routerOutletData()\"></router-outlet>',\n  imports: [RouterOutlet],\n  changeDetection: ChangeDetectionStrategy.Eager,\n})\nexport class RootCmp {\n  @ViewChild(RouterOutlet) outlet?: RouterOutlet;\n  readonly routerOutletData = signal<unknown>(undefined);\n}\n\n/**\n * A testing harness for the `Router` to reduce the boilerplate needed to test routes and routed\n * components.\n *\n * @publicApi\n */\nexport class RouterTestingHarness {\n  /**\n   * Creates a `RouterTestingHarness` instance.\n   *\n   * The `RouterTestingHarness` also creates its own root component with a `RouterOutlet` for the\n   * purposes of rendering route components.\n   *\n   * Throws an error if an instance has already been created.\n   * Use of this harness also requires `destroyAfterEach: true` in the `ModuleTeardownOptions`\n   *\n   * @param initialUrl The target of navigation to trigger before returning the harness.\n   */\n  static async create(initialUrl?: string): Promise<RouterTestingHarness> {\n    const harness = TestBed.inject(RootFixtureService).createHarness();\n    if (initialUrl !== undefined) {\n      await harness.navigateByUrl(initialUrl);\n    }\n    return harness;\n  }\n\n  /**\n   * Fixture of the root component of the RouterTestingHarness\n   */\n  public readonly fixture: ComponentFixture<{routerOutletData: WritableSignal<unknown>}>;\n\n  /** @internal */\n  constructor(fixture: ComponentFixture<{routerOutletData: WritableSignal<unknown>}>) {\n    this.fixture = fixture;\n  }\n\n  /** Instructs the root fixture to run change detection. */\n  detectChanges(): void {\n    this.fixture.detectChanges();\n  }\n  /** The `DebugElement` of the `RouterOutlet` component. `null` if the outlet is not activated. */\n  get routeDebugElement(): DebugElement | null {\n    const outlet = (this.fixture.componentInstance as RootCmp).outlet;\n    if (!outlet || !outlet.isActivated) {\n      return null;\n    }\n    return this.fixture.debugElement.query((v) => v.componentInstance === outlet.component);\n  }\n  /** The native element of the `RouterOutlet` component. `null` if the outlet is not activated. */\n  get routeNativeElement(): HTMLElement | null {\n    return this.routeDebugElement?.nativeElement ?? null;\n  }\n\n  /**\n   * Triggers a `Router` navigation and waits for it to complete.\n   *\n   * The root component with a `RouterOutlet` created for the harness is used to render `Route`\n   * components. The root component is reused within the same test in subsequent calls to\n   * `navigateForTest`.\n   *\n   * When testing `Routes` with a guards that reject the navigation, the `RouterOutlet` might not be\n   * activated and the `activatedComponent` may be `null`.\n   *\n   * {@example router/testing/test/router_testing_harness_examples.spec.ts region='Guard'}\n   *\n   * @param url The target of the navigation. Passed to `Router.navigateByUrl`.\n   * @returns The activated component instance of the `RouterOutlet` after navigation completes\n   *     (`null` if the outlet does not get activated).\n   */\n  async navigateByUrl(url: string): Promise<null | {}>;\n  /**\n   * Triggers a router navigation and waits for it to complete.\n   *\n   * The root component with a `RouterOutlet` created for the harness is used to render `Route`\n   * components.\n   *\n   * {@example router/testing/test/router_testing_harness_examples.spec.ts region='RoutedComponent'}\n   *\n   * The root component is reused within the same test in subsequent calls to `navigateByUrl`.\n   *\n   * This function also makes it easier to test components that depend on `ActivatedRoute` data.\n   *\n   * {@example router/testing/test/router_testing_harness_examples.spec.ts region='ActivatedRoute'}\n   *\n   * @param url The target of the navigation. Passed to `Router.navigateByUrl`.\n   * @param requiredRoutedComponentType After navigation completes, the required type for the\n   *     activated component of the `RouterOutlet`. If the outlet is not activated or a different\n   *     component is activated, this function will throw an error.\n   * @returns The activated component instance of the `RouterOutlet` after navigation completes.\n   */\n  async navigateByUrl<T>(url: string, requiredRoutedComponentType: Type<T>): Promise<T>;\n  async navigateByUrl<T>(url: string, requiredRoutedComponentType?: Type<T>): Promise<T | null> {\n    const router = TestBed.inject(Router);\n    let resolveFn!: () => void;\n    const redirectTrackingPromise = new Promise<void>((resolve) => {\n      resolveFn = resolve;\n    });\n    afterNextNavigation(TestBed.inject(Router), resolveFn);\n    await router.navigateByUrl(url);\n    await redirectTrackingPromise;\n    this.fixture.detectChanges();\n    const outlet = (this.fixture.componentInstance as RootCmp).outlet;\n    // The outlet might not be activated if the user is testing a navigation for a guard that\n    // rejects\n    if (outlet && outlet.isActivated && outlet.activatedRoute.component) {\n      const activatedComponent = outlet.component;\n      if (\n        requiredRoutedComponentType !== undefined &&\n        !(activatedComponent instanceof requiredRoutedComponentType)\n      ) {\n        throw new Error(\n          `Unexpected routed component type. Expected ${requiredRoutedComponentType.name} but got ${activatedComponent.constructor.name}`,\n        );\n      }\n      return activatedComponent as T;\n    } else {\n      if (requiredRoutedComponentType !== undefined) {\n        throw new Error(\n          `Unexpected routed component type. Expected ${requiredRoutedComponentType.name} but the navigation did not activate any component.`,\n        );\n      }\n      return null;\n    }\n  }\n}\n"],"names":["RouterTestingModule","withRoutes","routes","config","ngModule","providers","provide","ROUTES","multi","useValue","ROUTER_CONFIGURATION","deps","target","i0","ɵɵFactoryTarget","NgModule","ɵmod","ɵɵngDeclareNgModule","minVersion","version","ngImport","type","RouterModule","ɵinj","ɵɵngDeclareInjector","ROUTER_PROVIDERS","provideLocationMocks","withPreloading","NoPreloading","ɵproviders","imports","decorators","args","exports","RootFixtureService","fixture","harness","createHarness","Error","RouterTestingHarness","getRootFixture","undefined","TestBed","createComponent","RootCmp","detectChanges","Injectable","ɵprov","ɵɵngDeclareInjectable","providedIn","outlet","routerOutletData","signal","Component","ɵcmp","ɵɵngDeclareComponent","isStandalone","selector","viewQueries","propertyName","first","predicate","RouterOutlet","descendants","template","inputs","outputs","exportAs","changeDetection","ChangeDetectionStrategy","Eager","ViewChild","create","initialUrl","inject","navigateByUrl","constructor","routeDebugElement","componentInstance","isActivated","debugElement","query","v","component","routeNativeElement","nativeElement","url","requiredRoutedComponentType","router","Router","resolveFn","redirectTrackingPromise","Promise","resolve","afterNextNavigation","activatedRoute","activatedComponent","name"],"mappings":"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"}