2019-01-26 09:49:49 -05:00
|
|
|
import $ from 'jquery';
|
2022-05-13 08:08:49 -04:00
|
|
|
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
|
2019-01-26 09:49:49 -05:00
|
|
|
import axios from '~/lib/utils/axios_utils';
|
2021-02-14 13:09:20 -05:00
|
|
|
import TaskList from '~/task_list';
|
2019-01-26 09:49:49 -05:00
|
|
|
|
|
|
|
describe('TaskList', () => {
|
|
|
|
let taskList;
|
|
|
|
let currentTarget;
|
|
|
|
const taskListOptions = {
|
|
|
|
selector: '.task-list',
|
|
|
|
dataType: 'issue',
|
|
|
|
fieldName: 'description',
|
|
|
|
lockVersion: 2,
|
|
|
|
};
|
|
|
|
const createTaskList = () => new TaskList(taskListOptions);
|
|
|
|
|
|
|
|
beforeEach(() => {
|
2022-05-13 08:08:49 -04:00
|
|
|
setHTMLFixture(`
|
2019-01-26 09:49:49 -05:00
|
|
|
<div class="task-list">
|
2021-05-14 05:10:24 -04:00
|
|
|
<div class="js-task-list-container">
|
|
|
|
<ul data-sourcepos="5:1-5:11" class="task-list" dir="auto">
|
|
|
|
<li data-sourcepos="5:1-5:11" class="task-list-item enabled">
|
|
|
|
<input type="checkbox" class="task-list-item-checkbox" checked=""> markdown task
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
<ul class="task-list" dir="auto">
|
|
|
|
<li class="task-list-item enabled">
|
|
|
|
<input type="checkbox" class="task-list-item-checkbox"> hand-coded checkbox
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
<textarea class="hidden js-task-list-field"></textarea>
|
|
|
|
</div>
|
2019-01-26 09:49:49 -05:00
|
|
|
</div>
|
|
|
|
`);
|
|
|
|
|
|
|
|
currentTarget = $('<div></div>');
|
|
|
|
taskList = createTaskList();
|
|
|
|
});
|
|
|
|
|
2022-05-13 08:08:49 -04:00
|
|
|
afterEach(() => {
|
|
|
|
resetHTMLFixture();
|
|
|
|
});
|
|
|
|
|
2019-01-26 09:49:49 -05:00
|
|
|
it('should call init when the class constructed', () => {
|
2019-12-20 10:07:34 -05:00
|
|
|
jest.spyOn(TaskList.prototype, 'init');
|
|
|
|
jest.spyOn(TaskList.prototype, 'disable').mockImplementation(() => {});
|
|
|
|
jest.spyOn($.prototype, 'taskList').mockImplementation(() => {});
|
|
|
|
jest.spyOn($.prototype, 'on').mockImplementation(() => {});
|
2019-01-26 09:49:49 -05:00
|
|
|
|
|
|
|
taskList = createTaskList();
|
|
|
|
const $taskListEl = $(taskList.taskListContainerSelector);
|
|
|
|
|
|
|
|
expect(taskList.init).toHaveBeenCalled();
|
|
|
|
expect(taskList.disable).toHaveBeenCalled();
|
|
|
|
expect($taskListEl.taskList).toHaveBeenCalledWith('enable');
|
|
|
|
expect($(document).on).toHaveBeenCalledWith(
|
|
|
|
'tasklist:changed',
|
|
|
|
taskList.taskListContainerSelector,
|
|
|
|
taskList.updateHandler,
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('getTaskListTarget', () => {
|
|
|
|
it('should return currentTarget from event object if exists', () => {
|
|
|
|
const $target = taskList.getTaskListTarget({ currentTarget });
|
|
|
|
|
|
|
|
expect($target).toEqual(currentTarget);
|
|
|
|
});
|
|
|
|
|
2019-01-29 08:50:22 -05:00
|
|
|
it('should return element of the taskListContainerSelector', () => {
|
|
|
|
const $target = taskList.getTaskListTarget();
|
2019-01-26 09:49:49 -05:00
|
|
|
|
2019-01-29 08:50:22 -05:00
|
|
|
expect($target).toEqual($(taskList.taskListContainerSelector));
|
|
|
|
});
|
2019-01-26 09:49:49 -05:00
|
|
|
});
|
|
|
|
|
|
|
|
describe('disableTaskListItems', () => {
|
|
|
|
it('should call taskList method with disable param', () => {
|
2021-05-14 05:10:24 -04:00
|
|
|
taskList.disableTaskListItems();
|
2019-01-26 09:49:49 -05:00
|
|
|
|
2021-05-14 05:10:24 -04:00
|
|
|
expect(document.querySelectorAll('.task-list-item input:disabled').length).toEqual(2);
|
2019-01-26 09:49:49 -05:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('enableTaskListItems', () => {
|
2021-05-14 05:10:24 -04:00
|
|
|
it('should enable markdown tasks and disable non-markdown tasks', () => {
|
|
|
|
taskList.disableTaskListItems();
|
|
|
|
taskList.enableTaskListItems();
|
|
|
|
|
|
|
|
expect(document.querySelectorAll('.task-list-item input:enabled').length).toEqual(1);
|
|
|
|
expect(document.querySelectorAll('.task-list-item input:disabled').length).toEqual(1);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('enable', () => {
|
|
|
|
it('should enable task list items and on document event', () => {
|
|
|
|
jest.spyOn($.prototype, 'on').mockImplementation(() => {});
|
|
|
|
|
|
|
|
taskList.enable();
|
2019-01-26 09:49:49 -05:00
|
|
|
|
2021-05-14 05:10:24 -04:00
|
|
|
expect(document.querySelectorAll('.task-list-item input:enabled').length).toEqual(1);
|
|
|
|
expect(document.querySelectorAll('.task-list-item input:disabled').length).toEqual(1);
|
2019-01-26 09:49:49 -05:00
|
|
|
|
2021-05-14 05:10:24 -04:00
|
|
|
expect($(document).on).toHaveBeenCalledWith(
|
|
|
|
'tasklist:changed',
|
|
|
|
taskList.taskListContainerSelector,
|
|
|
|
taskList.updateHandler,
|
|
|
|
);
|
2019-01-26 09:49:49 -05:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('disable', () => {
|
|
|
|
it('should disable task list items and off document event', () => {
|
2019-12-20 10:07:34 -05:00
|
|
|
jest.spyOn($.prototype, 'off').mockImplementation(() => {});
|
2019-01-26 09:49:49 -05:00
|
|
|
|
|
|
|
taskList.disable();
|
|
|
|
|
2021-05-14 05:10:24 -04:00
|
|
|
expect(document.querySelectorAll('.task-list-item input:disabled').length).toEqual(2);
|
|
|
|
|
2019-01-26 09:49:49 -05:00
|
|
|
expect($(document).off).toHaveBeenCalledWith(
|
|
|
|
'tasklist:changed',
|
|
|
|
taskList.taskListContainerSelector,
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('update', () => {
|
2022-04-13 17:09:57 -04:00
|
|
|
it('should disable task list items and make a patch request then enable them again', () => {
|
2019-01-26 09:49:49 -05:00
|
|
|
const response = { data: { lock_version: 3 } };
|
2019-12-20 10:07:34 -05:00
|
|
|
jest.spyOn(taskList, 'enableTaskListItems').mockImplementation(() => {});
|
|
|
|
jest.spyOn(taskList, 'disableTaskListItems').mockImplementation(() => {});
|
2021-10-20 05:12:43 -04:00
|
|
|
jest.spyOn(taskList, 'onUpdate').mockImplementation(() => {});
|
2019-12-20 10:07:34 -05:00
|
|
|
jest.spyOn(taskList, 'onSuccess').mockImplementation(() => {});
|
|
|
|
jest.spyOn(axios, 'patch').mockReturnValue(Promise.resolve(response));
|
2019-01-26 09:49:49 -05:00
|
|
|
|
|
|
|
const value = 'hello world';
|
|
|
|
const endpoint = '/foo';
|
|
|
|
const target = $(`<input data-update-url="${endpoint}" value="${value}" />`);
|
|
|
|
const detail = {
|
|
|
|
index: 2,
|
|
|
|
checked: true,
|
|
|
|
lineNumber: 8,
|
|
|
|
lineSource: '- [ ] check item',
|
|
|
|
};
|
|
|
|
const event = { target, detail };
|
|
|
|
const patchData = {
|
|
|
|
[taskListOptions.dataType]: {
|
|
|
|
[taskListOptions.fieldName]: value,
|
|
|
|
lock_version: taskListOptions.lockVersion,
|
|
|
|
update_task: {
|
|
|
|
index: detail.index,
|
|
|
|
checked: detail.checked,
|
|
|
|
line_number: detail.lineNumber,
|
|
|
|
line_source: detail.lineSource,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2021-10-20 05:12:43 -04:00
|
|
|
const update = taskList.update(event);
|
|
|
|
|
|
|
|
expect(taskList.onUpdate).toHaveBeenCalled();
|
|
|
|
|
2022-04-13 17:09:57 -04:00
|
|
|
return update.then(() => {
|
|
|
|
expect(taskList.disableTaskListItems).toHaveBeenCalledWith(event);
|
|
|
|
expect(axios.patch).toHaveBeenCalledWith(endpoint, patchData);
|
|
|
|
expect(taskList.enableTaskListItems).toHaveBeenCalledWith(event);
|
|
|
|
expect(taskList.onSuccess).toHaveBeenCalledWith(response.data);
|
|
|
|
expect(taskList.lockVersion).toEqual(response.data.lock_version);
|
|
|
|
});
|
2019-01-26 09:49:49 -05:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2022-04-13 17:09:57 -04:00
|
|
|
it('should handle request error and enable task list items', () => {
|
2019-01-26 09:49:49 -05:00
|
|
|
const response = { data: { error: 1 } };
|
2019-12-20 10:07:34 -05:00
|
|
|
jest.spyOn(taskList, 'enableTaskListItems').mockImplementation(() => {});
|
2021-10-20 05:12:43 -04:00
|
|
|
jest.spyOn(taskList, 'onUpdate').mockImplementation(() => {});
|
2019-12-20 10:07:34 -05:00
|
|
|
jest.spyOn(taskList, 'onError').mockImplementation(() => {});
|
|
|
|
jest.spyOn(axios, 'patch').mockReturnValue(Promise.reject({ response })); // eslint-disable-line prefer-promise-reject-errors
|
2019-01-26 09:49:49 -05:00
|
|
|
|
|
|
|
const event = { detail: {} };
|
2021-10-20 05:12:43 -04:00
|
|
|
|
|
|
|
const update = taskList.update(event);
|
|
|
|
|
|
|
|
expect(taskList.onUpdate).toHaveBeenCalled();
|
|
|
|
|
2022-04-13 17:09:57 -04:00
|
|
|
return update.then(() => {
|
|
|
|
expect(taskList.enableTaskListItems).toHaveBeenCalledWith(event);
|
|
|
|
expect(taskList.onError).toHaveBeenCalledWith(response.data);
|
|
|
|
});
|
2019-01-26 09:49:49 -05:00
|
|
|
});
|
|
|
|
});
|