diff options
Diffstat (limited to 'spec/frontend/milestones/stores/mutations_spec.js')
-rw-r--r-- | spec/frontend/milestones/stores/mutations_spec.js | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/spec/frontend/milestones/stores/mutations_spec.js b/spec/frontend/milestones/stores/mutations_spec.js new file mode 100644 index 00000000000..8f8ce3c87ad --- /dev/null +++ b/spec/frontend/milestones/stores/mutations_spec.js @@ -0,0 +1,159 @@ +import createState from '~/milestones/stores/state'; +import mutations from '~/milestones/stores/mutations'; +import * as types from '~/milestones/stores/mutation_types'; + +describe('Milestones combobox Vuex store mutations', () => { + let state; + + beforeEach(() => { + state = createState(); + }); + + describe('initial state', () => { + it('is created with the correct structure and initial values', () => { + expect(state).toEqual({ + projectId: null, + groupId: null, + query: '', + matches: { + projectMilestones: { + list: [], + totalCount: 0, + error: null, + }, + }, + selectedMilestones: [], + requestCount: 0, + }); + }); + }); + + describe(`${types.SET_PROJECT_ID}`, () => { + it('updates the project ID', () => { + const newProjectId = '4'; + mutations[types.SET_PROJECT_ID](state, newProjectId); + + expect(state.projectId).toBe(newProjectId); + }); + }); + + describe(`${types.SET_SELECTED_MILESTONES}`, () => { + it('sets the selected milestones', () => { + const selectedMilestones = ['v1.2.3']; + mutations[types.SET_SELECTED_MILESTONES](state, selectedMilestones); + + expect(state.selectedMilestones).toEqual(['v1.2.3']); + }); + }); + + describe(`${types.ADD_SELECTED_MILESTONESs}`, () => { + it('adds the selected milestones', () => { + const selectedMilestone = 'v1.2.3'; + mutations[types.ADD_SELECTED_MILESTONE](state, selectedMilestone); + + expect(state.selectedMilestones).toEqual(['v1.2.3']); + }); + }); + + describe(`${types.REMOVE_SELECTED_MILESTONES}`, () => { + it('removes the selected milestones', () => { + const selectedMilestone = 'v1.2.3'; + + mutations[types.SET_SELECTED_MILESTONES](state, [selectedMilestone]); + expect(state.selectedMilestones).toEqual(['v1.2.3']); + + mutations[types.REMOVE_SELECTED_MILESTONE](state, selectedMilestone); + expect(state.selectedMilestones).toEqual([]); + }); + }); + + describe(`${types.SET_QUERY}`, () => { + it('updates the search query', () => { + const newQuery = 'hello'; + mutations[types.SET_QUERY](state, newQuery); + + expect(state.query).toBe(newQuery); + }); + }); + + describe(`${types.REQUEST_START}`, () => { + it('increments requestCount by 1', () => { + mutations[types.REQUEST_START](state); + expect(state.requestCount).toBe(1); + + mutations[types.REQUEST_START](state); + expect(state.requestCount).toBe(2); + + mutations[types.REQUEST_START](state); + expect(state.requestCount).toBe(3); + }); + }); + + describe(`${types.REQUEST_FINISH}`, () => { + it('decrements requestCount by 1', () => { + state.requestCount = 3; + + mutations[types.REQUEST_FINISH](state); + expect(state.requestCount).toBe(2); + + mutations[types.REQUEST_FINISH](state); + expect(state.requestCount).toBe(1); + + mutations[types.REQUEST_FINISH](state); + expect(state.requestCount).toBe(0); + }); + }); + + describe(`${types.RECEIVE_PROJECT_MILESTONES_SUCCESS}`, () => { + it('updates state.matches.projectMilestones based on the provided API response', () => { + const response = { + data: [ + { + title: 'v0.1', + }, + { + title: 'v0.2', + }, + ], + headers: { + 'x-total': 2, + }, + }; + + mutations[types.RECEIVE_PROJECT_MILESTONES_SUCCESS](state, response); + + expect(state.matches.projectMilestones).toEqual({ + list: [ + { + title: 'v0.1', + }, + { + title: 'v0.2', + }, + ], + error: null, + totalCount: 2, + }); + }); + + describe(`${types.RECEIVE_PROJECT_MILESTONES_ERROR}`, () => { + it('updates state.matches.projectMilestones to an empty state with the error object', () => { + const error = new Error('Something went wrong!'); + + state.matches.projectMilestones = { + list: [{ title: 'v0.1' }], + totalCount: 1, + error: null, + }; + + mutations[types.RECEIVE_PROJECT_MILESTONES_ERROR](state, error); + + expect(state.matches.projectMilestones).toEqual({ + list: [], + totalCount: 0, + error, + }); + }); + }); + }); +}); |