Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/invite_members/components/invite_groups_modal_spec.js')
-rw-r--r--spec/frontend/invite_members/components/invite_groups_modal_spec.js143
1 files changed, 143 insertions, 0 deletions
diff --git a/spec/frontend/invite_members/components/invite_groups_modal_spec.js b/spec/frontend/invite_members/components/invite_groups_modal_spec.js
new file mode 100644
index 00000000000..49c55d56080
--- /dev/null
+++ b/spec/frontend/invite_members/components/invite_groups_modal_spec.js
@@ -0,0 +1,143 @@
+import { GlModal, GlSprintf } from '@gitlab/ui';
+import { nextTick } from 'vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import Api from '~/api';
+import InviteGroupsModal from '~/invite_members/components/invite_groups_modal.vue';
+import InviteModalBase from '~/invite_members/components/invite_modal_base.vue';
+import GroupSelect from '~/invite_members/components/group_select.vue';
+import { stubComponent } from 'helpers/stub_component';
+import { propsData, sharedGroup } from '../mock_data/group_modal';
+
+describe('InviteGroupsModal', () => {
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMountExtended(InviteGroupsModal, {
+ propsData: {
+ ...propsData,
+ ...props,
+ },
+ stubs: {
+ InviteModalBase,
+ GlSprintf,
+ GlModal: stubComponent(GlModal, {
+ template: '<div><slot></slot><slot name="modal-footer"></slot></div>',
+ }),
+ },
+ });
+ };
+
+ const createInviteGroupToProjectWrapper = () => {
+ createComponent({ isProject: true });
+ };
+
+ const createInviteGroupToGroupWrapper = () => {
+ createComponent({ isProject: false });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findGroupSelect = () => wrapper.findComponent(GroupSelect);
+ const findIntroText = () => wrapper.findByTestId('modal-base-intro-text').text();
+ const findCancelButton = () => wrapper.findByTestId('cancel-button');
+ const findInviteButton = () => wrapper.findByTestId('invite-button');
+ const findMembersFormGroup = () => wrapper.findByTestId('members-form-group');
+ const membersFormGroupInvalidFeedback = () =>
+ findMembersFormGroup().attributes('invalid-feedback');
+ const clickInviteButton = () => findInviteButton().vm.$emit('click');
+ const clickCancelButton = () => findCancelButton().vm.$emit('click');
+ const triggerGroupSelect = (val) => findGroupSelect().vm.$emit('input', val);
+
+ describe('displaying the correct introText and form group description', () => {
+ describe('when inviting to a project', () => {
+ it('includes the correct type, and formatted intro text', () => {
+ createInviteGroupToProjectWrapper();
+
+ expect(findIntroText()).toBe("You're inviting a group to the test name project.");
+ });
+ });
+
+ describe('when inviting to a group', () => {
+ it('includes the correct type, and formatted intro text', () => {
+ createInviteGroupToGroupWrapper();
+
+ expect(findIntroText()).toBe("You're inviting a group to the test name group.");
+ });
+ });
+ });
+
+ describe('submitting the invite form', () => {
+ describe('when sharing the group is successful', () => {
+ const groupPostData = {
+ group_id: sharedGroup.id,
+ group_access: propsData.defaultAccessLevel,
+ expires_at: undefined,
+ format: 'json',
+ };
+
+ beforeEach(() => {
+ createComponent();
+ triggerGroupSelect(sharedGroup);
+
+ wrapper.vm.$toast = { show: jest.fn() };
+ jest.spyOn(Api, 'groupShareWithGroup').mockResolvedValue({ data: groupPostData });
+
+ clickInviteButton();
+ });
+
+ it('calls Api groupShareWithGroup with the correct params', () => {
+ expect(Api.groupShareWithGroup).toHaveBeenCalledWith(propsData.id, groupPostData);
+ });
+
+ it('displays the successful toastMessage', () => {
+ expect(wrapper.vm.$toast.show).toHaveBeenCalledWith('Members were successfully added', {
+ onComplete: expect.any(Function),
+ });
+ });
+ });
+
+ describe('when sharing the group fails', () => {
+ beforeEach(() => {
+ createInviteGroupToGroupWrapper();
+ triggerGroupSelect(sharedGroup);
+
+ wrapper.vm.$toast = { show: jest.fn() };
+
+ jest
+ .spyOn(Api, 'groupShareWithGroup')
+ .mockRejectedValue({ response: { data: { success: false } } });
+
+ clickInviteButton();
+ });
+
+ it('does not show the toast message on failure', () => {
+ expect(wrapper.vm.$toast.show).not.toHaveBeenCalled();
+ });
+
+ it('displays the generic error for http server error', () => {
+ expect(membersFormGroupInvalidFeedback()).toBe('Something went wrong');
+ });
+
+ describe('clearing the invalid state and message', () => {
+ it('clears the error when the cancel button is clicked', async () => {
+ clickCancelButton();
+
+ await nextTick();
+
+ expect(membersFormGroupInvalidFeedback()).toBe('');
+ });
+
+ it('clears the error when the modal is hidden', async () => {
+ wrapper.findComponent(GlModal).vm.$emit('hide');
+
+ await nextTick();
+
+ expect(membersFormGroupInvalidFeedback()).toBe('');
+ });
+ });
+ });
+ });
+});