summaryrefslogtreecommitdiff
path: root/spec/frontend/confirm_modal_spec.js
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-02-25 12:08:48 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-02-25 12:08:48 +0000
commitf7dae0cdcb70ecb71c1d65f099e9d96b27a4548c (patch)
treee53baffa847c4fd37c8e335e4d93d603c75f9f02 /spec/frontend/confirm_modal_spec.js
parentb98fa9ef3d5bead417ae2f325cb64637883264e9 (diff)
downloadgitlab-ce-f7dae0cdcb70ecb71c1d65f099e9d96b27a4548c.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/frontend/confirm_modal_spec.js')
-rw-r--r--spec/frontend/confirm_modal_spec.js127
1 files changed, 127 insertions, 0 deletions
diff --git a/spec/frontend/confirm_modal_spec.js b/spec/frontend/confirm_modal_spec.js
new file mode 100644
index 00000000000..f133cef675f
--- /dev/null
+++ b/spec/frontend/confirm_modal_spec.js
@@ -0,0 +1,127 @@
+import Vue from 'vue';
+import initConfirmModal from '~/confirm_modal';
+import { TEST_HOST } from 'helpers/test_constants';
+
+describe('ConfirmModal', () => {
+ const buttons = [
+ {
+ path: `${TEST_HOST}/1`,
+ method: 'delete',
+ modalAttributes: {
+ modalId: 'geo-entry-removal-modal',
+ title: 'Remove tracking database entry',
+ message: 'Tracking database entry will be removed. Are you sure?',
+ okVariant: 'danger',
+ okTitle: 'Remove entry',
+ },
+ },
+ {
+ path: `${TEST_HOST}/1`,
+ method: 'post',
+ modalAttributes: {
+ modalId: 'geo-entry-removal-modal',
+ title: 'Update tracking database entry',
+ message: 'Tracking database entry will be updated. Are you sure?',
+ okVariant: 'success',
+ okTitle: 'Update entry',
+ },
+ },
+ ];
+
+ beforeEach(() => {
+ const buttonContainer = document.createElement('div');
+
+ buttons.forEach(x => {
+ const button = document.createElement('button');
+ button.setAttribute('class', 'js-confirm-modal-button');
+ button.setAttribute('data-path', x.path);
+ button.setAttribute('data-method', x.method);
+ button.setAttribute('data-modal-attributes', JSON.stringify(x.modalAttributes));
+ button.innerHTML = 'Action';
+ buttonContainer.appendChild(button);
+ });
+
+ document.body.appendChild(buttonContainer);
+ });
+
+ afterEach(() => {
+ document.body.innerHTML = '';
+ });
+
+ const findJsHooks = () => document.querySelectorAll('.js-confirm-modal-button');
+ const findModal = () => document.querySelector('.gl-modal');
+ const findModalOkButton = (modal, variant) =>
+ modal.querySelector(`.modal-footer .btn-${variant}`);
+ const findModalCancelButton = modal => modal.querySelector('.modal-footer .btn-secondary');
+
+ const serializeModal = (modal, buttonIndex) => {
+ const { modalAttributes } = buttons[buttonIndex];
+
+ return {
+ path: modal.querySelector('form').action,
+ method: modal.querySelector('input[name="_method"]').value,
+ modalAttributes: {
+ modalId: modal.id,
+ title: modal.querySelector('.modal-title').innerHTML,
+ message: modal.querySelector('.modal-body div').innerHTML,
+ okVariant: [...findModalOkButton(modal, modalAttributes.okVariant).classList]
+ .find(x => x.match('btn-'))
+ .replace('btn-', ''),
+ okTitle: findModalOkButton(modal, modalAttributes.okVariant).innerHTML,
+ },
+ };
+ };
+
+ it('starts with only JsHooks', () => {
+ expect(findJsHooks()).toHaveLength(buttons.length);
+ expect(findModal()).not.toExist();
+ });
+
+ describe('when button clicked', () => {
+ beforeEach(() => {
+ initConfirmModal();
+ findJsHooks()
+ .item(0)
+ .click();
+ });
+
+ it('does not replace JsHook with GlModal', () => {
+ expect(findJsHooks()).toHaveLength(buttons.length);
+ });
+
+ describe('GlModal', () => {
+ it('is rendered', () => {
+ expect(findModal()).toExist();
+ });
+
+ describe('Cancel Button', () => {
+ beforeEach(() => {
+ findModalCancelButton(findModal()).click();
+
+ return Vue.nextTick();
+ });
+
+ it('closes the modal', () => {
+ expect(findModal()).not.toExist();
+ });
+ });
+ });
+ });
+
+ describe.each`
+ index
+ ${0}
+ ${1}
+ `(`when multiple buttons exist`, ({ index }) => {
+ beforeEach(() => {
+ initConfirmModal();
+ findJsHooks()
+ .item(index)
+ .click();
+ });
+
+ it('correct props are passed to gl-modal', () => {
+ expect(serializeModal(findModal(), index)).toEqual(buttons[index]);
+ });
+ });
+});