debian-mirror-gitlab/spec/frontend/protected_branches/protected_branch_edit_spec.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

160 lines
4.8 KiB
JavaScript
Raw Normal View History

2021-04-17 20:07:23 +05:30
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
2022-07-16 23:28:13 +05:30
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
2021-04-17 20:07:23 +05:30
import { TEST_HOST } from 'helpers/test_constants';
2023-05-27 22:25:52 +05:30
import { createAlert } from '~/alert';
2021-04-17 20:07:23 +05:30
import axios from '~/lib/utils/axios_utils';
2023-04-23 21:23:45 +05:30
import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
2021-04-17 20:07:23 +05:30
import ProtectedBranchEdit from '~/protected_branches/protected_branch_edit';
2023-05-27 22:25:52 +05:30
jest.mock('~/alert');
2021-04-17 20:07:23 +05:30
const TEST_URL = `${TEST_HOST}/url`;
2022-05-07 20:08:51 +05:30
const FORCE_PUSH_TOGGLE_TESTID = 'force-push-toggle';
const CODE_OWNER_TOGGLE_TESTID = 'code-owner-toggle';
2021-04-17 20:07:23 +05:30
const IS_CHECKED_CLASS = 'is-checked';
2022-05-07 20:08:51 +05:30
const IS_DISABLED_CLASS = 'is-disabled';
const IS_LOADING_SELECTOR = '.toggle-loading';
2021-04-17 20:07:23 +05:30
describe('ProtectedBranchEdit', () => {
let mock;
beforeEach(() => {
jest.spyOn(ProtectedBranchEdit.prototype, 'buildDropdowns').mockImplementation();
mock = new MockAdapter(axios);
});
2022-05-07 20:08:51 +05:30
const findForcePushToggle = () =>
document.querySelector(`div[data-testid="${FORCE_PUSH_TOGGLE_TESTID}"] button`);
const findCodeOwnerToggle = () =>
document.querySelector(`div[data-testid="${CODE_OWNER_TOGGLE_TESTID}"] button`);
2021-04-17 20:07:23 +05:30
2022-05-07 20:08:51 +05:30
const create = ({
forcePushToggleChecked = false,
codeOwnerToggleChecked = false,
hasLicense = true,
} = {}) => {
2022-07-16 23:28:13 +05:30
setHTMLFixture(`<div id="wrap" data-url="${TEST_URL}">
2022-05-07 20:08:51 +05:30
<span
class="js-force-push-toggle"
data-label="Toggle allowed to force push"
data-is-checked="${forcePushToggleChecked}"
data-testid="${FORCE_PUSH_TOGGLE_TESTID}"></span>
<span
class="js-code-owner-toggle"
data-label="Toggle code owner approval"
data-is-checked="${codeOwnerToggleChecked}"
data-testid="${CODE_OWNER_TOGGLE_TESTID}"></span>
</div>`);
2021-04-17 20:07:23 +05:30
2022-05-07 20:08:51 +05:30
return new ProtectedBranchEdit({ $wrap: $('#wrap'), hasLicense });
2021-04-17 20:07:23 +05:30
};
afterEach(() => {
mock.restore();
2022-07-16 23:28:13 +05:30
resetHTMLFixture();
2021-04-17 20:07:23 +05:30
});
2022-05-07 20:08:51 +05:30
describe('when license supports code owner approvals', () => {
beforeEach(() => {
create();
});
it('instantiates the code owner toggle', () => {
expect(findCodeOwnerToggle()).not.toBe(null);
});
});
describe('when license does not support code owner approvals', () => {
beforeEach(() => {
create({ hasLicense: false });
});
it('does not instantiate the code owner toggle', () => {
expect(findCodeOwnerToggle()).toBe(null);
});
});
describe('when toggles are not available in the DOM on page load', () => {
beforeEach(() => {
create({ hasLicense: true });
2022-07-16 23:28:13 +05:30
setHTMLFixture('');
});
afterEach(() => {
resetHTMLFixture();
2022-05-07 20:08:51 +05:30
});
it('does not instantiate the force push toggle', () => {
expect(findForcePushToggle()).toBe(null);
});
it('does not instantiate the code owner toggle', () => {
expect(findCodeOwnerToggle()).toBe(null);
});
});
describe.each`
description | checkedOption | patchParam | finder
${'force push'} | ${'forcePushToggleChecked'} | ${'allow_force_push'} | ${findForcePushToggle}
${'code owner'} | ${'codeOwnerToggleChecked'} | ${'code_owner_approval_required'} | ${findCodeOwnerToggle}
`('when unchecked $description toggle button', ({ checkedOption, patchParam, finder }) => {
2021-04-17 20:07:23 +05:30
let toggle;
beforeEach(() => {
2022-05-07 20:08:51 +05:30
create({ [checkedOption]: false });
2021-04-17 20:07:23 +05:30
2022-05-07 20:08:51 +05:30
toggle = finder();
2021-04-17 20:07:23 +05:30
});
it('is not changed', () => {
expect(toggle).not.toHaveClass(IS_CHECKED_CLASS);
2022-05-07 20:08:51 +05:30
expect(toggle.querySelector(IS_LOADING_SELECTOR)).toBe(null);
expect(toggle).not.toHaveClass(IS_DISABLED_CLASS);
2021-04-17 20:07:23 +05:30
});
describe('when clicked', () => {
2023-06-20 00:43:36 +05:30
beforeEach(() => {
2023-04-23 21:23:45 +05:30
mock
.onPatch(TEST_URL, { protected_branch: { [patchParam]: true } })
.replyOnce(HTTP_STATUS_OK, {});
2021-04-17 20:07:23 +05:30
});
2022-08-13 15:12:31 +05:30
it('checks and disables button', async () => {
await toggle.click();
2021-04-17 20:07:23 +05:30
expect(toggle).toHaveClass(IS_CHECKED_CLASS);
2022-05-07 20:08:51 +05:30
expect(toggle.querySelector(IS_LOADING_SELECTOR)).not.toBe(null);
expect(toggle).toHaveClass(IS_DISABLED_CLASS);
2021-04-17 20:07:23 +05:30
});
2022-08-13 15:12:31 +05:30
it('sends update to BE', async () => {
await toggle.click();
await axios.waitForAll();
2021-04-17 20:07:23 +05:30
2022-08-13 15:12:31 +05:30
// Args are asserted in the `.onPatch` call
expect(mock.history.patch).toHaveLength(1);
expect(toggle).not.toHaveClass(IS_DISABLED_CLASS);
expect(toggle.querySelector(IS_LOADING_SELECTOR)).toBe(null);
2022-11-25 23:54:43 +05:30
expect(createAlert).not.toHaveBeenCalled();
2022-08-13 15:12:31 +05:30
});
2021-04-17 20:07:23 +05:30
});
describe('when clicked and BE error', () => {
beforeEach(() => {
2023-04-23 21:23:45 +05:30
mock.onPatch(TEST_URL).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
2021-04-17 20:07:23 +05:30
toggle.click();
});
2023-05-27 22:25:52 +05:30
it('alerts error', async () => {
2022-08-13 15:12:31 +05:30
await axios.waitForAll();
2022-11-25 23:54:43 +05:30
expect(createAlert).toHaveBeenCalled();
2022-08-13 15:12:31 +05:30
});
2021-04-17 20:07:23 +05:30
});
});
});