diff options
Diffstat (limited to 'spec/frontend/ide/stores/modules/file_templates/actions_spec.js')
-rw-r--r-- | spec/frontend/ide/stores/modules/file_templates/actions_spec.js | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/spec/frontend/ide/stores/modules/file_templates/actions_spec.js b/spec/frontend/ide/stores/modules/file_templates/actions_spec.js new file mode 100644 index 00000000000..6c1fa163a91 --- /dev/null +++ b/spec/frontend/ide/stores/modules/file_templates/actions_spec.js @@ -0,0 +1,346 @@ +import MockAdapter from 'axios-mock-adapter'; +import testAction from 'helpers/vuex_action_helper'; +import axios from '~/lib/utils/axios_utils'; +import createState from '~/ide/stores/modules/file_templates/state'; +import * as actions from '~/ide/stores/modules/file_templates/actions'; +import * as types from '~/ide/stores/modules/file_templates/mutation_types'; + +describe('IDE file templates actions', () => { + let state; + let mock; + + beforeEach(() => { + state = createState(); + + mock = new MockAdapter(axios); + }); + + afterEach(() => { + mock.restore(); + }); + + describe('requestTemplateTypes', () => { + it('commits REQUEST_TEMPLATE_TYPES', done => { + testAction( + actions.requestTemplateTypes, + null, + state, + [{ type: types.REQUEST_TEMPLATE_TYPES }], + [], + done, + ); + }); + }); + + describe('receiveTemplateTypesError', () => { + it('commits RECEIVE_TEMPLATE_TYPES_ERROR and dispatches setErrorMessage', done => { + testAction( + actions.receiveTemplateTypesError, + null, + state, + [{ type: types.RECEIVE_TEMPLATE_TYPES_ERROR }], + [ + { + type: 'setErrorMessage', + payload: { + action: expect.any(Function), + actionText: 'Please try again', + text: 'Error loading template types.', + }, + }, + ], + done, + ); + }); + }); + + describe('receiveTemplateTypesSuccess', () => { + it('commits RECEIVE_TEMPLATE_TYPES_SUCCESS', done => { + testAction( + actions.receiveTemplateTypesSuccess, + 'test', + state, + [{ type: types.RECEIVE_TEMPLATE_TYPES_SUCCESS, payload: 'test' }], + [], + done, + ); + }); + }); + + describe('fetchTemplateTypes', () => { + describe('success', () => { + const pages = [[{ name: 'MIT' }], [{ name: 'Apache' }], [{ name: 'CC' }]]; + + beforeEach(() => { + mock.onGet(/api\/(.*)\/templates\/licenses/).reply(({ params }) => { + const pageNum = params.page; + const page = pages[pageNum - 1]; + const hasNextPage = pageNum < pages.length; + + return [200, page, hasNextPage ? { 'X-NEXT-PAGE': pageNum + 1 } : {}]; + }); + }); + + it('rejects if selectedTemplateType is empty', done => { + const dispatch = jest.fn().mockName('dispatch'); + + actions + .fetchTemplateTypes({ dispatch, state }) + .then(done.fail) + .catch(() => { + expect(dispatch).not.toHaveBeenCalled(); + + done(); + }); + }); + + it('dispatches actions', done => { + state.selectedTemplateType = { key: 'licenses' }; + + testAction( + actions.fetchTemplateTypes, + null, + state, + [], + [ + { type: 'requestTemplateTypes' }, + { type: 'receiveTemplateTypesSuccess', payload: pages[0] }, + { type: 'receiveTemplateTypesSuccess', payload: pages[0].concat(pages[1]) }, + { + type: 'receiveTemplateTypesSuccess', + payload: pages[0].concat(pages[1]).concat(pages[2]), + }, + ], + done, + ); + }); + }); + + describe('error', () => { + beforeEach(() => { + mock.onGet(/api\/(.*)\/templates\/licenses/).replyOnce(500); + }); + + it('dispatches actions', done => { + state.selectedTemplateType = { key: 'licenses' }; + + testAction( + actions.fetchTemplateTypes, + null, + state, + [], + [{ type: 'requestTemplateTypes' }, { type: 'receiveTemplateTypesError' }], + done, + ); + }); + }); + }); + + describe('setSelectedTemplateType', () => { + it('commits SET_SELECTED_TEMPLATE_TYPE', () => { + const commit = jest.fn().mockName('commit'); + const options = { + commit, + dispatch() {}, + rootGetters: { activeFile: { name: 'test', prevPath: '' } }, + }; + + actions.setSelectedTemplateType(options, { name: 'test' }); + + expect(commit).toHaveBeenCalledWith(types.SET_SELECTED_TEMPLATE_TYPE, { name: 'test' }); + }); + + it('dispatches discardFileChanges if prevPath matches templates name', () => { + const dispatch = jest.fn().mockName('dispatch'); + const options = { + commit() {}, + + dispatch, + rootGetters: { activeFile: { name: 'test', path: 'test', prevPath: 'test' } }, + }; + + actions.setSelectedTemplateType(options, { name: 'test' }); + + expect(dispatch).toHaveBeenCalledWith('discardFileChanges', 'test', { root: true }); + }); + + it('dispatches renameEntry if file name doesnt match', () => { + const dispatch = jest.fn().mockName('dispatch'); + const options = { + commit() {}, + + dispatch, + rootGetters: { activeFile: { name: 'oldtest', path: 'oldtest', prevPath: '' } }, + }; + + actions.setSelectedTemplateType(options, { name: 'test' }); + + expect(dispatch).toHaveBeenCalledWith( + 'renameEntry', + { path: 'oldtest', name: 'test' }, + { root: true }, + ); + }); + }); + + describe('receiveTemplateError', () => { + it('dispatches setErrorMessage', done => { + testAction( + actions.receiveTemplateError, + 'test', + state, + [], + [ + { + type: 'setErrorMessage', + payload: { + action: expect.any(Function), + actionText: 'Please try again', + text: 'Error loading template.', + actionPayload: 'test', + }, + }, + ], + done, + ); + }); + }); + + describe('fetchTemplate', () => { + describe('success', () => { + beforeEach(() => { + mock + .onGet(/api\/(.*)\/templates\/licenses\/mit/) + .replyOnce(200, { content: 'MIT content' }); + mock + .onGet(/api\/(.*)\/templates\/licenses\/testing/) + .replyOnce(200, { content: 'testing content' }); + }); + + it('dispatches setFileTemplate if template already has content', done => { + const template = { content: 'already has content' }; + + testAction( + actions.fetchTemplate, + template, + state, + [], + [{ type: 'setFileTemplate', payload: template }], + done, + ); + }); + + it('dispatches success', done => { + const template = { key: 'mit' }; + + state.selectedTemplateType = { key: 'licenses' }; + + testAction( + actions.fetchTemplate, + template, + state, + [], + [{ type: 'setFileTemplate', payload: { content: 'MIT content' } }], + done, + ); + }); + + it('dispatches success and uses name key for API call', done => { + const template = { name: 'testing' }; + + state.selectedTemplateType = { key: 'licenses' }; + + testAction( + actions.fetchTemplate, + template, + state, + [], + [{ type: 'setFileTemplate', payload: { content: 'testing content' } }], + done, + ); + }); + }); + + describe('error', () => { + beforeEach(() => { + mock.onGet(/api\/(.*)\/templates\/licenses\/mit/).replyOnce(500); + }); + + it('dispatches error', done => { + const template = { name: 'testing' }; + + state.selectedTemplateType = { key: 'licenses' }; + + testAction( + actions.fetchTemplate, + template, + state, + [], + [{ type: 'receiveTemplateError', payload: template }], + done, + ); + }); + }); + }); + + describe('setFileTemplate', () => { + it('dispatches changeFileContent', () => { + const dispatch = jest.fn().mockName('dispatch'); + const commit = jest.fn().mockName('commit'); + const rootGetters = { activeFile: { path: 'test' } }; + + actions.setFileTemplate({ dispatch, commit, rootGetters }, { content: 'content' }); + + expect(dispatch).toHaveBeenCalledWith( + 'changeFileContent', + { path: 'test', content: 'content' }, + { root: true }, + ); + }); + + it('commits SET_UPDATE_SUCCESS', () => { + const dispatch = jest.fn().mockName('dispatch'); + const commit = jest.fn().mockName('commit'); + const rootGetters = { activeFile: { path: 'test' } }; + + actions.setFileTemplate({ dispatch, commit, rootGetters }, { content: 'content' }); + + expect(commit).toHaveBeenCalledWith('SET_UPDATE_SUCCESS', true); + }); + }); + + describe('undoFileTemplate', () => { + it('dispatches changeFileContent', () => { + const dispatch = jest.fn().mockName('dispatch'); + const commit = jest.fn().mockName('commit'); + const rootGetters = { activeFile: { path: 'test', raw: 'raw content' } }; + + actions.undoFileTemplate({ dispatch, commit, rootGetters }); + + expect(dispatch).toHaveBeenCalledWith( + 'changeFileContent', + { path: 'test', content: 'raw content' }, + { root: true }, + ); + }); + + it('commits SET_UPDATE_SUCCESS', () => { + const dispatch = jest.fn().mockName('dispatch'); + const commit = jest.fn().mockName('commit'); + const rootGetters = { activeFile: { path: 'test', raw: 'raw content' } }; + + actions.undoFileTemplate({ dispatch, commit, rootGetters }); + + expect(commit).toHaveBeenCalledWith('SET_UPDATE_SUCCESS', false); + }); + + it('dispatches discardFileChanges if file has prevPath', () => { + const dispatch = jest.fn().mockName('dispatch'); + const rootGetters = { activeFile: { path: 'test', prevPath: 'newtest', raw: 'raw content' } }; + + actions.undoFileTemplate({ dispatch, commit() {}, rootGetters }); + + expect(dispatch).toHaveBeenCalledWith('discardFileChanges', 'test', { root: true }); + }); + }); +}); |