summaryrefslogtreecommitdiff
path: root/spec/frontend/boards/board_new_issue_deprecated_spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/boards/board_new_issue_deprecated_spec.js')
-rw-r--r--spec/frontend/boards/board_new_issue_deprecated_spec.js203
1 files changed, 203 insertions, 0 deletions
diff --git a/spec/frontend/boards/board_new_issue_deprecated_spec.js b/spec/frontend/boards/board_new_issue_deprecated_spec.js
new file mode 100644
index 00000000000..8236b468189
--- /dev/null
+++ b/spec/frontend/boards/board_new_issue_deprecated_spec.js
@@ -0,0 +1,203 @@
+/* global List */
+
+import Vue from 'vue';
+import { mount } from '@vue/test-utils';
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
+import boardNewIssue from '~/boards/components/board_new_issue_deprecated.vue';
+import boardsStore from '~/boards/stores/boards_store';
+
+import '~/boards/models/list';
+import { listObj, boardsMockInterceptor } from './mock_data';
+
+describe('Issue boards new issue form', () => {
+ let wrapper;
+ let vm;
+ let list;
+ let mock;
+ let newIssueMock;
+ const promiseReturn = {
+ data: {
+ iid: 100,
+ },
+ };
+
+ const submitIssue = () => {
+ const dummySubmitEvent = {
+ preventDefault() {},
+ };
+ wrapper.vm.$refs.submitButton = wrapper.find({ ref: 'submitButton' });
+ return wrapper.vm.submit(dummySubmitEvent);
+ };
+
+ beforeEach(() => {
+ const BoardNewIssueComp = Vue.extend(boardNewIssue);
+
+ mock = new MockAdapter(axios);
+ mock.onAny().reply(boardsMockInterceptor);
+
+ boardsStore.create();
+
+ list = new List(listObj);
+
+ newIssueMock = Promise.resolve(promiseReturn);
+ jest.spyOn(list, 'newIssue').mockImplementation(() => newIssueMock);
+
+ wrapper = mount(BoardNewIssueComp, {
+ propsData: {
+ disabled: false,
+ list,
+ },
+ provide: {
+ groupId: null,
+ },
+ });
+
+ vm = wrapper.vm;
+
+ return Vue.nextTick();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ mock.restore();
+ });
+
+ it('calls submit if submit button is clicked', () => {
+ jest.spyOn(wrapper.vm, 'submit').mockImplementation();
+ vm.title = 'Testing Title';
+
+ return Vue.nextTick()
+ .then(submitIssue)
+ .then(() => {
+ expect(wrapper.vm.submit).toHaveBeenCalled();
+ });
+ });
+
+ it('disables submit button if title is empty', () => {
+ expect(wrapper.find({ ref: 'submitButton' }).props().disabled).toBe(true);
+ });
+
+ it('enables submit button if title is not empty', () => {
+ wrapper.setData({ title: 'Testing Title' });
+
+ return Vue.nextTick().then(() => {
+ expect(wrapper.find({ ref: 'input' }).element.value).toBe('Testing Title');
+ expect(wrapper.find({ ref: 'submitButton' }).props().disabled).toBe(false);
+ });
+ });
+
+ it('clears title after clicking cancel', () => {
+ wrapper.find({ ref: 'cancelButton' }).trigger('click');
+
+ return Vue.nextTick().then(() => {
+ expect(vm.title).toBe('');
+ });
+ });
+
+ it('does not create new issue if title is empty', () => {
+ return submitIssue().then(() => {
+ expect(list.newIssue).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('submit success', () => {
+ it('creates new issue', () => {
+ wrapper.setData({ title: 'submit issue' });
+
+ return Vue.nextTick()
+ .then(submitIssue)
+ .then(() => {
+ expect(list.newIssue).toHaveBeenCalled();
+ });
+ });
+
+ it('enables button after submit', () => {
+ jest.spyOn(wrapper.vm, 'submit').mockImplementation();
+ wrapper.setData({ title: 'submit issue' });
+
+ return Vue.nextTick()
+ .then(submitIssue)
+ .then(() => {
+ expect(wrapper.vm.$refs.submitButton.props().disabled).toBe(false);
+ });
+ });
+
+ it('clears title after submit', () => {
+ wrapper.setData({ title: 'submit issue' });
+
+ return Vue.nextTick()
+ .then(submitIssue)
+ .then(() => {
+ expect(vm.title).toBe('');
+ });
+ });
+
+ it('sets detail issue after submit', () => {
+ expect(boardsStore.detail.issue.title).toBe(undefined);
+ wrapper.setData({ title: 'submit issue' });
+
+ return Vue.nextTick()
+ .then(submitIssue)
+ .then(() => {
+ expect(boardsStore.detail.issue.title).toBe('submit issue');
+ });
+ });
+
+ it('sets detail list after submit', () => {
+ wrapper.setData({ title: 'submit issue' });
+
+ return Vue.nextTick()
+ .then(submitIssue)
+ .then(() => {
+ expect(boardsStore.detail.list.id).toBe(list.id);
+ });
+ });
+
+ it('sets detail weight after submit', () => {
+ boardsStore.weightFeatureAvailable = true;
+ wrapper.setData({ title: 'submit issue' });
+
+ return Vue.nextTick()
+ .then(submitIssue)
+ .then(() => {
+ expect(boardsStore.detail.list.weight).toBe(list.weight);
+ });
+ });
+
+ it('does not set detail weight after submit', () => {
+ boardsStore.weightFeatureAvailable = false;
+ wrapper.setData({ title: 'submit issue' });
+
+ return Vue.nextTick()
+ .then(submitIssue)
+ .then(() => {
+ expect(boardsStore.detail.list.weight).toBe(list.weight);
+ });
+ });
+ });
+
+ describe('submit error', () => {
+ beforeEach(() => {
+ newIssueMock = Promise.reject(new Error('My hovercraft is full of eels!'));
+ vm.title = 'error';
+ });
+
+ it('removes issue', () => {
+ const lengthBefore = list.issues.length;
+ return Vue.nextTick()
+ .then(submitIssue)
+ .then(() => {
+ expect(list.issues.length).toBe(lengthBefore);
+ });
+ });
+
+ it('shows error', () => {
+ return Vue.nextTick()
+ .then(submitIssue)
+ .then(() => {
+ expect(vm.error).toBe(true);
+ });
+ });
+ });
+});