diff options
Diffstat (limited to 'spec/frontend/boards/stores/actions_spec.js')
-rw-r--r-- | spec/frontend/boards/stores/actions_spec.js | 219 |
1 files changed, 135 insertions, 84 deletions
diff --git a/spec/frontend/boards/stores/actions_spec.js b/spec/frontend/boards/stores/actions_spec.js index e4209cd5e55..32d0e7ae886 100644 --- a/spec/frontend/boards/stores/actions_spec.js +++ b/spec/frontend/boards/stores/actions_spec.js @@ -1,5 +1,17 @@ import testAction from 'helpers/vuex_action_helper'; import { + fullBoardId, + formatListIssues, + formatBoardLists, + formatIssueInput, +} from '~/boards/boards_util'; +import { inactiveId } from '~/boards/constants'; +import destroyBoardListMutation from '~/boards/graphql/board_list_destroy.mutation.graphql'; +import issueCreateMutation from '~/boards/graphql/issue_create.mutation.graphql'; +import issueMoveListMutation from '~/boards/graphql/issue_move_list.mutation.graphql'; +import actions, { gqlClient } from '~/boards/stores/actions'; +import * as types from '~/boards/stores/mutation_types'; +import { mockLists, mockListsById, mockIssue, @@ -11,20 +23,6 @@ import { mockActiveIssue, mockGroupProjects, } from '../mock_data'; -import actions, { gqlClient } from '~/boards/stores/actions'; -import * as types from '~/boards/stores/mutation_types'; -import { inactiveId } from '~/boards/constants'; -import issueMoveListMutation from '~/boards/graphql/issue_move_list.mutation.graphql'; -import destroyBoardListMutation from '~/boards/graphql/board_list_destroy.mutation.graphql'; -import issueCreateMutation from '~/boards/graphql/issue_create.mutation.graphql'; -import updateAssignees from '~/vue_shared/components/sidebar/queries/updateAssignees.mutation.graphql'; -import { - fullBoardId, - formatListIssues, - formatBoardLists, - formatIssueInput, -} from '~/boards/boards_util'; -import createFlash from '~/flash'; jest.mock('~/flash'); @@ -71,7 +69,7 @@ describe('setFilters', () => { actions.setFilters, filters, state, - [{ type: types.SET_FILTERS, payload: filters }], + [{ type: types.SET_FILTERS, payload: { ...filters, not: {} } }], [], done, ); @@ -186,7 +184,27 @@ describe('fetchLists', () => { }); describe('createList', () => { - it('should dispatch addList action when creating backlog list', (done) => { + let commit; + let dispatch; + let getters; + let state; + + beforeEach(() => { + state = { + fullPath: 'gitlab-org', + boardId: '1', + boardType: 'group', + disabled: false, + boardLists: [{ type: 'closed' }], + }; + commit = jest.fn(); + dispatch = jest.fn(); + getters = { + getListByLabelId: jest.fn(), + }; + }); + + it('should dispatch addList action when creating backlog list', async () => { const backlogList = { id: 'gid://gitlab/List/1', listType: 'backlog', @@ -205,25 +223,35 @@ describe('createList', () => { }), ); - const state = { - fullPath: 'gitlab-org', - boardId: '1', - boardType: 'group', - disabled: false, - boardLists: [{ type: 'closed' }], + await actions.createList({ getters, state, commit, dispatch }, { backlog: true }); + + expect(dispatch).toHaveBeenCalledWith('addList', backlogList); + }); + + it('dispatches highlightList after addList has succeeded', async () => { + const list = { + id: 'gid://gitlab/List/1', + listType: 'label', + title: 'Open', + labelId: '4', }; - testAction( - actions.createList, - { backlog: true }, - state, - [], - [{ type: 'addList', payload: backlogList }], - done, - ); + jest.spyOn(gqlClient, 'mutate').mockResolvedValue({ + data: { + boardListCreate: { + list, + errors: [], + }, + }, + }); + + await actions.createList({ getters, state, commit, dispatch }, { labelId: '4' }); + + expect(dispatch).toHaveBeenCalledWith('addList', list); + expect(dispatch).toHaveBeenCalledWith('highlightList', list.id); }); - it('should commit CREATE_LIST_FAILURE mutation when API returns an error', (done) => { + it('should commit CREATE_LIST_FAILURE mutation when API returns an error', async () => { jest.spyOn(gqlClient, 'mutate').mockReturnValue( Promise.resolve({ data: { @@ -235,22 +263,49 @@ describe('createList', () => { }), ); - const state = { - fullPath: 'gitlab-org', - boardId: '1', - boardType: 'group', - disabled: false, - boardLists: [{ type: 'closed' }], + await actions.createList({ getters, state, commit, dispatch }, { backlog: true }); + + expect(commit).toHaveBeenCalledWith(types.CREATE_LIST_FAILURE); + }); + + it('highlights list and does not re-query if it already exists', async () => { + const existingList = { + id: 'gid://gitlab/List/1', + listType: 'label', + title: 'Some label', + position: 1, }; - testAction( - actions.createList, - { backlog: true }, - state, - [{ type: types.CREATE_LIST_FAILURE }], - [], - done, - ); + getters = { + getListByLabelId: jest.fn().mockReturnValue(existingList), + }; + + await actions.createList({ getters, state, commit, dispatch }, { backlog: true }); + + expect(dispatch).toHaveBeenCalledWith('highlightList', existingList.id); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(commit).not.toHaveBeenCalled(); + }); +}); + +describe('fetchLabels', () => { + it('should commit mutation RECEIVE_LABELS_SUCCESS on success', async () => { + const queryResponse = { + data: { + group: { + labels: { + nodes: labels, + }, + }, + }, + }; + jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse); + + await testAction({ + action: actions.fetchLabels, + state: { boardType: 'group' }, + expectedMutations: [{ type: types.RECEIVE_LABELS_SUCCESS, payload: labels }], + }); }); }); @@ -669,65 +724,27 @@ describe('moveIssue', () => { describe('setAssignees', () => { const node = { username: 'name' }; - const name = 'username'; const projectPath = 'h/h'; const refPath = `${projectPath}#3`; const iid = '1'; describe('when succeeds', () => { - beforeEach(() => { - jest.spyOn(gqlClient, 'mutate').mockResolvedValue({ - data: { issueSetAssignees: { issue: { assignees: { nodes: [{ ...node }] } } } }, - }); - }); - - it('calls mutate with the correct values', async () => { - await actions.setAssignees( - { commit: () => {}, getters: { activeIssue: { iid, referencePath: refPath } } }, - [name], - ); - - expect(gqlClient.mutate).toHaveBeenCalledWith({ - mutation: updateAssignees, - variables: { iid, assigneeUsernames: [name], projectPath }, - }); - }); - it('calls the correct mutation with the correct values', (done) => { testAction( actions.setAssignees, - {}, + [node], { activeIssue: { iid, referencePath: refPath }, commit: () => {} }, [ - { type: types.SET_ASSIGNEE_LOADING, payload: true }, { type: 'UPDATE_ISSUE_BY_ID', payload: { prop: 'assignees', issueId: undefined, value: [node] }, }, - { type: types.SET_ASSIGNEE_LOADING, payload: false }, ], [], done, ); }); }); - - describe('when fails', () => { - beforeEach(() => { - jest.spyOn(gqlClient, 'mutate').mockRejectedValue(); - }); - - it('calls createFlash', async () => { - await actions.setAssignees({ - commit: () => {}, - getters: { activeIssue: { iid, referencePath: refPath } }, - }); - - expect(createFlash).toHaveBeenCalledWith({ - message: 'An error occurred while updating assignees.', - }); - }); - }); }); describe('createNewIssue', () => { @@ -1201,6 +1218,40 @@ describe('setSelectedProject', () => { }); }); +describe('toggleBoardItemMultiSelection', () => { + const boardItem = mockIssue; + + it('should commit mutation ADD_BOARD_ITEM_TO_SELECTION if item is not on selection state', () => { + testAction( + actions.toggleBoardItemMultiSelection, + boardItem, + { selectedBoardItems: [] }, + [ + { + type: types.ADD_BOARD_ITEM_TO_SELECTION, + payload: boardItem, + }, + ], + [], + ); + }); + + it('should commit mutation REMOVE_BOARD_ITEM_FROM_SELECTION if item is on selection state', () => { + testAction( + actions.toggleBoardItemMultiSelection, + boardItem, + { selectedBoardItems: [mockIssue] }, + [ + { + type: types.REMOVE_BOARD_ITEM_FROM_SELECTION, + payload: boardItem, + }, + ], + [], + ); + }); +}); + describe('fetchBacklog', () => { expectNotImplemented(actions.fetchBacklog); }); |