| 
									
										
										
										
											2016-07-21 17:12:00 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. 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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-16 14:36:51 -07:00
										 |  |  | import {validateConfig} from '../src/config'; | 
					
						
							| 
									
										
										
										
											2016-10-20 15:00:15 -07:00
										 |  |  | import {PRIMARY_OUTLET} from '../src/shared'; | 
					
						
							| 
									
										
										
										
											2016-06-16 14:36:51 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | describe('config', () => { | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |   describe('validateConfig', () => { | 
					
						
							|  |  |  |     it('should not throw when no errors', () => { | 
					
						
							| 
									
										
										
										
											2016-12-02 14:09:09 -08:00
										 |  |  |       expect( | 
					
						
							|  |  |  |           () => validateConfig([{path: 'a', redirectTo: 'b'}, {path: 'b', component: ComponentA}])) | 
					
						
							|  |  |  |           .not.toThrow(); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-12-02 14:17:27 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should not throw when a matcher is provided', () => { | 
					
						
							|  |  |  |       expect(() => validateConfig([{matcher: <any>'someFunc', component: ComponentA}])) | 
					
						
							|  |  |  |           .not.toThrow(); | 
					
						
							| 
									
										
										
										
											2016-06-16 14:36:51 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 01:55:10 +03:00
										 |  |  |     it('should throw for undefined route', () => { | 
					
						
							|  |  |  |       expect(() => { | 
					
						
							|  |  |  |         validateConfig([{path: 'a', component: ComponentA}, , {path: 'b', component: ComponentB}]); | 
					
						
							| 
									
										
										
										
											2016-12-06 21:41:01 +03:00
										 |  |  |       }).toThrowError(/Invalid configuration of route ''/); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should throw for undefined route in children', () => { | 
					
						
							|  |  |  |       expect(() => { | 
					
						
							|  |  |  |         validateConfig([{ | 
					
						
							|  |  |  |           path: 'a', | 
					
						
							|  |  |  |           children: [ | 
					
						
							|  |  |  |             {path: 'b', component: ComponentB}, | 
					
						
							|  |  |  |             , | 
					
						
							|  |  |  |           ] | 
					
						
							|  |  |  |         }]); | 
					
						
							|  |  |  |       }).toThrowError(/Invalid configuration of route 'a'/); | 
					
						
							| 
									
										
										
										
											2016-11-11 01:55:10 +03:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-15 00:28:31 +09:00
										 |  |  |     it('should throw when Array is passed', () => { | 
					
						
							|  |  |  |       expect(() => { | 
					
						
							|  |  |  |         validateConfig([ | 
					
						
							|  |  |  |           {path: 'a', component: ComponentA}, | 
					
						
							|  |  |  |           [{path: 'b', component: ComponentB}, {path: 'c', component: ComponentC}] | 
					
						
							|  |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2016-12-06 21:41:01 +03:00
										 |  |  |       }).toThrowError(`Invalid configuration of route '': Array cannot be specified`); | 
					
						
							| 
									
										
										
										
											2016-07-15 00:28:31 +09:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |     it('should throw when redirectTo and children are used together', () => { | 
					
						
							| 
									
										
										
										
											2016-06-16 14:36:51 -07:00
										 |  |  |       expect(() => { | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |         validateConfig( | 
					
						
							|  |  |  |             [{path: 'a', redirectTo: 'b', children: [{path: 'b', component: ComponentA}]}]); | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |           .toThrowError( | 
					
						
							|  |  |  |               `Invalid configuration of route 'a': redirectTo and children cannot be used together`); | 
					
						
							| 
									
										
										
										
											2016-06-16 14:36:51 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-06 21:41:01 +03:00
										 |  |  |     it('should validate children and report full path', () => { | 
					
						
							|  |  |  |       expect(() => validateConfig([{path: 'a', children: [{path: 'b'}]}])) | 
					
						
							|  |  |  |           .toThrowError( | 
					
						
							|  |  |  |               `Invalid configuration of route 'a/b'. One of the following must be provided: component, redirectTo, children or loadChildren`); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should properly report deeply nested path', () => { | 
					
						
							|  |  |  |       expect(() => validateConfig([{ | 
					
						
							|  |  |  |                path: 'a', | 
					
						
							|  |  |  |                children: [{path: 'b', children: [{path: 'c', children: [{path: 'd'}]}]}] | 
					
						
							|  |  |  |              }])) | 
					
						
							|  |  |  |           .toThrowError( | 
					
						
							|  |  |  |               `Invalid configuration of route 'a/b/c/d'. One of the following must be provided: component, redirectTo, children or loadChildren`); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-06 16:19:52 -07:00
										 |  |  |     it('should throw when redirectTo and loadChildren are used together', () => { | 
					
						
							|  |  |  |       expect(() => { validateConfig([{path: 'a', redirectTo: 'b', loadChildren: 'value'}]); }) | 
					
						
							| 
									
										
										
										
											2016-07-06 11:02:16 -07:00
										 |  |  |           .toThrowError( | 
					
						
							| 
									
										
										
										
											2016-07-06 16:19:52 -07:00
										 |  |  |               `Invalid configuration of route 'a': redirectTo and loadChildren cannot be used together`); | 
					
						
							| 
									
										
										
										
											2016-07-06 11:02:16 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-06 16:19:52 -07:00
										 |  |  |     it('should throw when children and loadChildren are used together', () => { | 
					
						
							|  |  |  |       expect(() => { validateConfig([{path: 'a', children: [], loadChildren: 'value'}]); }) | 
					
						
							| 
									
										
										
										
											2016-07-06 11:02:16 -07:00
										 |  |  |           .toThrowError( | 
					
						
							| 
									
										
										
										
											2016-07-06 16:19:52 -07:00
										 |  |  |               `Invalid configuration of route 'a': children and loadChildren cannot be used together`); | 
					
						
							| 
									
										
										
										
											2016-07-06 11:02:16 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |     it('should throw when component and redirectTo are used together', () => { | 
					
						
							|  |  |  |       expect(() => { validateConfig([{path: 'a', component: ComponentA, redirectTo: 'b'}]); }) | 
					
						
							|  |  |  |           .toThrowError( | 
					
						
							|  |  |  |               `Invalid configuration of route 'a': redirectTo and component cannot be used together`); | 
					
						
							| 
									
										
										
										
											2016-06-16 14:36:51 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-02 14:09:09 -08:00
										 |  |  |     it('should throw when path and matcher are used together', () => { | 
					
						
							| 
									
										
										
										
											2016-11-09 15:25:47 -08:00
										 |  |  |       expect(() => { validateConfig([{path: 'a', matcher: <any>'someFunc', children: []}]); }) | 
					
						
							|  |  |  |           .toThrowError( | 
					
						
							|  |  |  |               `Invalid configuration of route 'a': path and matcher cannot be used together`); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should throw when path and matcher are missing', () => { | 
					
						
							| 
									
										
										
										
											2016-12-02 14:17:27 -08:00
										 |  |  |       expect(() => { validateConfig([{component: null, redirectTo: 'b'}]); }) | 
					
						
							|  |  |  |           .toThrowError( | 
					
						
							| 
									
										
										
										
											2016-12-06 21:41:01 +03:00
										 |  |  |               `Invalid configuration of route '': routes must have either a path or a matcher specified`); | 
					
						
							| 
									
										
										
										
											2016-06-16 14:36:51 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |     it('should throw when none of component and children or direct are missing', () => { | 
					
						
							|  |  |  |       expect(() => { validateConfig([{path: 'a'}]); }) | 
					
						
							|  |  |  |           .toThrowError( | 
					
						
							| 
									
										
										
										
											2016-12-06 21:41:01 +03:00
										 |  |  |               `Invalid configuration of route 'a'. One of the following must be provided: component, redirectTo, children or loadChildren`); | 
					
						
							| 
									
										
										
										
											2016-06-19 14:44:20 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  |     it('should throw when path starts with a slash', () => { | 
					
						
							| 
									
										
										
										
											2016-06-16 14:36:51 -07:00
										 |  |  |       expect(() => { | 
					
						
							| 
									
										
										
										
											2016-06-27 20:10:36 -07:00
										 |  |  |         validateConfig([<any>{path: '/a', redirectTo: 'b'}]); | 
					
						
							| 
									
										
										
										
											2016-12-06 21:41:01 +03:00
										 |  |  |       }).toThrowError(`Invalid configuration of route '/a': path cannot start with a slash`); | 
					
						
							| 
									
										
										
										
											2016-06-16 14:36:51 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-06-27 20:10:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should throw when emptyPath is used with redirectTo without explicitly providing matching', | 
					
						
							|  |  |  |        () => { | 
					
						
							|  |  |  |          expect(() => { | 
					
						
							|  |  |  |            validateConfig([<any>{path: '', redirectTo: 'b'}]); | 
					
						
							| 
									
										
										
										
											2016-12-06 21:41:01 +03:00
										 |  |  |          }).toThrowError(/Invalid configuration of route '{path: "", redirectTo: "b"}'/); | 
					
						
							| 
									
										
										
										
											2016-06-27 20:10:36 -07:00
										 |  |  |        }); | 
					
						
							| 
									
										
										
										
											2016-07-29 09:59:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should throw when pathPatch is invalid', () => { | 
					
						
							| 
									
										
										
										
											2016-08-16 13:40:28 -07:00
										 |  |  |       expect(() => { validateConfig([{path: 'a', pathMatch: 'invalid', component: ComponentB}]); }) | 
					
						
							| 
									
										
										
										
											2016-07-29 09:59:50 -07:00
										 |  |  |           .toThrowError( | 
					
						
							|  |  |  |               /Invalid configuration of route 'a': pathMatch can only be set to 'prefix' or 'full'/); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-10-20 15:00:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should throw when pathPatch is invalid', () => { | 
					
						
							|  |  |  |       expect(() => { validateConfig([{path: 'a', outlet: 'aux', children: []}]); }) | 
					
						
							|  |  |  |           .toThrowError( | 
					
						
							| 
									
										
										
										
											2016-12-06 21:41:01 +03:00
										 |  |  |               /Invalid configuration of route 'a': a componentless route cannot have a named outlet set/); | 
					
						
							| 
									
										
										
										
											2016-10-20 15:00:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       expect(() => validateConfig([{path: 'a', outlet: '', children: []}])).not.toThrow(); | 
					
						
							|  |  |  |       expect(() => validateConfig([{path: 'a', outlet: PRIMARY_OUTLET, children: []}])) | 
					
						
							|  |  |  |           .not.toThrow(); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-06-16 14:36:51 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 11:49:42 -07:00
										 |  |  | class ComponentA {} | 
					
						
							|  |  |  | class ComponentB {} | 
					
						
							|  |  |  | class ComponentC {} |