|
1 | 1 | describe('state', function () {
|
2 | 2 |
|
3 |
| - var locationProvider, templateParams; |
| 3 | + var stateProvider, locationProvider, templateParams; |
4 | 4 |
|
5 | 5 | beforeEach(module('ui.router', function($locationProvider) {
|
6 | 6 | locationProvider = $locationProvider;
|
@@ -33,6 +33,7 @@ describe('state', function () {
|
33 | 33 | state.onEnter = callbackLogger('onEnter');
|
34 | 34 | state.onExit = callbackLogger('onExit');
|
35 | 35 | });
|
| 36 | + stateProvider = $stateProvider; |
36 | 37 |
|
37 | 38 | $stateProvider
|
38 | 39 | .state('A', A)
|
@@ -501,4 +502,60 @@ describe('state', function () {
|
501 | 502 | expect(templateParams).toEqual({ item: "foo" });
|
502 | 503 | }));
|
503 | 504 | });
|
| 505 | + |
| 506 | + describe('provider decorators', function () { |
| 507 | + |
| 508 | + it('should return built-in decorators', function () { |
| 509 | + expect(stateProvider.decorator('parent')({ parent: A }).self.name).toBe("A"); |
| 510 | + }); |
| 511 | + |
| 512 | + it('should allow built-in decorators to be overridden', inject(function ($state, $q) { |
| 513 | + stateProvider.decorator('data', function(state) { |
| 514 | + return angular.extend(state.data || {}, { foo: "bar" }); |
| 515 | + }); |
| 516 | + stateProvider.state('AA', { parent: A, data: { baz: "true" } }); |
| 517 | + |
| 518 | + $state.transitionTo('AA'); |
| 519 | + $q.flush(); |
| 520 | + expect($state.current.data).toEqual({ baz: 'true', foo: 'bar' }); |
| 521 | + })); |
| 522 | + |
| 523 | + it('should allow new decorators to be added', inject(function ($state, $q) { |
| 524 | + stateProvider.decorator('custom', function(state) { |
| 525 | + return function() { return "Custom functionality for state '" + state + "'" }; |
| 526 | + }); |
| 527 | + stateProvider.state('decoratorTest', {}); |
| 528 | + |
| 529 | + $state.transitionTo('decoratorTest'); |
| 530 | + $q.flush(); |
| 531 | + expect($state.$current.custom()).toBe("Custom functionality for state 'decoratorTest'"); |
| 532 | + })); |
| 533 | + |
| 534 | + it('should allow built-in decorators to be extended', inject(function ($state, $q, $httpBackend) { |
| 535 | + stateProvider.decorator('views', function(state, parent) { |
| 536 | + var result = {}; |
| 537 | + |
| 538 | + angular.forEach(parent(state), function(config, name) { |
| 539 | + result[name] = angular.extend(config, { templateProvider: function() { |
| 540 | + return "Template for " + name; |
| 541 | + }}); |
| 542 | + }); |
| 543 | + return result; |
| 544 | + }); |
| 545 | + |
| 546 | + stateProvider.state('viewTest', { |
| 547 | + views: { |
| 548 | + viewA: {}, |
| 549 | + viewB: {} |
| 550 | + } |
| 551 | + }); |
| 552 | + |
| 553 | + $state.transitionTo('viewTest'); |
| 554 | + $q.flush(); |
| 555 | + |
| 556 | + expect($state.$current.views['viewA@'].templateProvider()).toBe('Template for viewA@'); |
| 557 | + expect($state.$current.views['viewB@'].templateProvider()).toBe('Template for viewB@'); |
| 558 | + })); |
| 559 | + |
| 560 | + }); |
504 | 561 | });
|
0 commit comments