'use strict'; describe('createTaskWithTimeout', function() { it('resolves when promise resolves', function() { var task = function() { return Promise.resolve('hi!'); }; var taskWithTimeout = textsecure.createTaskWithTimeout(task); return taskWithTimeout().then(function(result) { assert.strictEqual(result, 'hi!') }); }); it('flows error from promise back', function() { var error = new Error('original'); var task = function() { return Promise.reject(error); }; var taskWithTimeout = textsecure.createTaskWithTimeout(task); return taskWithTimeout().catch(function(flowedError) { assert.strictEqual(error, flowedError); }); }); it('rejects if promise takes too long (this one logs error to console)', function() { var error = new Error('original'); var complete = false; var task = function() { return new Promise(function(resolve) { setTimeout(function() { complete = true; resolve(); }, 3000); }); }; var taskWithTimeout = textsecure.createTaskWithTimeout(task, this.name, { timeout: 10 }); return taskWithTimeout().then(function() { throw new Error('it was not supposed to resolve!'); }, function() { assert.strictEqual(complete, false); }); }); it('resolves if task returns something falsey', function() { var task = function() {}; var taskWithTimeout = textsecure.createTaskWithTimeout(task); return taskWithTimeout(); }); it('resolves if task returns a non-promise', function() { var task = function() { return 'hi!'; }; var taskWithTimeout = textsecure.createTaskWithTimeout(task); return taskWithTimeout().then(function(result) { assert.strictEqual(result, 'hi!') }); }); it('rejects if task throws (and does not log about taking too long)', function() { var error = new Error('Task is throwing!'); var task = function() { throw error; }; var taskWithTimeout = textsecure.createTaskWithTimeout(task, this.name, { timeout: 10 }); return taskWithTimeout().then(function(result) { throw new Error('Overall task should reject!') }, function(flowedError) { assert.strictEqual(flowedError, error); }); }); });