import MockAdapter from 'axios-mock-adapter'; import $ from 'jquery'; import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures'; import { TEST_HOST } from 'spec/test_constants'; import waitForPromises from 'helpers/wait_for_promises'; import { createAlert } from '~/flash'; import axios from '~/lib/utils/axios_utils'; import { HTTP_STATUS_CONFLICT, HTTP_STATUS_OK } from '~/lib/utils/http_status'; import MergeRequest from '~/merge_request'; jest.mock('~/flash'); describe('MergeRequest', () => { const test = {}; describe('task lists', () => { let mock; beforeEach(() => { loadHTMLFixture('merge_requests/merge_request_with_task_list.html'); jest.spyOn(axios, 'patch'); mock = new MockAdapter(axios); mock .onPatch(`${TEST_HOST}/frontend-fixtures/merge-requests-project/-/merge_requests/1.json`) .reply(HTTP_STATUS_OK, {}); test.merge = new MergeRequest(); return test.merge; }); afterEach(() => { mock.restore(); resetHTMLFixture(); }); it('modifies the Markdown field', async () => { jest.spyOn($, 'ajax').mockImplementation(); const changeEvent = document.createEvent('HTMLEvents'); changeEvent.initEvent('change', true, true); $('input[type=checkbox]').first().attr('checked', true)[0].dispatchEvent(changeEvent); await waitForPromises(); expect($('.js-task-list-field').val()).toBe( '- [x] Task List Item\n- [ ]\n- [ ] Task List Item 2\n', ); }); it('ensure that task with only spaces does not get checked incorrectly', async () => { // fixed in 'deckar01-task_list', '2.2.1' gem jest.spyOn($, 'ajax').mockImplementation(); const changeEvent = document.createEvent('HTMLEvents'); changeEvent.initEvent('change', true, true); $('input[type=checkbox]').last().attr('checked', true)[0].dispatchEvent(changeEvent); await waitForPromises(); expect($('.js-task-list-field').val()).toBe( '- [ ] Task List Item\n- [ ]\n- [x] Task List Item 2\n', ); }); describe('tasklist', () => { const lineNumber = 8; const lineSource = '- [ ] item 8'; const index = 3; const checked = true; it('submits an ajax request on tasklist:changed', async () => { $('.js-task-list-field').trigger({ type: 'tasklist:changed', detail: { lineNumber, lineSource, index, checked }, }); await waitForPromises(); expect(axios.patch).toHaveBeenCalledWith( `${TEST_HOST}/frontend-fixtures/merge-requests-project/-/merge_requests/1.json`, { merge_request: { description: '- [ ] Task List Item\n- [ ]\n- [ ] Task List Item 2\n', lock_version: 0, update_task: { line_number: lineNumber, line_source: lineSource, index, checked }, }, }, ); }); it('shows an error notification when tasklist update failed', async () => { mock .onPatch(`${TEST_HOST}/frontend-fixtures/merge-requests-project/-/merge_requests/1.json`) .reply(HTTP_STATUS_CONFLICT, {}); $('.js-task-list-field').trigger({ type: 'tasklist:changed', detail: { lineNumber, lineSource, index, checked }, }); await waitForPromises(); expect(createAlert).toHaveBeenCalledWith( expect.objectContaining({ message: 'Someone edited this merge request at the same time you did. Please refresh the page to see changes.', }), ); }); }); }); describe('hideCloseButton', () => { describe('merge request of current_user', () => { beforeEach(() => { loadHTMLFixture('merge_requests/merge_request_of_current_user.html'); test.el = document.querySelector('.js-issuable-actions'); MergeRequest.hideCloseButton(); }); it('hides the close button', () => { const smallCloseItem = test.el.querySelector('.js-close-item'); expect(smallCloseItem).toHaveClass('hidden'); }); }); }); });