226 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			226 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @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
 | |
|  */
 | |
| 
 | |
| 'use strict';
 | |
| 
 | |
| describe('router', function () {
 | |
| 
 | |
|   var elt, testMod;
 | |
|   beforeEach(function () {
 | |
|     testMod = angular.module('testMod', ['ngComponentRouter'])
 | |
|       .value('$routerRootComponent', 'app');
 | |
|   });
 | |
| 
 | |
|   it('should work with a provided root component', function() {
 | |
| 
 | |
|     registerComponent('homeCmp', {
 | |
|       template: 'Home'
 | |
|     });
 | |
| 
 | |
|     registerComponent('app', {
 | |
|       template: '<div ng-outlet></div>',
 | |
|       $routeConfig: [
 | |
|         { path: '/', component: 'homeCmp' }
 | |
|       ]
 | |
|     });
 | |
| 
 | |
|     module('testMod');
 | |
|     compileApp();
 | |
| 
 | |
|     inject(function($location, $rootScope) {
 | |
|       $location.path('/');
 | |
|       $rootScope.$digest();
 | |
|       expect(elt.text()).toBe('Home');
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should bind the component to the current router', function() {
 | |
|     var router;
 | |
|     registerComponent('homeCmp', {
 | |
|       providers: { $router: '=' },
 | |
|       controller: function($scope, $element) {
 | |
|         this.$routerOnActivate = function() {
 | |
|           router = this.$router;
 | |
|         };
 | |
|       },
 | |
|       template: 'Home'
 | |
|     });
 | |
| 
 | |
|     registerComponent('app', {
 | |
|       template: '<div ng-outlet></div>',
 | |
|       $routeConfig: [
 | |
|         { path: '/', component: 'homeCmp' }
 | |
|       ]
 | |
|     });
 | |
| 
 | |
|     module('testMod');
 | |
|     compileApp();
 | |
| 
 | |
|     inject(function($location, $rootScope) {
 | |
|       $location.path('/');
 | |
|       $rootScope.$digest();
 | |
|       var homeElement = elt.find('home-cmp');
 | |
|       expect(homeElement.text()).toBe('Home');
 | |
|       expect(homeElement.isolateScope().$ctrl.$router).toBeDefined();
 | |
|       expect(router).toBeDefined();
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should work when an async route is provided route data', function() {
 | |
|     registerComponent('homeCmp', {
 | |
|       template: 'Home ({{$ctrl.isAdmin}})',
 | |
|       $routerOnActivate: function(next, prev) {
 | |
|         this.isAdmin = next.routeData.data.isAdmin;
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     registerComponent('app', {
 | |
|       template: '<div ng-outlet></div>',
 | |
|       $routeConfig: [
 | |
|         { path: '/', loader: function($q) { return $q.when('homeCmp'); }, data: { isAdmin: true } }
 | |
|       ]
 | |
|     });
 | |
| 
 | |
|     module('testMod');
 | |
|     compileApp();
 | |
| 
 | |
|     inject(function($location, $rootScope) {
 | |
|       $location.path('/');
 | |
|       $rootScope.$digest();
 | |
|       expect(elt.text()).toBe('Home (true)');
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should work with a templateUrl component', function() {
 | |
| 
 | |
|     var $routerOnActivate = jasmine.createSpy('$routerOnActivate');
 | |
| 
 | |
|     registerComponent('homeCmp', {
 | |
|       templateUrl: 'homeCmp.html',
 | |
|       $routerOnActivate: $routerOnActivate
 | |
|     });
 | |
| 
 | |
|     registerComponent('app', {
 | |
|       template: '<div ng-outlet></div>',
 | |
|       $routeConfig: [
 | |
|         { path: '/', component: 'homeCmp' }
 | |
|       ]
 | |
|     });
 | |
| 
 | |
|     module('testMod');
 | |
| 
 | |
|     inject(function($location, $rootScope, $httpBackend) {
 | |
| 
 | |
|       $httpBackend.expectGET('homeCmp.html').respond('Home');
 | |
| 
 | |
|       compileApp();
 | |
| 
 | |
|       $location.path('/');
 | |
|       $rootScope.$digest();
 | |
|       $httpBackend.flush();
 | |
|       var homeElement = elt.find('home-cmp');
 | |
|       expect(homeElement.text()).toBe('Home');
 | |
|       expect($routerOnActivate).toHaveBeenCalled();
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should provide the current instruction', function() {
 | |
|     registerComponent('homeCmp', {
 | |
|       template: 'Home ({{homeCmp.isAdmin}})'
 | |
|     });
 | |
| 
 | |
|     registerComponent('app', {
 | |
|       template: '<div ng-outlet></div>',
 | |
|       $routeConfig: [
 | |
|         { path: '/', component: 'homeCmp', name: 'Home' }
 | |
|       ]
 | |
|     });
 | |
| 
 | |
|     module('testMod');
 | |
| 
 | |
|     inject(function($rootScope, $rootRouter, $location) {
 | |
|       compileApp();
 | |
| 
 | |
|       $location.path('/');
 | |
|       $rootScope.$digest();
 | |
|       var instruction = $rootRouter.generate(['/Home']);
 | |
|       expect($rootRouter.currentInstruction).toEqual(instruction);
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should provide the root level router', function() {
 | |
|     registerComponent('homeCmp', {
 | |
|       template: 'Home ({{homeCmp.isAdmin}})',
 | |
|       providers: {
 | |
|         $router: '<'
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     registerComponent('app', {
 | |
|       template: '<div ng-outlet></div>',
 | |
|       $routeConfig: [
 | |
|         { path: '/', component: 'homeCmp', name: 'Home' }
 | |
|       ]
 | |
|     });
 | |
| 
 | |
|     module('testMod');
 | |
| 
 | |
|     inject(function($rootScope, $rootRouter, $location) {
 | |
|       compileApp();
 | |
| 
 | |
|       $location.path('/');
 | |
|       $rootScope.$digest();
 | |
|       var homeElement = elt.find('home-cmp');
 | |
|       expect(homeElement.isolateScope().$ctrl.$router.root).toEqual($rootRouter);
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   function registerComponent(name, options) {
 | |
| 
 | |
|     var definition = {
 | |
|       providers: options.providers,
 | |
|       controller: getController(options)
 | |
|     };
 | |
|     if (options.template) definition.template = options.template;
 | |
|     if (options.templateUrl) definition.templateUrl = options.templateUrl;
 | |
| 
 | |
|     applyStaticProperties(definition.controller, options);
 | |
|     angular.module('testMod').component(name, definition);
 | |
|   }
 | |
| 
 | |
|   function compileApp() {
 | |
|     inject(function($compile, $rootScope) {
 | |
|       elt = $compile('<div><app></app</div>')($rootScope);
 | |
|       $rootScope.$digest();
 | |
|     });
 | |
|     return elt;
 | |
|   }
 | |
| 
 | |
|   function getController(options) {
 | |
|     var controller = options.controller || function () {};
 | |
|     [
 | |
|       '$routerOnActivate', '$routerOnDeactivate',
 | |
|       '$routerOnReuse', '$routerCanReuse',
 | |
|       '$routerCanDeactivate'
 | |
|     ].forEach(function (hookName) {
 | |
|       if (options[hookName]) {
 | |
|         controller.prototype[hookName] = options[hookName];
 | |
|       }
 | |
|     });
 | |
|     return controller;
 | |
|   }
 | |
| 
 | |
|   function applyStaticProperties(target, options) {
 | |
|     ['$canActivate', '$routeConfig'].forEach(function(property) {
 | |
|       if (options[property]) {
 | |
|         target[property] = options[property];
 | |
|       }
 | |
|     });
 | |
|   }
 | |
| });
 |