diff options
| author | James Davies | 2013-06-03 13:04:12 +1000 | 
|---|---|---|
| committer | Chirayu Krishnappa | 2013-07-31 16:22:24 -0700 | 
| commit | 61906d3517428b6d52d3284b8d26d1a46e01dad7 (patch) | |
| tree | d8196c069eaa60414664b2b1d2a76f15a13d7262 /test/ng/parseSpec.js | |
| parent | 0bbd20f255b2954b5c41617fe718cf6eca36a972 (diff) | |
| download | angular.js-61906d3517428b6d52d3284b8d26d1a46e01dad7.tar.bz2 | |
fix($parse): unwrap promise when setting a field
This fixes an inconsistency where you can't call the setter function
when the expression resolves to a top level field name on a promise.
Setting a field on an unresolved promise will throw an exception.  (This
shouldn't really happen in your template/js code and points to a
programming error.)
Closes #1827
Diffstat (limited to 'test/ng/parseSpec.js')
| -rw-r--r-- | test/ng/parseSpec.js | 80 | 
1 files changed, 80 insertions, 0 deletions
| diff --git a/test/ng/parseSpec.js b/test/ng/parseSpec.js index 62425f12..568a3b15 100644 --- a/test/ng/parseSpec.js +++ b/test/ng/parseSpec.js @@ -845,6 +845,86 @@ describe('parser', function() {              scope.$digest();              expect(scope.$eval('greeting')).toBe(undefined);            }); + + +          describe('assignment into promises', function() { +            // This behavior is analogous to assignments to non-promise values +            // that are lazily set on the scope. +            it('should evaluate a resolved object promise and set its value', inject(function($parse) { +              scope.person = promise; +              deferred.resolve({'name': 'Bill Gates'}); + +              var getter = $parse('person.name'); +              expect(getter(scope)).toBe(undefined); + +              scope.$digest(); +              expect(getter(scope)).toBe('Bill Gates'); +              getter.assign(scope, 'Warren Buffet'); +              expect(getter(scope)).toBe('Warren Buffet'); +            })); + + +            it('should evaluate a resolved primitive type promise and set its value', inject(function($parse) {             +              scope.greeting = promise; +              deferred.resolve('Salut!'); +               +              var getter = $parse('greeting'); +              expect(getter(scope)).toBe(undefined); + +              scope.$digest(); +              expect(getter(scope)).toBe('Salut!'); + +              getter.assign(scope, 'Bonjour'); +              expect(getter(scope)).toBe('Bonjour'); +            })); + + +            it('should evaluate an unresolved promise and set and remember its value', inject(function($parse) { +              scope.person = promise; + +              var getter = $parse('person.name'); +              expect(getter(scope)).toBe(undefined); + +              scope.$digest(); +              expect(getter(scope)).toBe(undefined); + +              getter.assign(scope, 'Bonjour'); +              scope.$digest(); + +              expect(getter(scope)).toBe('Bonjour'); + +              var c1Getter = $parse('person.A.B.C1'); +              scope.$digest(); +              expect(c1Getter(scope)).toBe(undefined); +              c1Getter.assign(scope, 'c1_value'); +              scope.$digest(); +              expect(c1Getter(scope)).toBe('c1_value'); + +              // Set another property on the person.A.B +              var c2Getter = $parse('person.A.B.C2'); +              scope.$digest(); +              expect(c2Getter(scope)).toBe(undefined); +              c2Getter.assign(scope, 'c2_value'); +              scope.$digest(); +              expect(c2Getter(scope)).toBe('c2_value'); + +              // c1 should be unchanged. +              expect($parse('person.A')(scope)).toEqual( +                  {B: {C1: 'c1_value', C2: 'c2_value'}}); +            })); + + +            it('should evaluate a resolved promise and overwrite the previous set value in the absense of the getter', +               inject(function($parse) { +              scope.person = promise; +              var c1Getter = $parse('person.A.B.C1'); +              c1Getter.assign(scope, 'c1_value'); +              // resolving the promise should update the tree. +              deferred.resolve({A: {B: {C1: 'resolved_c1'}}}); +              scope.$digest(); +              expect(c1Getter(scope)).toEqual('resolved_c1'); +            })); +          });          });          describe('dereferencing', function() { | 
