fix(router): allow to return `UrlTree` from `CanMatchFn` (#46455) · angular/angular@abe3759

@@ -16,7 +16,7 @@ import {ActivatedRoute, ActivatedRouteSnapshot, ActivationEnd, ActivationStart,

1616

import {EMPTY, Observable, Observer, of, Subscription} from 'rxjs';

1717

import {delay, filter, first, map, mapTo, tap} from 'rxjs/operators';

181819-

import {CanMatch} from '../src/models';

19+

import {CanMatch, CanMatchFn} from '../src/models';

2020

import {forEach} from '../src/utils/collection';

2121

import {getLoadedRoutes} from '../src/utils/config';

2222

import {RouterTestingModule} from '../testing';

@@ -4788,6 +4788,28 @@ describe('Integration', () => {

47884788

const fixture = createRoot(router, RootCmp);

47894789479047904791+

router.navigateByUrl('/a');

4792+

advance(fixture);

4793+

expect(fixture.nativeElement.innerHTML).toContain('team');

4794+

}));

4795+4796+

it('can return UrlTree from CanMatchFn guard', fakeAsync(() => {

4797+

const canMatchTeamSection = new InjectionToken('CanMatchTeamSection');

4798+

const canMatchFactory: (router: Router) => CanMatchFn = (router: Router) => () =>

4799+

router.createUrlTree(['/team/1']);

4800+4801+

TestBed.overrideProvider(

4802+

canMatchTeamSection, {useFactory: canMatchFactory, deps: [Router]});

4803+4804+

const router = TestBed.inject(Router);

4805+4806+

router.resetConfig([

4807+

{path: 'a', canMatch: [canMatchTeamSection], component: SimpleCmp},

4808+

{path: 'team/:id', component: TeamCmp},

4809+

]);

4810+

const fixture = createRoot(router, RootCmp);

4811+4812+47914813

router.navigateByUrl('/a');

47924814

advance(fixture);

47934815

expect(fixture.nativeElement.innerHTML).toContain('team');