fix(router): allow to return `UrlTree` from `CanMatchFn` (#46455) · angular/angular@abe3759
@@ -16,7 +16,7 @@ import {ActivatedRoute, ActivatedRouteSnapshot, ActivationEnd, ActivationStart,
1616import {EMPTY, Observable, Observer, of, Subscription} from 'rxjs';
1717import {delay, filter, first, map, mapTo, tap} from 'rxjs/operators';
181819-import {CanMatch} from '../src/models';
19+import {CanMatch, CanMatchFn} from '../src/models';
2020import {forEach} from '../src/utils/collection';
2121import {getLoadedRoutes} from '../src/utils/config';
2222import {RouterTestingModule} from '../testing';
@@ -4788,6 +4788,28 @@ describe('Integration', () => {
47884788const 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+47914813router.navigateByUrl('/a');
47924814advance(fixture);
47934815expect(fixture.nativeElement.innerHTML).toContain('team');