Skip to content

Commit

Permalink
feat(Router): Import RouterTestingModule when stubs are enabled (#488)
Browse files Browse the repository at this point in the history
  • Loading branch information
AnthonyLenglet committed Sep 29, 2021
1 parent 53e8745 commit 5308c26
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 85 deletions.
2 changes: 1 addition & 1 deletion docs/docs/testing-with-routing.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,5 +120,5 @@ The `createRoutesFactory` function can take the following options, on top of the
* `children`: the value for `children` for the `ActivatedRoute` stub
* `firstChild`: the value for `firstChild` for the `ActivatedRoute` stub
* `fragment`: initial fragment to use in `ActivatedRoute` stub
* `stubsEnabled` (default: `true`): enables the `ActivatedRoute` stub, if set to `false` it uses `RouterTestingModule` instead
* `stubsEnabled` (default: `true`): enables the `ActivatedRoute` stub
* `routes`: if `stubsEnabled` is set to false, you can pass a `Routes` configuration for `RouterTestingModule`
Original file line number Diff line number Diff line change
Expand Up @@ -83,19 +83,6 @@ describe('MyPageComponent', () => {
});
});

describe('routerLinks', () => {
const createComponent = createRoutingFactory(MyPageComponent);

it('should mock routerLinks', () => {
const spectator = createComponent();

// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
const link1 = spectator.query('.link-1', { read: RouterLink })!;

expect(link1.routerLink).toEqual(['/foo']);
});
});

describe('default router mocking', () => {
const createComponent = createRoutingFactory({
component: MyPageComponent,
Expand Down
19 changes: 9 additions & 10 deletions projects/spectator/src/lib/spectator-routing/initial-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { initialSpectatorModule } from '../spectator/initial-module';

import { ActivatedRouteStub } from './activated-route-stub';
import { SpectatorRoutingOptions } from './options';
import { RouterLinkDirectiveStub } from './router-link-stub';
import { RouterStub } from './router-stub';

/**
Expand All @@ -16,21 +15,21 @@ import { RouterStub } from './router-stub';
export function initialRoutingModule<S>(options: Required<SpectatorRoutingOptions<S>>): ModuleMetadata {
const moduleMetadata = initialSpectatorModule(options);

if (options.mockRouterLinks && options.stubsEnabled) {
moduleMetadata.declarations.push(RouterLinkDirectiveStub);
}

if (options.stubsEnabled) {
moduleMetadata.imports.push(RouterTestingModule);
moduleMetadata.providers.push(
options.mockProvider(RouterStub, {
events: new Subject<Event>(),
emitRouterEvent(event: Event): void {
this.events.next(event);
}
},
serializeUrl(): string {
return '/';
},
}),
{
provide: Router,
useExisting: RouterStub
useExisting: RouterStub,
}
);

Expand All @@ -40,12 +39,12 @@ export function initialRoutingModule<S>(options: Required<SpectatorRoutingOption
useValue: new ActivatedRouteStub({
params: options.params,
queryParams: options.queryParams,
data: options.data
})
data: options.data,
}),
},
{
provide: ActivatedRoute,
useExisting: ActivatedRouteStub
useExisting: ActivatedRouteStub,
}
);
} else {
Expand Down
4 changes: 1 addition & 3 deletions projects/spectator/src/lib/spectator-routing/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import { RouteOptions } from './route-options';

export type SpectatorRoutingOptions<C> = SpectatorOptions<C> &
RouteOptions & {
mockRouterLinks?: boolean;
stubsEnabled?: boolean;
routes?: Routes;
};
Expand All @@ -19,14 +18,13 @@ const defaultRoutingOptions: OptionalsRequired<SpectatorRoutingOptions<any>> = {
queryParams: {},
data: {},
fragment: null,
mockRouterLinks: true,
stubsEnabled: true,
routes: [],
url: [],
root: null,
parent: null,
children: null,
firstChild: null
firstChild: null,
};

/**
Expand Down
37 changes: 0 additions & 37 deletions projects/spectator/src/lib/spectator-routing/router-link-stub.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Router, Event } from '@angular/router';

export abstract class RouterStub extends Router {
public abstract emitRouterEvent(event: Event): void;
public abstract serializeUrl(): string;
}

export function isRouterStub(router: Router): router is RouterStub {
Expand Down
12 changes: 0 additions & 12 deletions projects/spectator/test/with-routing/my-page.component.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,18 +95,6 @@ describe('MyPageComponent', () => {
});
});

describe('routerLinks', () => {
const createComponent = createRoutingFactory(MyPageComponent);

it('should mock routerLinks', () => {
const spectator = createComponent();

const link1 = spectator.query('.link-1', { read: RouterLink })!;

expect(link1.routerLink).toEqual(['/foo']);
});
});

describe('default router mocking', () => {
const createComponent = createRoutingFactory({
component: MyPageComponent,
Expand Down
43 changes: 34 additions & 9 deletions projects/spectator/test/with-routing/my-page.component.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router, UrlSegment } from '@angular/router';
import { CommonModule } from '@angular/common';
import { Component, NgModule, OnInit } from '@angular/core';
import { ActivatedRoute, Router, RouterModule, UrlSegment } from '@angular/router';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

Expand All @@ -13,7 +14,21 @@ import { map } from 'rxjs/operators';
<div class="baz">{{ baz$ | async }}</div>
<a class="link-1" [routerLink]="['/foo']">Some link</a>
<a class="link-2" (click)="navigate()">Other link</a>
`
<a
class="link-3"
[routerLink]="['/foo']"
[queryParams]="{ foo: 'bar' }"
queryParamsHandling="merge"
fragment="education"
[state]="{ tracingId: 123 }"
[skipLocationChange]="true"
[preserveFragment]="true"
[replaceUrl]="true"
[relativeTo]="null"
>
Some link With Extras
</a>
`,
})
export class MyPageComponent implements OnInit {
public title?: string;
Expand All @@ -32,13 +47,13 @@ export class MyPageComponent implements OnInit {

public ngOnInit(): void {
this.title = this.route.snapshot.data.title;
this.route.data.subscribe(data => (this.dynamicTitle = data.dynamicTitle));
this.route.data.subscribe((data) => (this.dynamicTitle = data.dynamicTitle));

this.route.params.subscribe(params => (this.foo = params.foo));
this.route.paramMap.subscribe(params => (this.bar = params.get('bar')!));
this.baz$ = this.route.queryParams.pipe(map(params => params.baz));
this.route.fragment.subscribe(fragment => (this.fragment = fragment));
this.route.url.subscribe(url => (this.url = url));
this.route.params.subscribe((params) => (this.foo = params.foo));
this.route.paramMap.subscribe((params) => (this.bar = params.get('bar')!));
this.baz$ = this.route.queryParams.pipe(map((params) => params.baz));
this.route.fragment.subscribe((fragment) => (this.fragment = fragment));
this.route.url.subscribe((url) => (this.url = url));
this.root = this.route.root;
this.parent = this.route.parent;
this.children = this.route.children;
Expand All @@ -49,3 +64,13 @@ export class MyPageComponent implements OnInit {
this.router.navigate(['bar']);
}
}

/*
This is an unused module to resolve the errors given by the angular language service:
"Can't bind to 'routerLink' since it isn't a known property of 'a'"
*/
@NgModule({
declarations: [MyPageComponent],
imports: [CommonModule, RouterModule],
})
export class RouterLinkDirectiveStubModule {}

0 comments on commit 5308c26

Please sign in to comment.