mirror of https://github.com/lukechilds/ava.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
324 lines
6.9 KiB
324 lines
6.9 KiB
'use strict';
|
|
var Promise = require('bluebird');
|
|
var test = require('tap').test;
|
|
var Test = require('../lib/test');
|
|
|
|
function ava(fn) {
|
|
var a = new Test(fn);
|
|
a.metadata = {callback: false};
|
|
return a;
|
|
}
|
|
|
|
ava.cb = function (fn) {
|
|
var a = new Test(fn);
|
|
a.metadata = {callback: true};
|
|
return a;
|
|
};
|
|
|
|
function pass() {
|
|
return new Promise(function (resolve) {
|
|
setImmediate(resolve);
|
|
});
|
|
}
|
|
|
|
function fail() {
|
|
return new Promise(function (resolve, reject) {
|
|
setImmediate(function () {
|
|
reject(new Error('unicorn'));
|
|
});
|
|
});
|
|
}
|
|
|
|
test('returning a promise from a legacy async fn is an error', function (t) {
|
|
ava.cb(function (a) {
|
|
a.plan(1);
|
|
|
|
return Promise.resolve(true).then(function () {
|
|
a.pass();
|
|
a.end();
|
|
});
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, false);
|
|
t.match(result.reason.message, /Do not return promises/);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('assertion plan is tested after returned promise resolves', function (t) {
|
|
var start = Date.now();
|
|
ava(function (a) {
|
|
a.plan(2);
|
|
|
|
var defer = Promise.defer();
|
|
|
|
setTimeout(function () {
|
|
defer.resolve();
|
|
}, 500);
|
|
|
|
a.pass();
|
|
a.pass();
|
|
|
|
return defer.promise;
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, true);
|
|
t.is(result.result.planCount, 2);
|
|
t.is(result.result.assertCount, 2);
|
|
t.true(Date.now() - start >= 500);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('missing assertion will fail the test', function (t) {
|
|
ava(function (a) {
|
|
a.plan(2);
|
|
|
|
var defer = Promise.defer();
|
|
|
|
setTimeout(function () {
|
|
a.pass();
|
|
defer.resolve();
|
|
}, 200);
|
|
|
|
return defer.promise;
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, false);
|
|
t.is(result.reason.expected, 2);
|
|
t.is(result.reason.actual, 1);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('extra assertion will fail the test', function (t) {
|
|
ava(function (a) {
|
|
a.plan(2);
|
|
|
|
var defer = Promise.defer();
|
|
|
|
setTimeout(function () {
|
|
a.pass();
|
|
a.pass();
|
|
}, 200);
|
|
|
|
setTimeout(function () {
|
|
a.pass();
|
|
defer.resolve();
|
|
}, 500);
|
|
|
|
return defer.promise;
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, false);
|
|
t.is(result.reason.expected, 2);
|
|
t.is(result.reason.actual, 3);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('handle throws with rejected promise', function (t) {
|
|
ava(function (a) {
|
|
a.plan(1);
|
|
|
|
var promise = Promise.reject(new Error());
|
|
return a.throws(promise);
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, true);
|
|
t.is(result.result.assertCount, 1);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
// TODO(team): This is a very slow test, and I can't figure out why we need it - James
|
|
test('handle throws with long running rejected promise', function (t) {
|
|
ava(function (a) {
|
|
a.plan(1);
|
|
|
|
var promise = new Promise(function (resolve, reject) {
|
|
setTimeout(function () {
|
|
reject(new Error('abc'));
|
|
}, 2000);
|
|
});
|
|
|
|
return a.throws(promise, /abc/);
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, true);
|
|
t.is(result.result.assertCount, 1);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('handle throws with resolved promise', function (t) {
|
|
ava(function (a) {
|
|
a.plan(1);
|
|
|
|
var promise = Promise.resolve();
|
|
return a.throws(promise);
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, false);
|
|
t.is(result.reason.name, 'AssertionError');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('handle throws with regex', function (t) {
|
|
ava(function (a) {
|
|
a.plan(1);
|
|
|
|
var promise = Promise.reject(new Error('abc'));
|
|
return a.throws(promise, /abc/);
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, true);
|
|
t.is(result.result.assertCount, 1);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('throws with regex will fail if error message does not match', function (t) {
|
|
ava(function (a) {
|
|
a.plan(1);
|
|
|
|
var promise = Promise.reject(new Error('abc'));
|
|
return a.throws(promise, /def/);
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, false);
|
|
t.is(result.reason.name, 'AssertionError');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('handle throws with string', function (t) {
|
|
ava(function (a) {
|
|
a.plan(1);
|
|
|
|
var promise = Promise.reject(new Error('abc'));
|
|
return a.throws(promise, 'abc');
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, true);
|
|
t.is(result.result.assertCount, 1);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('throws with string argument will reject if message does not match', function (t) {
|
|
ava(function (a) {
|
|
a.plan(1);
|
|
|
|
var promise = Promise.reject(new Error('abc'));
|
|
return a.throws(promise, 'def');
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, false);
|
|
t.is(result.reason.name, 'AssertionError');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('handle throws with regex with string reject', function (t) {
|
|
ava(function (a) {
|
|
a.plan(1);
|
|
|
|
var promise = Promise.reject('abc');
|
|
return a.throws(promise, /abc/);
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, true);
|
|
t.is(result.result.assertCount, 1);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('handle throws with string with string reject', function (t) {
|
|
ava(function (a) {
|
|
a.plan(1);
|
|
|
|
var promise = Promise.reject('abc');
|
|
return a.throws(promise, 'abc');
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, true);
|
|
t.is(result.result.assertCount, 1);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('handle throws with false-positive promise', function (t) {
|
|
ava(function (a) {
|
|
a.plan(1);
|
|
|
|
var promise = Promise.resolve(new Error());
|
|
return a.throws(promise);
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, false);
|
|
t.is(result.reason.name, 'AssertionError');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('handle notThrows with resolved promise', function (t) {
|
|
ava(function (a) {
|
|
a.plan(1);
|
|
|
|
var promise = Promise.resolve();
|
|
return a.notThrows(promise);
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, true);
|
|
t.is(result.result.assertCount, 1);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('handle notThrows with rejected promise', function (t) {
|
|
ava(function (a) {
|
|
a.plan(1);
|
|
|
|
var promise = Promise.reject(new Error());
|
|
return a.notThrows(promise);
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, false);
|
|
t.is(result.reason.name, 'AssertionError');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('assert pass', function (t) {
|
|
ava(function (a) {
|
|
return pass().then(function () {
|
|
a.pass();
|
|
});
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, true);
|
|
t.is(result.result.assertCount, 1);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('assert fail', function (t) {
|
|
ava(function (a) {
|
|
return pass().then(function () {
|
|
a.fail();
|
|
});
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, false);
|
|
t.is(result.reason.name, 'AssertionError');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('reject', function (t) {
|
|
ava(function (a) {
|
|
return fail().then(function () {
|
|
a.pass();
|
|
});
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, false);
|
|
t.is(result.reason.name, 'Error');
|
|
t.is(result.reason.message, 'unicorn');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('reject with non-Error', function (t) {
|
|
ava(function () {
|
|
return Promise.reject('failure');
|
|
}).run().then(function (result) {
|
|
t.is(result.passed, false);
|
|
t.is(result.reason.name, 'AssertionError');
|
|
t.is(result.reason.message, 'Promise rejected with "failure"');
|
|
t.end();
|
|
});
|
|
});
|
|
|