diff options
Diffstat (limited to 'spec/frontend/members/store')
-rw-r--r-- | spec/frontend/members/store/actions_spec.js | 152 | ||||
-rw-r--r-- | spec/frontend/members/store/mutations_spec.js | 117 | ||||
-rw-r--r-- | spec/frontend/members/store/utils_spec.js | 14 |
3 files changed, 283 insertions, 0 deletions
diff --git a/spec/frontend/members/store/actions_spec.js b/spec/frontend/members/store/actions_spec.js new file mode 100644 index 00000000000..5424fee0750 --- /dev/null +++ b/spec/frontend/members/store/actions_spec.js @@ -0,0 +1,152 @@ +import { noop } from 'lodash'; +import axios from 'axios'; +import MockAdapter from 'axios-mock-adapter'; +import { members, group } from 'jest/members/mock_data'; +import testAction from 'helpers/vuex_action_helper'; +import { useFakeDate } from 'helpers/fake_date'; +import httpStatusCodes from '~/lib/utils/http_status'; +import * as types from '~/members/store/mutation_types'; +import { + updateMemberRole, + showRemoveGroupLinkModal, + hideRemoveGroupLinkModal, + updateMemberExpiration, +} from '~/members/store/actions'; + +describe('Vuex members actions', () => { + describe('update member actions', () => { + let mock; + + const state = { + members, + memberPath: '/groups/foo-bar/-/group_members/:id', + requestFormatter: noop, + }; + + beforeEach(() => { + mock = new MockAdapter(axios); + }); + + afterEach(() => { + mock.restore(); + }); + + describe('updateMemberRole', () => { + const memberId = members[0].id; + const accessLevel = { integerValue: 30, stringValue: 'Developer' }; + + const payload = { + memberId, + accessLevel, + }; + + describe('successful request', () => { + it(`commits ${types.RECEIVE_MEMBER_ROLE_SUCCESS} mutation`, async () => { + mock.onPut().replyOnce(httpStatusCodes.OK); + + await testAction(updateMemberRole, payload, state, [ + { + type: types.RECEIVE_MEMBER_ROLE_SUCCESS, + payload, + }, + ]); + + expect(mock.history.put[0].url).toBe('/groups/foo-bar/-/group_members/238'); + }); + }); + + describe('unsuccessful request', () => { + it(`commits ${types.RECEIVE_MEMBER_ROLE_ERROR} mutation and throws error`, async () => { + mock.onPut().networkError(); + + await expect( + testAction(updateMemberRole, payload, state, [ + { + type: types.RECEIVE_MEMBER_ROLE_ERROR, + }, + ]), + ).rejects.toThrowError(new Error('Network Error')); + }); + }); + }); + + describe('updateMemberExpiration', () => { + useFakeDate(2020, 2, 15, 3); + + const memberId = members[0].id; + const expiresAt = '2020-3-17'; + + describe('successful request', () => { + describe('changing expiration date', () => { + it(`commits ${types.RECEIVE_MEMBER_EXPIRATION_SUCCESS} mutation`, async () => { + mock.onPut().replyOnce(httpStatusCodes.OK); + + await testAction(updateMemberExpiration, { memberId, expiresAt }, state, [ + { + type: types.RECEIVE_MEMBER_EXPIRATION_SUCCESS, + payload: { memberId, expiresAt: '2020-03-17T00:00:00Z' }, + }, + ]); + + expect(mock.history.put[0].url).toBe('/groups/foo-bar/-/group_members/238'); + }); + }); + + describe('removing the expiration date', () => { + it(`commits ${types.RECEIVE_MEMBER_EXPIRATION_SUCCESS} mutation`, async () => { + mock.onPut().replyOnce(httpStatusCodes.OK); + + await testAction(updateMemberExpiration, { memberId, expiresAt: null }, state, [ + { + type: types.RECEIVE_MEMBER_EXPIRATION_SUCCESS, + payload: { memberId, expiresAt: null }, + }, + ]); + }); + }); + }); + + describe('unsuccessful request', () => { + it(`commits ${types.RECEIVE_MEMBER_EXPIRATION_ERROR} mutation and throws error`, async () => { + mock.onPut().networkError(); + + await expect( + testAction(updateMemberExpiration, { memberId, expiresAt }, state, [ + { + type: types.RECEIVE_MEMBER_EXPIRATION_ERROR, + }, + ]), + ).rejects.toThrowError(new Error('Network Error')); + }); + }); + }); + }); + + describe('Group Link Modal', () => { + const state = { + removeGroupLinkModalVisible: false, + groupLinkToRemove: null, + }; + + describe('showRemoveGroupLinkModal', () => { + it(`commits ${types.SHOW_REMOVE_GROUP_LINK_MODAL} mutation`, () => { + testAction(showRemoveGroupLinkModal, group, state, [ + { + type: types.SHOW_REMOVE_GROUP_LINK_MODAL, + payload: group, + }, + ]); + }); + }); + + describe('hideRemoveGroupLinkModal', () => { + it(`commits ${types.HIDE_REMOVE_GROUP_LINK_MODAL} mutation`, () => { + testAction(hideRemoveGroupLinkModal, group, state, [ + { + type: types.HIDE_REMOVE_GROUP_LINK_MODAL, + }, + ]); + }); + }); + }); +}); diff --git a/spec/frontend/members/store/mutations_spec.js b/spec/frontend/members/store/mutations_spec.js new file mode 100644 index 00000000000..488bfdf15fd --- /dev/null +++ b/spec/frontend/members/store/mutations_spec.js @@ -0,0 +1,117 @@ +import { members, group } from 'jest/members/mock_data'; +import mutations from '~/members/store/mutations'; +import * as types from '~/members/store/mutation_types'; + +describe('Vuex members mutations', () => { + describe('update member mutations', () => { + let state; + + beforeEach(() => { + state = { + members, + showError: false, + errorMessage: '', + }; + }); + + describe(types.RECEIVE_MEMBER_ROLE_SUCCESS, () => { + it('updates member', () => { + const accessLevel = { integerValue: 30, stringValue: 'Developer' }; + + mutations[types.RECEIVE_MEMBER_ROLE_SUCCESS](state, { + memberId: members[0].id, + accessLevel, + }); + + expect(state.members[0].accessLevel).toEqual(accessLevel); + }); + }); + + describe(types.RECEIVE_MEMBER_ROLE_ERROR, () => { + it('shows error message', () => { + mutations[types.RECEIVE_MEMBER_ROLE_ERROR](state); + + expect(state.showError).toBe(true); + expect(state.errorMessage).toBe( + "An error occurred while updating the member's role, please try again.", + ); + }); + }); + + describe(types.RECEIVE_MEMBER_EXPIRATION_SUCCESS, () => { + it('updates member', () => { + const expiresAt = '2020-03-17T00:00:00Z'; + + mutations[types.RECEIVE_MEMBER_EXPIRATION_SUCCESS](state, { + memberId: members[0].id, + expiresAt, + }); + + expect(state.members[0].expiresAt).toEqual(expiresAt); + }); + }); + + describe(types.RECEIVE_MEMBER_EXPIRATION_ERROR, () => { + it('shows error message', () => { + mutations[types.RECEIVE_MEMBER_EXPIRATION_ERROR](state); + + expect(state.showError).toBe(true); + expect(state.errorMessage).toBe( + "An error occurred while updating the member's expiration date, please try again.", + ); + }); + }); + }); + + describe(types.HIDE_ERROR, () => { + it('sets `showError` to `false`', () => { + const state = { + showError: true, + errorMessage: 'foo bar', + }; + + mutations[types.HIDE_ERROR](state); + + expect(state.showError).toBe(false); + }); + + it('sets `errorMessage` to an empty string', () => { + const state = { + showError: true, + errorMessage: 'foo bar', + }; + + mutations[types.HIDE_ERROR](state); + + expect(state.errorMessage).toBe(''); + }); + }); + + describe(types.SHOW_REMOVE_GROUP_LINK_MODAL, () => { + it('sets `removeGroupLinkModalVisible` and `groupLinkToRemove`', () => { + const state = { + removeGroupLinkModalVisible: false, + groupLinkToRemove: null, + }; + + mutations[types.SHOW_REMOVE_GROUP_LINK_MODAL](state, group); + + expect(state).toEqual({ + removeGroupLinkModalVisible: true, + groupLinkToRemove: group, + }); + }); + }); + + describe(types.HIDE_REMOVE_GROUP_LINK_MODAL, () => { + it('sets `removeGroupLinkModalVisible` to `false`', () => { + const state = { + removeGroupLinkModalVisible: false, + }; + + mutations[types.HIDE_REMOVE_GROUP_LINK_MODAL](state); + + expect(state.removeGroupLinkModalVisible).toBe(false); + }); + }); +}); diff --git a/spec/frontend/members/store/utils_spec.js b/spec/frontend/members/store/utils_spec.js new file mode 100644 index 00000000000..e3cde38269c --- /dev/null +++ b/spec/frontend/members/store/utils_spec.js @@ -0,0 +1,14 @@ +import { members } from 'jest/members/mock_data'; +import { findMember } from '~/members/store/utils'; + +describe('Members Vuex utils', () => { + describe('findMember', () => { + it('finds member by ID', () => { + const state = { + members, + }; + + expect(findMember(state, members[0].id)).toEqual(members[0]); + }); + }); +}); |