test(router): add Router regression test for hash location strategy (#40409)
This situation can probably happen only when using `HashLocationStrategy` and by manually changing hash that triggers a route guard that returns a new `UrlTree`. Then hash in the browser might not match the current route because navigation was canceled, while hash in the URL remained set by the user. Related to #37048 PR Close #40409
This commit is contained in:
parent
4329ccae2c
commit
0d55d4557f
|
@ -6,7 +6,8 @@
|
||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {CommonModule} from '@angular/common';
|
import {CommonModule, Location} from '@angular/common';
|
||||||
|
import {SpyLocation} from '@angular/common/testing';
|
||||||
import {ChangeDetectionStrategy, ChangeDetectorRef, Component, NgModule, TemplateRef, Type, ViewChild, ViewContainerRef} from '@angular/core';
|
import {ChangeDetectionStrategy, ChangeDetectorRef, Component, NgModule, TemplateRef, Type, ViewChild, ViewContainerRef} from '@angular/core';
|
||||||
import {ComponentFixture, fakeAsync, TestBed, tick} from '@angular/core/testing';
|
import {ComponentFixture, fakeAsync, TestBed, tick} from '@angular/core/testing';
|
||||||
import {Router} from '@angular/router';
|
import {Router} from '@angular/router';
|
||||||
|
@ -227,6 +228,54 @@ describe('Integration', () => {
|
||||||
expect(fixture.nativeElement.innerHTML).toContain('router-outlet');
|
expect(fixture.nativeElement.innerHTML).toContain('router-outlet');
|
||||||
expect(fixture.nativeElement.innerHTML).not.toContain('simple');
|
expect(fixture.nativeElement.innerHTML).not.toContain('simple');
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
describe('useHash', () => {
|
||||||
|
it('should restore hash to match current route - #28561', fakeAsync(() => {
|
||||||
|
@Component({selector: 'root-cmp', template: `<router-outlet></router-outlet>`})
|
||||||
|
class RootCmp {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Component({template: 'simple'})
|
||||||
|
class SimpleCmp {
|
||||||
|
}
|
||||||
|
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
imports: [RouterTestingModule.withRoutes([
|
||||||
|
{path: '', component: SimpleCmp},
|
||||||
|
{path: 'one', component: SimpleCmp, canActivate: ['returnRootUrlTree']}
|
||||||
|
])],
|
||||||
|
declarations: [SimpleCmp, RootCmp],
|
||||||
|
providers: [
|
||||||
|
{
|
||||||
|
provide: 'returnRootUrlTree',
|
||||||
|
useFactory: (router: Router) => () => {
|
||||||
|
return router.parseUrl('/');
|
||||||
|
},
|
||||||
|
deps: [Router]
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
const router = TestBed.inject(Router);
|
||||||
|
const location = TestBed.inject(Location) as SpyLocation;
|
||||||
|
|
||||||
|
router.navigateByUrl('/');
|
||||||
|
// Will setup location change listeners
|
||||||
|
const fixture = createRoot(router, RootCmp);
|
||||||
|
|
||||||
|
location.simulateHashChange('/one');
|
||||||
|
advance(fixture);
|
||||||
|
|
||||||
|
const BASE_ERROR_MESSAGE =
|
||||||
|
'This asserts current behavior, which is incorrect. When #28561 is fixed, it should be: ';
|
||||||
|
|
||||||
|
expect(location.path()).toEqual('/one', BASE_ERROR_MESSAGE + '/');
|
||||||
|
const urlChanges = ['replace: /', 'hash: /one'];
|
||||||
|
expect(location.urlChanges)
|
||||||
|
.toEqual(
|
||||||
|
urlChanges, BASE_ERROR_MESSAGE + JSON.stringify(urlChanges.concat('replace: /')));
|
||||||
|
}));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function advance<T>(fixture: ComponentFixture<T>): void {
|
function advance<T>(fixture: ComponentFixture<T>): void {
|
||||||
|
|
Loading…
Reference in New Issue