hamjest
Version:
A library of composable matchers for defining meaningful and readable assertions in JavaScript.
307 lines (231 loc) • 8.19 kB
JavaScript
;
const _ = require('lodash');
const assert = require('assert');
const __ = require('../../..');
describe('IsFulfilled', () => {
it('should provide a better readable alias', () => {
__.assertThat(__.isFulfilledWith, __.is(__.fulfilled));
});
describe('fulfilled', () => {
describe('without argument', () => {
let sut;
beforeEach(() => {
sut = __.fulfilled();
});
it('should return a promise', () => {
const aFulfilledPromise = Promise.resolve('a value');
const result = sut.matches(aFulfilledPromise);
assert.ok(result);
assert.ok(_.isFunction(result.then));
});
it('should match fulfilled promises', () => {
const aFulfilledPromise = Promise.resolve('a value');
return sut.matches(aFulfilledPromise).then((value) => {
assert.ok(value);
});
});
it('should not match rejected promises', () => {
const aRejectedPromise = Promise.reject(new Error('rejected for a reason'));
return sut.matches(aRejectedPromise).then((value) => {
assert.equal(value, false);
});
});
it('should wait for pending promises', (done) => {
let resolveFn;
const deferred = new Promise((resolve) => {
resolveFn = resolve;
});
sut.matches(deferred).then((value) => {
assert.ok(value);
})
.then(done, done);
resolveFn();
});
it('should describe nicely', () => {
const description = new __.Description();
sut.describeTo(description);
__.assertThat(description.get(), __.equalTo('a fulfilled promise'));
});
});
describe('with a value', () => {
let sut;
beforeEach(() => {
sut = __.fulfilled('a value');
});
it('should return a promise', () => {
const aFulfilledPromise = Promise.resolve('a value');
const result = sut.matches(aFulfilledPromise);
assert.ok(result);
assert.ok(_.isFunction(result.then));
});
it('should match fulfilled promise with equivalent value', () => {
const aFulfilledPromise = Promise.resolve('a value');
return sut.matches(aFulfilledPromise).then((value) => {
assert.ok(value);
});
});
it('should not match fulfilled promise with different value', () => {
const aFulfilledPromise = Promise.resolve('another value');
return sut.matches(aFulfilledPromise).then((value) => {
assert.equal(value, false);
});
});
it('should not match rejected promise', () => {
const aRejectedPromise = Promise.reject(new Error('a value'));
return sut.matches(aRejectedPromise).then((value) => {
assert.equal(value, false);
});
});
it('should wait for pending promises', (done) => {
let resolveFn;
const deferred = new Promise((resolve) => {
resolveFn = resolve;
});
sut.matches(deferred).then((value) => {
assert.ok(value);
})
.then(done, done);
resolveFn('a value');
});
describe('description', () => {
let description;
beforeEach(() => {
description = new __.Description();
});
it('should contain value', () => {
sut.describeTo(description);
__.assertThat(description.get(), __.equalTo('a promise fulfilled with "a value"'));
});
it('should contain mismatched value', () => {
const actual = Promise.resolve('another value');
return sut.describeMismatch(actual, description).then(() => {
__.assertThat(description.get(), __.equalTo('fulfillment value: was "another value"'));
});
});
it('should contain rejected reason', () => {
const actual = Promise.reject(new Error('for a reason'));
return sut.describeMismatch(actual, description).then(() => {
__.assertThat(description.get(), __.allOf(__.containsString('was'), __.containsString('rejected'), __.containsString('"for a reason"')));
});
});
});
});
describe('with a matcher', () => {
let sut;
beforeEach(() => {
sut = __.fulfilled(__.containsString('expected'));
});
it('should match fulfilled promise with matching values', () => {
const aFulfilledPromise = Promise.resolve('expected value');
return sut.matches(aFulfilledPromise).then((value) => {
assert.ok(value);
});
});
it('should not match fulfilled promise with nonmatching value', () => {
const aFulfilledPromise = Promise.resolve('another value');
return sut.matches(aFulfilledPromise).then((value) => {
assert.equal(value, false);
});
});
it('should not match rejected promise', () => {
const aRejectedPromise = Promise.reject(new Error('rejected for expected reason'));
return sut.matches(aRejectedPromise).then((value) => {
assert.equal(value, false);
});
});
it('should wait for pending promises', (done) => {
let resolveFn;
const deferred = new Promise((resolve) => {
resolveFn = resolve;
});
sut.matches(deferred).then((value) => {
assert.ok(value);
})
.then(done, done);
resolveFn('expected value');
});
describe('description', () => {
let description;
beforeEach(() => {
description = new __.Description();
});
it('should contain matcher description', () => {
sut.describeTo(description);
__.assertThat(description.get(), __.equalTo('a promise fulfilled with a string containing "expected"'));
});
it('should contain mismatched value', () => {
const actual = Promise.resolve('another value');
return sut.describeMismatch(actual, description).then(() => {
__.assertThat(description.get(), __.equalTo('fulfillment value: was "another value"'));
});
});
it('should contain mismatch description', () => {
sut = __.fulfilled(__.hasProperties({
expected: 'value',
other: 'property'
}));
const actual = Promise.resolve({expected: 'another value', other: 'property'});
return sut.describeMismatch(actual, description).then(() => {
__.assertThat(description.get(), __.equalTo('fulfillment value: expected was "another value"'));
});
});
it('should contain rejected reason', () => {
const actual = Promise.reject(new Error('for a reason'));
return sut.describeMismatch(actual, description).then(() => {
__.assertThat(description.get(), __.allOf(__.containsString('was'), __.containsString('rejected'), __.containsString('"for a reason"')));
});
});
});
});
describe('with a promising matcher', () => {
let sut;
beforeEach(() => {
sut = __.fulfilled(__.contains(__.willBe('expected')));
});
it('should match fulfilled promise with matching values', () => {
const aFulfilledPromise = Promise.resolve([
Promise.resolve('expected')
]);
return sut.matches(aFulfilledPromise).then((value) => {
assert.ok(value);
});
});
it('should not match fulfilled promise with nonmatching value', () => {
const aFulfilledPromise = Promise.resolve([
Promise.resolve('another value')
]);
return sut.matches(aFulfilledPromise).then((value) => {
assert.equal(value, false);
});
});
it('should wait for pending promises', (done) => {
let resolveFn;
const deferred = new Promise((resolve) => {
resolveFn = resolve;
});
const aFulfilledPromiseContainingAPendingPromise = Promise.resolve([deferred]);
sut.matches(aFulfilledPromiseContainingAPendingPromise).then((value) => {
assert.ok(value);
})
.then(done, done);
resolveFn('expected');
});
describe('description', () => {
let description;
beforeEach(() => {
description = new __.Description();
});
it('should contain matcher description', () => {
sut.describeTo(description);
__.assertThat(description.get(), __.equalTo('a promise fulfilled with [a promise fulfilled with "expected"]'));
});
it('should contain mismatch description', () => {
const actual = Promise.resolve([Promise.resolve('another value')]);
return sut.describeMismatch(actual, description).then(() => {
__.assertThat(description.get(), __.equalTo('fulfillment value: item 0: fulfillment value: was "another value"\n'));
});
});
});
});
});
});