103 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.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 {Injector} from '@angular/core';
 | |
| import {TestBed} from '@angular/core/testing';
 | |
| import {EMPTY, of} from 'rxjs';
 | |
| import {TestScheduler} from 'rxjs/testing';
 | |
| 
 | |
| import {resolveData} from '../../src/operators/resolve_data';
 | |
| 
 | |
| describe('resolveData operator', () => {
 | |
|   let testScheduler: TestScheduler;
 | |
|   let injector: Injector;
 | |
| 
 | |
|   beforeEach(() => {
 | |
|     TestBed.configureTestingModule({
 | |
|       providers: [
 | |
|         {provide: 'resolveTwo', useValue: (a: any, b: any) => of(2)},
 | |
|         {provide: 'resolveFour', useValue: (a: any, b: any) => 4},
 | |
|         {provide: 'resolveEmpty', useValue: (a: any, b: any) => EMPTY},
 | |
|       ]
 | |
|     });
 | |
|   });
 | |
|   beforeEach(() => {
 | |
|     testScheduler = new TestScheduler(assertDeepEquals);
 | |
|   });
 | |
|   beforeEach(() => {
 | |
|     injector = TestBed.inject<Injector>(Injector);
 | |
|   });
 | |
| 
 | |
|   it('should re-emit updated value from source after all resolvers emit and complete', () => {
 | |
|     testScheduler.run(({hot, cold, expectObservable}) => {
 | |
|       const transition: any = createTransition({e1: 'resolveTwo'}, {e2: 'resolveFour'});
 | |
|       const source = cold('-(t|)', {t: deepClone(transition)});
 | |
|       const expected = '-(t|)';
 | |
|       const outputTransition = deepClone(transition);
 | |
|       outputTransition.guards.canActivateChecks[0].route._resolvedData = {e1: 2};
 | |
|       outputTransition.guards.canActivateChecks[1].route._resolvedData = {e2: 4};
 | |
| 
 | |
|       expectObservable(source.pipe(resolveData('emptyOnly', injector))).toBe(expected, {
 | |
|         t: outputTransition
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should re-emit value from source when there are no resolvers', () => {
 | |
|     testScheduler.run(({hot, cold, expectObservable}) => {
 | |
|       const transition: any = createTransition({});
 | |
|       const source = cold('-(t|)', {t: deepClone(transition)});
 | |
|       const expected = '-(t|)';
 | |
|       const outputTransition = deepClone(transition);
 | |
|       outputTransition.guards.canActivateChecks[0].route._resolvedData = {};
 | |
| 
 | |
|       expectObservable(source.pipe(resolveData('emptyOnly', injector))).toBe(expected, {
 | |
|         t: outputTransition
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should not emit when there\'s one resolver that doesn\'t emit', () => {
 | |
|     testScheduler.run(({hot, cold, expectObservable}) => {
 | |
|       const transition: any = createTransition({e2: 'resolveEmpty'});
 | |
|       const source = cold('-(t|)', {t: deepClone(transition)});
 | |
|       const expected = '-|';
 | |
|       expectObservable(source.pipe(resolveData('emptyOnly', injector))).toBe(expected);
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should not emit if at least one resolver doesn\'t emit', () => {
 | |
|     testScheduler.run(({hot, cold, expectObservable}) => {
 | |
|       const transition: any = createTransition({e1: 'resolveTwo'}, {e2: 'resolveEmpty'});
 | |
|       const source = cold('-(t|)', {t: deepClone(transition)});
 | |
|       const expected = '-|';
 | |
|       expectObservable(source.pipe(resolveData('emptyOnly', injector))).toBe(expected);
 | |
|     });
 | |
|   });
 | |
| });
 | |
| 
 | |
| function assertDeepEquals(a: any, b: any) {
 | |
|   return expect(a).toEqual(b);
 | |
| }
 | |
| 
 | |
| function createTransition(...resolvers: {[key: string]: string}[]) {
 | |
|   return {
 | |
|     targetSnapshot: {},
 | |
|     guards: {
 | |
|       canActivateChecks:
 | |
|           resolvers.map(resolver => ({
 | |
|                           route: {_resolve: resolver, pathFromRoot: [{url: '/'}], data: {}},
 | |
|                         })),
 | |
|     },
 | |
|   };
 | |
| }
 | |
| 
 | |
| function deepClone<T>(obj: T): T {
 | |
|   return JSON.parse(JSON.stringify(obj)) as T;
 | |
| }
 |