summaryrefslogtreecommitdiff
path: root/mocha_test/auto.js
diff options
context:
space:
mode:
Diffstat (limited to 'mocha_test/auto.js')
-rw-r--r--mocha_test/auto.js347
1 files changed, 347 insertions, 0 deletions
diff --git a/mocha_test/auto.js b/mocha_test/auto.js
new file mode 100644
index 0000000..c6b7150
--- /dev/null
+++ b/mocha_test/auto.js
@@ -0,0 +1,347 @@
+var async = require('../lib');
+var expect = require('chai').expect;
+var _ = require('lodash');
+
+describe('auto', function () {
+
+ it('auto', function(done){
+ var callOrder = [];
+ async.auto({
+ task1: ['task2', function(results, callback){
+ setTimeout(function(){
+ callOrder.push('task1');
+ callback();
+ }, 25);
+ }],
+ task2: function(callback){
+ setTimeout(function(){
+ callOrder.push('task2');
+ callback();
+ }, 50);
+ },
+ task3: ['task2', function(results, callback){
+ callOrder.push('task3');
+ callback();
+ }],
+ task4: ['task1', 'task2', function(results, callback){
+ callOrder.push('task4');
+ callback();
+ }],
+ task5: ['task2', function(results, callback){
+ setTimeout(function(){
+ callOrder.push('task5');
+ callback();
+ }, 0);
+ }],
+ task6: ['task2', function(results, callback){
+ callOrder.push('task6');
+ callback();
+ }]
+ },
+ function(err){
+ expect(err).to.equal(null);
+ expect(callOrder).to.eql(['task2','task6','task3','task5','task1','task4']);
+ done();
+ });
+ });
+
+ it('auto concurrency', function (done) {
+ var concurrency = 2;
+ var runningTasks = [];
+
+ function makeCallback(taskName) {
+ return function(/*..., callback*/) {
+ var callback = _.last(arguments);
+ runningTasks.push(taskName);
+ setTimeout(function(){
+ // Each task returns the array of running tasks as results.
+ var result = runningTasks.slice(0);
+ runningTasks.splice(runningTasks.indexOf(taskName), 1);
+ callback(null, result);
+ });
+ };
+ }
+
+ async.auto({
+ task1: ['task2', makeCallback('task1')],
+ task2: makeCallback('task2'),
+ task3: ['task2', makeCallback('task3')],
+ task4: ['task1', 'task2', makeCallback('task4')],
+ task5: ['task2', makeCallback('task5')],
+ task6: ['task2', makeCallback('task6')]
+ }, concurrency, function(err, results){
+ _.each(results, function(result) {
+ expect(result.length).to.be.below(concurrency + 1);
+ });
+ done();
+ });
+ });
+
+ it('auto petrify', function (done) {
+ var callOrder = [];
+ async.auto({
+ task1: ['task2', function (results, callback) {
+ setTimeout(function () {
+ callOrder.push('task1');
+ callback();
+ }, 100);
+ }],
+ task2: function (callback) {
+ setTimeout(function () {
+ callOrder.push('task2');
+ callback();
+ }, 200);
+ },
+ task3: ['task2', function (results, callback) {
+ callOrder.push('task3');
+ callback();
+ }],
+ task4: ['task1', 'task2', function (results, callback) {
+ callOrder.push('task4');
+ callback();
+ }]
+ },
+ function (err) {
+ if (err) throw err;
+ expect(callOrder).to.eql(['task2', 'task3', 'task1', 'task4']);
+ done();
+ });
+ });
+
+ it('auto results', function(done){
+ var callOrder = [];
+ async.auto({
+ task1: ['task2', function(results, callback){
+ expect(results.task2).to.eql('task2');
+ setTimeout(function(){
+ callOrder.push('task1');
+ callback(null, 'task1a', 'task1b');
+ }, 25);
+ }],
+ task2: function(callback){
+ setTimeout(function(){
+ callOrder.push('task2');
+ callback(null, 'task2');
+ }, 50);
+ },
+ task3: ['task2', function(results, callback){
+ expect(results.task2).to.eql('task2');
+ callOrder.push('task3');
+ callback(null);
+ }],
+ task4: ['task1', 'task2', function(results, callback){
+ expect(results.task1).to.eql(['task1a','task1b']);
+ expect(results.task2).to.eql('task2');
+ callOrder.push('task4');
+ callback(null, 'task4');
+ }]
+ },
+ function(err, results){
+ expect(callOrder).to.eql(['task2','task3','task1','task4']);
+ expect(results).to.eql({task1: ['task1a','task1b'], task2: 'task2', task3: undefined, task4: 'task4'});
+ done();
+ });
+ });
+
+ it('auto empty object', function(done){
+ async.auto({}, function(err){
+ expect(err).to.equal(null);
+ done();
+ });
+ });
+
+ it('auto error', function(done){
+ async.auto({
+ task1: function(callback){
+ callback('testerror');
+ },
+ task2: ['task1', function(results, callback){
+ throw new Error('task2 should not be called');
+ }],
+ task3: function(callback){
+ callback('testerror2');
+ }
+ },
+ function(err){
+ expect(err).to.equal('testerror');
+ });
+ setTimeout(done, 100);
+ });
+
+ it('auto no callback', function(done){
+ async.auto({
+ task1: function(callback){callback();},
+ task2: ['task1', function(results, callback){callback(); done();}]
+ });
+ });
+
+ it('auto concurrency no callback', function(done){
+ async.auto({
+ task1: function(callback){callback();},
+ task2: ['task1', function(results, callback){callback(); done();}]
+ }, 1);
+ });
+
+ it('auto error should pass partial results', function(done) {
+ async.auto({
+ task1: function(callback){
+ callback(false, 'result1');
+ },
+ task2: ['task1', function(results, callback){
+ callback('testerror', 'result2');
+ }],
+ task3: ['task2', function(){
+ throw new Error('task3 should not be called');
+ }]
+ },
+ function(err, results){
+ expect(err).to.equal('testerror');
+ expect(results.task1).to.equal('result1');
+ expect(results.task2).to.equal('result2');
+ done();
+ });
+ });
+
+ // Issue 24 on github: https://github.com/caolan/async/issues#issue/24
+ // Issue 76 on github: https://github.com/caolan/async/issues#issue/76
+ it('auto removeListener has side effect on loop iterator', function(done) {
+ async.auto({
+ task1: ['task3', function(/*callback*/) { done(); }],
+ task2: ['task3', function(/*callback*/) { /* by design: DON'T call callback */ }],
+ task3: function(callback) { callback(); }
+ });
+ });
+
+ // Issue 410 on github: https://github.com/caolan/async/issues/410
+ it('auto calls callback multiple times', function(done) {
+ if (process.browser) {
+ // node only test
+ return done();
+ }
+ var finalCallCount = 0;
+ var domain = require('domain').create();
+ domain.on('error', function (e) {
+ // ignore test error
+ if (!e._test_error) {
+ return done(e);
+ }
+ });
+ domain.run(function () {
+ async.auto({
+ task1: function(callback) { callback(null); },
+ task2: ['task1', function(results, callback) { callback(null); }]
+ },
+
+ // Error throwing final callback. This should only run once
+ function() {
+ finalCallCount++;
+ var e = new Error('An error');
+ e._test_error = true;
+ throw e;
+ });
+ });
+ setTimeout(function () {
+ expect(finalCallCount).to.equal(1);
+ done();
+ }, 10);
+ });
+
+
+ it('auto calls callback multiple times with parallel functions', function(done) {
+ async.auto({
+ task1: function(callback) { setTimeout(callback,0,'err'); },
+ task2: function(callback) { setTimeout(callback,0,'err'); }
+ },
+ // Error throwing final callback. This should only run once
+ function(err) {
+ expect(err).to.equal('err');
+ done();
+ });
+ });
+
+
+ // Issue 462 on github: https://github.com/caolan/async/issues/462
+ it('auto modifying results causes final callback to run early', function(done) {
+ async.auto({
+ task1: function(callback){
+ callback(null, 'task1');
+ },
+ task2: ['task1', function(results, callback){
+ results.inserted = true;
+ setTimeout(function(){
+ callback(null, 'task2');
+ }, 50);
+ }],
+ task3: function(callback){
+ setTimeout(function(){
+ callback(null, 'task3');
+ }, 100);
+ }
+ },
+ function(err, results){
+ expect(results.inserted).to.equal(true);
+ expect(results.task3).to.equal('task3');
+ done();
+ });
+ });
+
+ // Issue 263 on github: https://github.com/caolan/async/issues/263
+ it('auto prevent dead-locks due to inexistant dependencies', function(done) {
+ expect(function () {
+ async.auto({
+ task1: ['noexist', function(results, callback){
+ callback(null, 'task1');
+ }]
+ });
+ }).to.throw;
+ done();
+ });
+
+ // Issue 263 on github: https://github.com/caolan/async/issues/263
+ it('auto prevent dead-locks due to cyclic dependencies', function(done) {
+ expect(function () {
+ async.auto({
+ task1: ['task2', function(results, callback){
+ callback(null, 'task1');
+ }],
+ task2: ['task1', function(results, callback){
+ callback(null, 'task2');
+ }]
+ });
+ }).to.throw;
+ done();
+ });
+
+ // Issue 988 on github: https://github.com/caolan/async/issues/988
+ it('auto stops running tasks on error', function(done) {
+ async.auto({
+ task1: function (callback) {
+ callback('error');
+ },
+ task2: function (callback) {
+ throw new Error('test2 should not be called');
+ }
+ }, 1, function (error) {
+ expect(error).to.equal('error');
+ done();
+ });
+ });
+
+ it('ignores results after an error', function (done) {
+ async.auto({
+ task1: function (cb) {
+ setTimeout(cb, 25, 'error');
+ },
+ task2: function (cb) {
+ setTimeout(cb, 30, null);
+ },
+ task3: ['task2', function () {
+ throw new Error("task should not have been called");
+ }]
+ }, function (err) {
+ expect(err).to.equal('error');
+ setTimeout(done, 25, null);
+ });
+ });
+
+});