From 477a711543ab9bc31a47504d7a08d65e411505c7 Mon Sep 17 00:00:00 2001 From: Emmanuel QUENTIN Date: Fri, 15 May 2015 17:42:17 +0200 Subject: [PATCH 1/5] Move PromisesResolver to ES6 --- .../ng-admin/Crud/misc/PromisesResolver.js | 56 ------------------- src/javascripts/ng-admin/es6/lib/Factory.js | 5 ++ .../es6/lib/Utils/PromisesResolver.js | 48 ++++++++++++++++ 3 files changed, 53 insertions(+), 56 deletions(-) delete mode 100644 src/javascripts/ng-admin/Crud/misc/PromisesResolver.js create mode 100644 src/javascripts/ng-admin/es6/lib/Utils/PromisesResolver.js diff --git a/src/javascripts/ng-admin/Crud/misc/PromisesResolver.js b/src/javascripts/ng-admin/Crud/misc/PromisesResolver.js deleted file mode 100644 index 7aa426d7..00000000 --- a/src/javascripts/ng-admin/Crud/misc/PromisesResolver.js +++ /dev/null @@ -1,56 +0,0 @@ -/*global define*/ -define(function () { - 'use strict'; - - function PromisesResolver($q) { - - function allEvenFailed(promises) { - if (!Array.isArray(promises)) { - throw 'allEvenFailed can only handle an array of promises'; - } - var deferred = $q.defer(); - if (promises.length === 0) { - deferred.resolve([]); - return deferred.promise; - } - - var states = []; - var results = []; - - promises.forEach(function (promise, key) { - states[key] = false; // promises are not resolved by default - }); - - promises.forEach(function (promise, key) { - function resolve(result) { - states[key] = true; - results[key] = result; // result may be an error - for (var i in states) { - if (!states[i]) { - return; - } - } - deferred.resolve(results); - } - function resolveSuccess(result) { - return resolve({ status: 'success', result: result }); - } - function resolveError(result) { - return resolve({ status: 'error', error: result }) - } - // whether the promise ends with success or error, consider it done - $q.when(promise).then(resolveSuccess, resolveError); - }); - - return deferred.promise; - }; - - return { - allEvenFailed: allEvenFailed - }; - } - - PromisesResolver.$inject = ['$q']; - - return PromisesResolver; -}); diff --git a/src/javascripts/ng-admin/es6/lib/Factory.js b/src/javascripts/ng-admin/es6/lib/Factory.js index 870b0e3b..5bf0e199 100644 --- a/src/javascripts/ng-admin/es6/lib/Factory.js +++ b/src/javascripts/ng-admin/es6/lib/Factory.js @@ -1,6 +1,7 @@ import Application from "./Application"; import Entity from "./Entity/Entity"; import DataStore from "./DataStore/DataStore"; +import PromisesResolver from "./Utils/PromisesResolver"; import ReadQueries from "./Queries/ReadQueries"; import WriteQueries from "./Queries/WriteQueries"; @@ -77,6 +78,10 @@ class Factory { return new WriteQueries(RestWrapper, PromisesResolver, Application); } + getPromisesResolver() { + return PromisesResolver; + } + _init() { this.registerFieldType('boolean', BooleanField); this.registerFieldType('choice', ChoiceField); diff --git a/src/javascripts/ng-admin/es6/lib/Utils/PromisesResolver.js b/src/javascripts/ng-admin/es6/lib/Utils/PromisesResolver.js new file mode 100644 index 00000000..d8cf9a1b --- /dev/null +++ b/src/javascripts/ng-admin/es6/lib/Utils/PromisesResolver.js @@ -0,0 +1,48 @@ + +class PromisesResolver { + static allEvenFailed(promises) { + if (!Array.isArray(promises)) { + throw 'allEvenFailed can only handle an array of promises'; + } + + return new Promise((resolve, reject) => { + if (promises.length === 0) { + return resolve([]); + } + + let states = [], + results = []; + + promises.forEach((promise, key) => { + states[key] = false; // promises are not resolved by default + }); + + promises.forEach((promise, key) => { + function resolveState(result) { + states[key] = true; + results[key] = result; // result may be an error + for (let i in states) { + if (!states[i]) { + return; + } + } + + resolve(results); + } + + function resolveSuccess(result) { + return resolveState({status: 'success', result: result}); + } + + function resolveError(result) { + return resolveState({status: 'error', error: result}) + } + + // whether the promise ends with success or error, consider it done + promise.then(resolveSuccess, resolveError); + }); + }); + } +} + +export default PromisesResolver; From 1aedf285e80bd10815be13a0ffa14e01c48336f6 Mon Sep 17 00:00:00 2001 From: Emmanuel QUENTIN Date: Mon, 18 May 2015 09:37:59 +0200 Subject: [PATCH 2/5] Add tests --- .../es6/lib/Utils/PromisesResolver.js | 2 +- .../tests/lib/Utils/PromisesResolverTest.js | 48 +++++++++++++++++++ .../es6/tests/lib/Utils/orderElementTest.js | 2 +- 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/javascripts/ng-admin/es6/tests/lib/Utils/PromisesResolverTest.js diff --git a/src/javascripts/ng-admin/es6/lib/Utils/PromisesResolver.js b/src/javascripts/ng-admin/es6/lib/Utils/PromisesResolver.js index d8cf9a1b..c427e9dd 100644 --- a/src/javascripts/ng-admin/es6/lib/Utils/PromisesResolver.js +++ b/src/javascripts/ng-admin/es6/lib/Utils/PromisesResolver.js @@ -2,7 +2,7 @@ class PromisesResolver { static allEvenFailed(promises) { if (!Array.isArray(promises)) { - throw 'allEvenFailed can only handle an array of promises'; + throw Error('allEvenFailed can only handle an array of promises'); } return new Promise((resolve, reject) => { diff --git a/src/javascripts/ng-admin/es6/tests/lib/Utils/PromisesResolverTest.js b/src/javascripts/ng-admin/es6/tests/lib/Utils/PromisesResolverTest.js new file mode 100644 index 00000000..46b05c92 --- /dev/null +++ b/src/javascripts/ng-admin/es6/tests/lib/Utils/PromisesResolverTest.js @@ -0,0 +1,48 @@ +var assert = require('chai').assert; +var expect = require('chai').expect; + +import PromisesResolver from "../../../lib/Utils/PromisesResolver"; + +describe('PromisesResolver', () => { + + describe("allEvenFailed()", () => { + + it('should throw an exception when the argument is not an array', () => { + var error = 'allEvenFailed can only handle an array of promises'; + + expect(() => { PromisesResolver.allEvenFailed('nope') }).to.throw(error); + expect(() => { PromisesResolver.allEvenFailed() }).to.throw(error); + expect(() => { PromisesResolver.allEvenFailed(1) }).to.throw(error); + }); + + it('should resolve all promises', (done) => { + let p1Result = false, + p2Result = false, + p1 = new Promise((resolve, reject) => { + resolve('p1'); + }), + p2 = new Promise((resolve, reject) => { + resolve('p2'); + }); + + p1.then((result) => { + p1Result = result; + }); + p2.then((result) => { + p2Result = result; + }); + + let result = PromisesResolver.allEvenFailed([p1, p2]); + + // Check that all promises were resolved + result.then(() => { + assert.equal(p1Result, 'p1'); + assert.equal(p1Result, 'p2'); + + // assert.equal does not throw an error when failing, + // so we use a callback that timeout in case of error + done(); + }); + }); + }); +}); diff --git a/src/javascripts/ng-admin/es6/tests/lib/Utils/orderElementTest.js b/src/javascripts/ng-admin/es6/tests/lib/Utils/orderElementTest.js index ae6d46b7..6f43fc4f 100644 --- a/src/javascripts/ng-admin/es6/tests/lib/Utils/orderElementTest.js +++ b/src/javascripts/ng-admin/es6/tests/lib/Utils/orderElementTest.js @@ -2,7 +2,7 @@ var assert = require('chai').assert; import orderElement from "../../../lib/Utils/orderElement"; -describe('Menu', () => { +describe('orderElement', () => { describe("order()", () => { From 77b81b1c4c9f7771e17ba8a49c807cef55e5caf7 Mon Sep 17 00:00:00 2001 From: Emmanuel QUENTIN Date: Mon, 18 May 2015 10:41:20 +0200 Subject: [PATCH 3/5] Fix tests --- .../ng-admin/es6/tests/lib/Utils/PromisesResolverTest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/javascripts/ng-admin/es6/tests/lib/Utils/PromisesResolverTest.js b/src/javascripts/ng-admin/es6/tests/lib/Utils/PromisesResolverTest.js index 46b05c92..d4a16386 100644 --- a/src/javascripts/ng-admin/es6/tests/lib/Utils/PromisesResolverTest.js +++ b/src/javascripts/ng-admin/es6/tests/lib/Utils/PromisesResolverTest.js @@ -37,7 +37,7 @@ describe('PromisesResolver', () => { // Check that all promises were resolved result.then(() => { assert.equal(p1Result, 'p1'); - assert.equal(p1Result, 'p2'); + assert.equal(p2Result, 'p2'); // assert.equal does not throw an error when failing, // so we use a callback that timeout in case of error From d4b2fd5f189fc5e6c4ccd3aeddeaf446b8f2066a Mon Sep 17 00:00:00 2001 From: Emmanuel QUENTIN Date: Mon, 18 May 2015 14:45:08 +0200 Subject: [PATCH 4/5] Fix tests --- .../ng-admin/Crud/misc/PromisesResolver.js | 12 ++++++++++++ .../test/unit/Crud/list/DatagridControllerSpec.js | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 src/javascripts/ng-admin/Crud/misc/PromisesResolver.js diff --git a/src/javascripts/ng-admin/Crud/misc/PromisesResolver.js b/src/javascripts/ng-admin/Crud/misc/PromisesResolver.js new file mode 100644 index 00000000..96095d3f --- /dev/null +++ b/src/javascripts/ng-admin/Crud/misc/PromisesResolver.js @@ -0,0 +1,12 @@ +/*global define*/ +define(function () { + 'use strict'; + + function PromisesResolver(AdminDescription) { + return AdminDescription.getPromisesResolver(); + } + + PromisesResolver.$inject = ['AdminDescription']; + + return PromisesResolver; +}); diff --git a/src/javascripts/test/unit/Crud/list/DatagridControllerSpec.js b/src/javascripts/test/unit/Crud/list/DatagridControllerSpec.js index f019dcd9..93fb269d 100644 --- a/src/javascripts/test/unit/Crud/list/DatagridControllerSpec.js +++ b/src/javascripts/test/unit/Crud/list/DatagridControllerSpec.js @@ -13,10 +13,11 @@ define(function (require) { entries = [ new Entry('my_entity', {value: 1}, 1), new Entry('my_entity', {value: 2}, 2), - new Entry('my_entity', {value: 3}, 3), + new Entry('my_entity', {value: 3}, 3) ]; dataGridController = new DataGridController({ + listActions: function() {}, entity: function () { return new Entity('my_entity'); }, From 448a7784bb3f58eb99cf46ec894e2e5769a8ae22 Mon Sep 17 00:00:00 2001 From: Emmanuel QUENTIN Date: Mon, 18 May 2015 15:09:25 +0200 Subject: [PATCH 5/5] Fix tests --- .../test/unit/Crud/list/DatagridControllerSpec.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/javascripts/test/unit/Crud/list/DatagridControllerSpec.js b/src/javascripts/test/unit/Crud/list/DatagridControllerSpec.js index 93fb269d..2eebf0d8 100644 --- a/src/javascripts/test/unit/Crud/list/DatagridControllerSpec.js +++ b/src/javascripts/test/unit/Crud/list/DatagridControllerSpec.js @@ -17,15 +17,14 @@ define(function (require) { ]; dataGridController = new DataGridController({ - listActions: function() {}, + listActions: function() { + return []; + }, entity: function () { return new Entity('my_entity'); }, entries: entries, - selection: [], - listActions: function () { - return []; - } + selection: [] }, { search: function () { return {};