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/protected_tags/protected_tag_edit_spec.js')
-rw-r--r--spec/frontend/protected_tags/protected_tag_edit_spec.js113
1 files changed, 113 insertions, 0 deletions
diff --git a/spec/frontend/protected_tags/protected_tag_edit_spec.js b/spec/frontend/protected_tags/protected_tag_edit_spec.js
new file mode 100644
index 00000000000..f56b3a70d1b
--- /dev/null
+++ b/spec/frontend/protected_tags/protected_tag_edit_spec.js
@@ -0,0 +1,113 @@
+import MockAdapter from 'axios-mock-adapter';
+import { ACCESS_LEVELS, LEVEL_TYPES } from '~/protected_tags/constants';
+import ProtectedTagEdit, { i18n } from '~/protected_tags/protected_tag_edit.vue';
+import AccessDropdown from '~/projects/settings/components/access_dropdown.vue';
+import axios from '~/lib/utils/axios_utils';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status';
+import waitForPromises from 'helpers/wait_for_promises';
+import { createAlert } from '~/alert';
+import { mockAccessLevels } from './mock_data';
+
+jest.mock('~/alert');
+
+describe('Protected Tag Edit', () => {
+ let wrapper;
+ let mockAxios;
+
+ const url = 'http://some.url';
+ const toggleClass = 'js-allowed-to-create gl-max-w-34';
+
+ const findAccessDropdown = () => wrapper.findComponent(AccessDropdown);
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(ProtectedTagEdit, {
+ propsData: {
+ url,
+ accessLevelsData: mockAccessLevels,
+ searchEnabled: false,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ window.gon = {
+ api_version: 'v4',
+ deploy_access_levels: {
+ roles: [],
+ },
+ };
+ mockAxios = new MockAdapter(axios);
+ createComponent();
+ });
+
+ afterEach(() => {
+ mockAxios.restore();
+ });
+
+ it('renders access dropdown with correct props', () => {
+ expect(findAccessDropdown().props()).toMatchObject({
+ toggleClass,
+ accessLevel: ACCESS_LEVELS.CREATE,
+ accessLevelsData: mockAccessLevels,
+ searchEnabled: false,
+ });
+ });
+
+ describe('when dropdown is closed and has no changes', () => {
+ it('does not make a patch request to update permission', () => {
+ jest.spyOn(axios, 'patch');
+
+ findAccessDropdown().vm.$emit('hidden', []);
+
+ expect(axios.patch).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('when dropdown is closed and has changes', () => {
+ it('makes patch request to update permission', () => {
+ jest.spyOn(axios, 'patch');
+
+ const newPermissions = [{ id: 1, access_level: 30 }];
+ findAccessDropdown().vm.$emit('hidden', newPermissions);
+
+ expect(axios.patch).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('when permission is updated successfully', () => {
+ beforeEach(async () => {
+ const updatedPermissions = [
+ { user_id: 1, id: 1 },
+ { group_id: 1, id: 2 },
+ { access_level: 3, id: 3 },
+ ];
+ mockAxios.onPatch().replyOnce(HTTP_STATUS_OK, { [ACCESS_LEVELS.CREATE]: updatedPermissions });
+ findAccessDropdown().vm.$emit('hidden', [{ user_id: 1 }]);
+ await waitForPromises();
+ });
+
+ it('should update selected items', () => {
+ const newPreselected = [
+ { user_id: 1, id: 1, type: LEVEL_TYPES.USER },
+ { group_id: 1, id: 2, type: LEVEL_TYPES.GROUP },
+ { access_level: 3, id: 3, type: LEVEL_TYPES.ROLE },
+ ];
+ expect(findAccessDropdown().props('preselectedItems')).toEqual(newPreselected);
+ });
+ });
+
+ describe('when permission update fails', () => {
+ beforeEach(async () => {
+ mockAxios.onPatch().replyOnce(HTTP_STATUS_BAD_REQUEST, {});
+ findAccessDropdown().vm.$emit('hidden', [{ user_id: 1 }]);
+ await waitForPromises();
+ });
+
+ it('should show error message', () => {
+ expect(createAlert).toHaveBeenCalledWith({
+ message: i18n.failureMessage,
+ });
+ });
+ });
+});