aboutsummaryrefslogtreecommitdiffstats
path: root/test/ng/qSpec.js
diff options
context:
space:
mode:
authorAlexander Shtuchkin2013-02-23 18:54:55 +0400
committerIgor Minar2013-02-25 10:58:05 -0800
commite27bb6eb132a68665c8fca3f5a216b19b1129ba6 (patch)
tree1e1d4d8943d15089a8d8d01549c2cca02f9f9479 /test/ng/qSpec.js
parent7b236b29aa3a6f6dfe722815e0a2667d9b7f0899 (diff)
downloadangular.js-e27bb6eb132a68665c8fca3f5a216b19b1129ba6.tar.bz2
feat($q): $q.all() now accepts hash
When waiting for several promises at once, it is often desirable to have them by name, not just by index in array. Example of this kind of interface already implemented would be a $routeProvider.when(url, {resolve: <hash of promises>}), where resources/promises are given by names, and then results accessed by names in controller.
Diffstat (limited to 'test/ng/qSpec.js')
-rw-r--r--test/ng/qSpec.js68
1 files changed, 67 insertions, 1 deletions
diff --git a/test/ng/qSpec.js b/test/ng/qSpec.js
index 941b4f2e..822cde6b 100644
--- a/test/ng/qSpec.js
+++ b/test/ng/qSpec.js
@@ -683,7 +683,7 @@ describe('q', function() {
});
- describe('all', function() {
+ describe('all (array)', function() {
it('should resolve all of nothing', function() {
var result;
q.all([]).then(function(r) { result = r; });
@@ -742,6 +742,72 @@ describe('q', function() {
});
});
+ describe('all (hash)', function() {
+ it('should resolve all of nothing', function() {
+ var result;
+ q.all({}).then(function(r) { result = r; });
+ mockNextTick.flush();
+ expect(result).toEqual({});
+ });
+
+
+ it('should take a hash of promises and return a promise for a hash of results', function() {
+ var deferred1 = defer(),
+ deferred2 = defer();
+
+ q.all({en: promise, fr: deferred1.promise, es: deferred2.promise}).then(success(), error());
+ expect(logStr()).toBe('');
+ syncResolve(deferred, 'hi');
+ expect(logStr()).toBe('');
+ syncResolve(deferred2, 'hola');
+ expect(logStr()).toBe('');
+ syncResolve(deferred1, 'salut');
+ expect(logStr()).toBe('success({en:hi,es:hola,fr:salut})');
+ });
+
+
+ it('should reject the derived promise if at least one of the promises in the hash is rejected',
+ function() {
+ var deferred1 = defer(),
+ deferred2 = defer();
+
+ q.all({en: promise, fr: deferred1.promise, es: deferred2.promise}).then(success(), error());
+ expect(logStr()).toBe('');
+ syncResolve(deferred2, 'hola');
+ expect(logStr()).toBe('');
+ syncReject(deferred1, 'oops');
+ expect(logStr()).toBe('error(oops)');
+ });
+
+
+ it('should ignore multiple resolutions of an (evil) hash promise', function() {
+ var evilPromise = {
+ then: function(success, error) {
+ evilPromise.success = success;
+ evilPromise.error = error;
+ }
+ }
+
+ q.all({good: promise, evil: evilPromise}).then(success(), error());
+ expect(logStr()).toBe('');
+
+ evilPromise.success('first');
+ evilPromise.success('muhaha');
+ evilPromise.error('arghhh');
+ expect(logStr()).toBe('');
+
+ syncResolve(deferred, 'done');
+ expect(logStr()).toBe('success({evil:first,good:done})');
+ });
+
+ it('should handle correctly situation when given the same promise several times', function() {
+ q.all({first: promise, second: promise, third: promise}).then(success(), error());
+ expect(logStr()).toBe('');
+
+ syncResolve(deferred, 'done');
+ expect(logStr()).toBe('success({first:done,second:done,third:done})');
+ });
+ });
describe('exception logging', function() {
var mockExceptionLogger = {