expect-gen
Version:
Assertion library for unit testing JS generators. Works well with redux-saga. Allows snapshot testing.
241 lines (206 loc) • 5.47 kB
JavaScript
const { put } = require('redux-saga/effects');
const assert = require('assert-diff');
const StepManager = require('../step-manager');
const { deepEqual } = assert;
function startLoading(ids) {
return {
payload: ids,
type: 'LOADING',
};
}
function* myEffect(ids) {
yield put(startLoading(ids));
}
function* myEffect2(ids) {
const val = yield ids;
return val;
}
describe('StepManager', () => {
let args;
let stepManager;
let ids;
beforeEach(() => {
ids = [1, 2, 3];
args = [ids];
stepManager = new StepManager({
generator: myEffect,
args,
deepEqual,
});
});
it('stores args arguments', () => {
expect(stepManager.args)
.toBe(args);
});
it('stores generator arguments', () => {
expect(stepManager.generator)
.toBe(myEffect);
});
describe('#yields', () => {
describe('when it will pass', () => {
beforeEach(() => {
yieldedVal = put(startLoading(ids));
stepManager.yields(yieldedVal);
});
it('adds step with an expectedValue and a result', () => {
expect(stepManager.steps.length).toEqual(1);
expect(stepManager.steps[0].expectedValue).toBe(yieldedVal);
});
});
describe('when it wont pass', () => {
beforeEach(() => {
yieldedVal = put(startLoading([]));
stepManager.yields(yieldedVal);
});
it('throws on run', () => {
expect(() => stepManager.run()).toThrow();
});
});
});
it('stores generator arguments', () => {
expect(stepManager.generator)
.toBe(myEffect);
});
describe('#next', () => {
beforeEach(() => {
ids = [1, 2, 3];
args = [ids];
stepManager = new StepManager({
generator: myEffect2,
args,
deepEqual,
})
.next('123');
});
it('adds step with result but no expected value', () => {
expect(stepManager.steps.length).toEqual(1);
expect(stepManager.steps[0].result).toBe('123');
});
it('passes result into generator', () => {
stepManager.finishes('123').run();
});
});
describe('Errors', () => {
const errEffect = function* (ids) {
let val;
try {
yield ids;
} catch (e) {
yield 'CAUGHT';
}
return 'THE_END';
};
let myError;
let myIds;
beforeEach(() => {
myIds = [1, 2, 3];
args = [myIds];
myError = new Error('My error');
});
describe('#catches', () => {
beforeEach(() => {
stepManager = new StepManager({
generator: errEffect,
args,
deepEqual,
})
.next()
.catches(myError, 'CAUGHT');
});
it('stores expectedValue', () => {
expect(stepManager.steps.length).toEqual(2);
expect(stepManager.steps[1].error).toBe(myError);
expect(stepManager.steps[1].expectedValue).toBe('CAUGHT');
});
it('passes result into generator', () => {
stepManager.finishes('THE_END').run();
});
});
describe('#catchesAndFinishes', () => {
const errFinishEffect = function* (ids) {
let val;
try {
yield ids;
} catch (e) {
return 'CAUGHT';
}
return 'THE_END';
};
beforeEach(() => {
stepManager = new StepManager({
generator: errFinishEffect,
args,
deepEqual,
})
.next()
.catchesAndFinishes(myError, 'CAUGHT');
});
it('stores expectedValue', () => {
expect(stepManager.steps.length).toEqual(2);
expect(stepManager.steps[1].error).toBe(myError);
expect(stepManager.steps[1].expectedValue).toBe('CAUGHT');
});
it('passes result into generator', () => {
stepManager.run();
});
});
describe('#throws', () => {
beforeEach(() => {
stepManager = new StepManager({
generator: myEffect,
args,
deepEqual,
})
.next()
.throws(myError);
});
it('stores expectedValue', () => {
expect(stepManager.steps.length).toEqual(2);
expect(stepManager.steps[1].error).toBe(myError);
expect(stepManager.steps[1].expectedThrow).toBe(true);
});
it('passes result into generator', () => {
stepManager.run();
});
});
});
describe('#finishes', () => {
beforeEach(() => {
ids = [1, 2, 3];
args = [ids];
stepManager = new StepManager({
generator: myEffect2,
args,
deepEqual,
})
.next('123')
.finishes('123');
});
it('adds step with expectedValue and expectedDone', () => {
expect(stepManager.steps.length).toEqual(2);
expect(stepManager.steps[1].expectedValue).toBe('123');
});
it('fails assertion when generator not complete', () => {
stepManager = new StepManager({
generator: myEffect2,
args,
deepEqual,
})
.finishes('123');
expect(() => stepManager.run()).toThrow();
});
});
describe('when more steps are expected but generator is done', () => {
it('throws', () => {
stepManager = new StepManager({
generator: myEffect2,
args,
deepEqual,
})
.next()
.next()
.next();
expect(() => stepManager.run()).toThrowErrorMatchingSnapshot();
});
});
});