167 lines
4.6 KiB
JavaScript
167 lines
4.6 KiB
JavaScript
|
import MockAdapter from 'axios-mock-adapter';
|
||
|
import { TEST_HOST } from 'spec/test_constants';
|
||
|
import axios from '~/lib/utils/axios_utils';
|
||
|
import testAction from './vuex_action_helper';
|
||
|
|
||
|
describe('VueX test helper (testAction)', () => {
|
||
|
let originalExpect;
|
||
|
let assertion;
|
||
|
let mock;
|
||
|
const noop = () => {};
|
||
|
|
||
|
beforeAll(() => {
|
||
|
mock = new MockAdapter(axios);
|
||
|
/*
|
||
|
In order to test the helper properly, we need to overwrite the jasmine `expect` helper.
|
||
|
We test that the testAction helper properly passes the dispatched actions/committed mutations
|
||
|
to the jasmine helper.
|
||
|
*/
|
||
|
originalExpect = expect;
|
||
|
assertion = null;
|
||
|
global.expect = actual => ({
|
||
|
toEqual: () => {
|
||
|
originalExpect(actual).toEqual(assertion);
|
||
|
},
|
||
|
});
|
||
|
});
|
||
|
|
||
|
afterAll(() => {
|
||
|
mock.restore();
|
||
|
global.expect = originalExpect;
|
||
|
});
|
||
|
|
||
|
it('should properly pass on state and payload', () => {
|
||
|
const exampleState = { FOO: 12, BAR: 3 };
|
||
|
const examplePayload = { BAZ: 73, BIZ: 55 };
|
||
|
|
||
|
const action = ({ state }, payload) => {
|
||
|
originalExpect(state).toEqual(exampleState);
|
||
|
originalExpect(payload).toEqual(examplePayload);
|
||
|
};
|
||
|
|
||
|
assertion = { mutations: [], actions: [] };
|
||
|
|
||
|
testAction(action, examplePayload, exampleState);
|
||
|
});
|
||
|
|
||
|
describe('should work with synchronous actions', () => {
|
||
|
it('committing mutation', () => {
|
||
|
const action = ({ commit }) => {
|
||
|
commit('MUTATION');
|
||
|
};
|
||
|
|
||
|
assertion = { mutations: [{ type: 'MUTATION' }], actions: [] };
|
||
|
|
||
|
testAction(action, null, {}, assertion.mutations, assertion.actions, noop);
|
||
|
});
|
||
|
|
||
|
it('dispatching action', () => {
|
||
|
const action = ({ dispatch }) => {
|
||
|
dispatch('ACTION');
|
||
|
};
|
||
|
|
||
|
assertion = { actions: [{ type: 'ACTION' }], mutations: [] };
|
||
|
|
||
|
testAction(action, null, {}, assertion.mutations, assertion.actions, noop);
|
||
|
});
|
||
|
|
||
|
it('work with jasmine done once finished', done => {
|
||
|
assertion = { mutations: [], actions: [] };
|
||
|
|
||
|
testAction(noop, null, {}, assertion.mutations, assertion.actions, done);
|
||
|
});
|
||
|
|
||
|
it('provide promise interface', done => {
|
||
|
assertion = { mutations: [], actions: [] };
|
||
|
|
||
|
testAction(noop, null, {}, assertion.mutations, assertion.actions)
|
||
|
.then(done)
|
||
|
.catch(done.fail);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('should work with promise based actions (fetch action)', () => {
|
||
|
let lastError;
|
||
|
const data = { FOO: 'BAR' };
|
||
|
|
||
|
const promiseAction = ({ commit, dispatch }) => {
|
||
|
dispatch('ACTION');
|
||
|
|
||
|
return axios
|
||
|
.get(TEST_HOST)
|
||
|
.catch(error => {
|
||
|
commit('ERROR');
|
||
|
lastError = error;
|
||
|
throw error;
|
||
|
})
|
||
|
.then(() => {
|
||
|
commit('SUCCESS');
|
||
|
return data;
|
||
|
});
|
||
|
};
|
||
|
|
||
|
beforeEach(() => {
|
||
|
lastError = null;
|
||
|
});
|
||
|
|
||
|
it('work with jasmine done once finished', done => {
|
||
|
mock.onGet(TEST_HOST).replyOnce(200, 42);
|
||
|
|
||
|
assertion = { mutations: [{ type: 'SUCCESS' }], actions: [{ type: 'ACTION' }] };
|
||
|
|
||
|
testAction(promiseAction, null, {}, assertion.mutations, assertion.actions, done);
|
||
|
});
|
||
|
|
||
|
it('return original data of successful promise while checking actions/mutations', done => {
|
||
|
mock.onGet(TEST_HOST).replyOnce(200, 42);
|
||
|
|
||
|
assertion = { mutations: [{ type: 'SUCCESS' }], actions: [{ type: 'ACTION' }] };
|
||
|
|
||
|
testAction(promiseAction, null, {}, assertion.mutations, assertion.actions)
|
||
|
.then(res => {
|
||
|
originalExpect(res).toEqual(data);
|
||
|
done();
|
||
|
})
|
||
|
.catch(done.fail);
|
||
|
});
|
||
|
|
||
|
it('return original error of rejected promise while checking actions/mutations', done => {
|
||
|
mock.onGet(TEST_HOST).replyOnce(500, '');
|
||
|
|
||
|
assertion = { mutations: [{ type: 'ERROR' }], actions: [{ type: 'ACTION' }] };
|
||
|
|
||
|
testAction(promiseAction, null, {}, assertion.mutations, assertion.actions)
|
||
|
.then(done.fail)
|
||
|
.catch(error => {
|
||
|
originalExpect(error).toBe(lastError);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('should work with async actions not returning promises', done => {
|
||
|
const data = { FOO: 'BAR' };
|
||
|
|
||
|
const promiseAction = ({ commit, dispatch }) => {
|
||
|
dispatch('ACTION');
|
||
|
|
||
|
axios
|
||
|
.get(TEST_HOST)
|
||
|
.then(() => {
|
||
|
commit('SUCCESS');
|
||
|
return data;
|
||
|
})
|
||
|
.catch(error => {
|
||
|
commit('ERROR');
|
||
|
throw error;
|
||
|
});
|
||
|
};
|
||
|
|
||
|
mock.onGet(TEST_HOST).replyOnce(200, 42);
|
||
|
|
||
|
assertion = { mutations: [{ type: 'SUCCESS' }], actions: [{ type: 'ACTION' }] };
|
||
|
|
||
|
testAction(promiseAction, null, {}, assertion.mutations, assertion.actions, done);
|
||
|
});
|
||
|
});
|