Update the license headers throughout the repository to reference Google LLC rather than Google Inc, for the required license headers. PR Close #37205
		
			
				
	
	
		
			126 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
/**
 | 
						|
 * @license
 | 
						|
 * Copyright Google LLC All Rights Reserved.
 | 
						|
 *
 | 
						|
 * Use of this source code is governed by an MIT-style license that can be
 | 
						|
 * found in the LICENSE file at https://angular.io/license
 | 
						|
 */
 | 
						|
 | 
						|
import {Location} from '@angular/common';
 | 
						|
import {TestBed} from '@angular/core/testing';
 | 
						|
import {Router} from '@angular/router';
 | 
						|
import {setUpLocationSync} from '@angular/router/upgrade';
 | 
						|
import {UpgradeModule} from '@angular/upgrade/static';
 | 
						|
 | 
						|
describe('setUpLocationSync', () => {
 | 
						|
  let upgradeModule: UpgradeModule;
 | 
						|
  let RouterMock: any;
 | 
						|
  let LocationMock: any;
 | 
						|
 | 
						|
  beforeEach(() => {
 | 
						|
    RouterMock = jasmine.createSpyObj('Router', ['navigateByUrl']);
 | 
						|
    LocationMock = jasmine.createSpyObj('Location', ['normalize']);
 | 
						|
 | 
						|
    TestBed.configureTestingModule({
 | 
						|
      providers: [
 | 
						|
        UpgradeModule, {provide: Router, useValue: RouterMock},
 | 
						|
        {provide: Location, useValue: LocationMock}
 | 
						|
      ],
 | 
						|
    });
 | 
						|
 | 
						|
    upgradeModule = TestBed.inject(UpgradeModule);
 | 
						|
    upgradeModule.$injector = {
 | 
						|
      get: jasmine.createSpy('$injector.get').and.returnValue({'$on': () => undefined})
 | 
						|
    };
 | 
						|
  });
 | 
						|
 | 
						|
  it('should throw an error if the UpgradeModule.bootstrap has not been called', () => {
 | 
						|
    upgradeModule.$injector = null;
 | 
						|
 | 
						|
    expect(() => setUpLocationSync(upgradeModule)).toThrowError(`
 | 
						|
        RouterUpgradeInitializer can be used only after UpgradeModule.bootstrap has been called.
 | 
						|
        Remove RouterUpgradeInitializer and call setUpLocationSync after UpgradeModule.bootstrap.
 | 
						|
      `);
 | 
						|
  });
 | 
						|
 | 
						|
  it('should get the $rootScope from AngularJS and set an $on watch on $locationChangeStart',
 | 
						|
     () => {
 | 
						|
       const $rootScope = jasmine.createSpyObj('$rootScope', ['$on']);
 | 
						|
 | 
						|
       upgradeModule.$injector.get.and.callFake(
 | 
						|
           (name: string) => (name === '$rootScope') && $rootScope);
 | 
						|
 | 
						|
       setUpLocationSync(upgradeModule);
 | 
						|
 | 
						|
       expect($rootScope.$on).toHaveBeenCalledTimes(1);
 | 
						|
       expect($rootScope.$on).toHaveBeenCalledWith('$locationChangeStart', jasmine.any(Function));
 | 
						|
     });
 | 
						|
 | 
						|
  it('should navigate by url every time $locationChangeStart is broadcasted', () => {
 | 
						|
    const url = 'https://google.com';
 | 
						|
    const pathname = '/custom/route';
 | 
						|
    const normalizedPathname = 'foo';
 | 
						|
    const query = '?query=1&query2=3';
 | 
						|
    const hash = '#new/hash';
 | 
						|
    const $rootScope = jasmine.createSpyObj('$rootScope', ['$on']);
 | 
						|
 | 
						|
    upgradeModule.$injector.get.and.returnValue($rootScope);
 | 
						|
    LocationMock.normalize.and.returnValue(normalizedPathname);
 | 
						|
 | 
						|
    setUpLocationSync(upgradeModule);
 | 
						|
 | 
						|
    const callback = $rootScope.$on.calls.argsFor(0)[1];
 | 
						|
    callback({}, url + pathname + query + hash, '');
 | 
						|
 | 
						|
    expect(LocationMock.normalize).toHaveBeenCalledTimes(1);
 | 
						|
    expect(LocationMock.normalize).toHaveBeenCalledWith(pathname);
 | 
						|
 | 
						|
    expect(RouterMock.navigateByUrl).toHaveBeenCalledTimes(1);
 | 
						|
    expect(RouterMock.navigateByUrl).toHaveBeenCalledWith(normalizedPathname + query + hash);
 | 
						|
  });
 | 
						|
 | 
						|
  it('should allow configuration to work with hash-based routing', () => {
 | 
						|
    const url = 'https://google.com';
 | 
						|
    const pathname = '/custom/route';
 | 
						|
    const normalizedPathname = 'foo';
 | 
						|
    const query = '?query=1&query2=3';
 | 
						|
    const hash = '#new/hash';
 | 
						|
    const combinedUrl = url + '#' + pathname + query + hash;
 | 
						|
    const $rootScope = jasmine.createSpyObj('$rootScope', ['$on']);
 | 
						|
 | 
						|
    upgradeModule.$injector.get.and.returnValue($rootScope);
 | 
						|
    LocationMock.normalize.and.returnValue(normalizedPathname);
 | 
						|
 | 
						|
    setUpLocationSync(upgradeModule, 'hash');
 | 
						|
 | 
						|
    const callback = $rootScope.$on.calls.argsFor(0)[1];
 | 
						|
    callback({}, combinedUrl, '');
 | 
						|
 | 
						|
    expect(LocationMock.normalize).toHaveBeenCalledTimes(1);
 | 
						|
    expect(LocationMock.normalize).toHaveBeenCalledWith(pathname);
 | 
						|
 | 
						|
    expect(RouterMock.navigateByUrl).toHaveBeenCalledTimes(1);
 | 
						|
    expect(RouterMock.navigateByUrl).toHaveBeenCalledWith(normalizedPathname + query + hash);
 | 
						|
  });
 | 
						|
 | 
						|
  it('should work correctly on browsers that do not start pathname with `/`', () => {
 | 
						|
    const anchorProto = HTMLAnchorElement.prototype;
 | 
						|
    const originalDescriptor = Object.getOwnPropertyDescriptor(anchorProto, 'pathname');
 | 
						|
    Object.defineProperty(anchorProto, 'pathname', {get: () => 'foo/bar'});
 | 
						|
 | 
						|
    try {
 | 
						|
      const $rootScope = jasmine.createSpyObj('$rootScope', ['$on']);
 | 
						|
      upgradeModule.$injector.get.and.returnValue($rootScope);
 | 
						|
 | 
						|
      setUpLocationSync(upgradeModule);
 | 
						|
 | 
						|
      const callback = $rootScope.$on.calls.argsFor(0)[1];
 | 
						|
      callback({}, '', '');
 | 
						|
 | 
						|
      expect(LocationMock.normalize).toHaveBeenCalledWith('/foo/bar');
 | 
						|
    } finally {
 | 
						|
      Object.defineProperty(anchorProto, 'pathname', originalDescriptor!);
 | 
						|
    }
 | 
						|
  });
 | 
						|
});
 |