debian-mirror-gitlab/spec/frontend/vue_shared/components/clipboard_button_spec.js

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

193 lines
4.6 KiB
JavaScript
Raw Normal View History

2021-01-03 14:25:43 +05:30
import { GlButton } from '@gitlab/ui';
2021-03-11 19:13:27 +05:30
import { mount } from '@vue/test-utils';
2022-03-02 08:16:31 +05:30
import { nextTick } from 'vue';
import initCopyToClipboard, {
CLIPBOARD_SUCCESS_EVENT,
CLIPBOARD_ERROR_EVENT,
I18N_ERROR_MESSAGE,
} from '~/behaviors/copy_to_clipboard';
2021-03-11 19:13:27 +05:30
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
2020-01-01 13:55:28 +05:30
2022-03-02 08:16:31 +05:30
jest.mock('lodash/uniqueId', () => (prefix) => (prefix ? `${prefix}1` : 1));
2020-01-01 13:55:28 +05:30
describe('clipboard button', () => {
let wrapper;
2021-02-22 17:27:13 +05:30
const createWrapper = (propsData, options = {}) => {
wrapper = mount(ClipboardButton, {
2020-01-01 13:55:28 +05:30
propsData,
2021-02-22 17:27:13 +05:30
...options,
2020-01-01 13:55:28 +05:30
});
};
2022-08-27 11:52:29 +05:30
const findButton = () => wrapper.findComponent(GlButton);
2021-02-22 17:27:13 +05:30
2022-03-02 08:16:31 +05:30
const expectConfirmationTooltip = async ({ event, message }) => {
const title = 'Copy this value';
createWrapper({
text: 'copy me',
title,
});
wrapper.vm.$root.$emit = jest.fn();
const button = findButton();
expect(button.attributes()).toMatchObject({
title,
'aria-label': title,
});
await button.trigger(event);
expect(wrapper.vm.$root.$emit).toHaveBeenCalledWith('bv::show::tooltip', 'clipboard-button-1');
expect(button.attributes()).toMatchObject({
title: message,
'aria-label': message,
});
jest.runAllTimers();
await nextTick();
expect(button.attributes()).toMatchObject({
title,
'aria-label': title,
});
expect(wrapper.vm.$root.$emit).toHaveBeenCalledWith('bv::hide::tooltip', 'clipboard-button-1');
};
2020-01-01 13:55:28 +05:30
afterEach(() => {
wrapper.destroy();
wrapper = null;
});
describe('without gfm', () => {
beforeEach(() => {
createWrapper({
text: 'copy me',
title: 'Copy this value',
cssClass: 'btn-danger',
});
});
it('renders a button for clipboard', () => {
2021-02-22 17:27:13 +05:30
expect(findButton().exists()).toBe(true);
2020-01-01 13:55:28 +05:30
expect(wrapper.attributes('data-clipboard-text')).toBe('copy me');
});
it('should have a tooltip with default values', () => {
2020-03-13 15:44:24 +05:30
expect(wrapper.attributes('title')).toBe('Copy this value');
2020-01-01 13:55:28 +05:30
});
it('should render provided classname', () => {
expect(wrapper.classes()).toContain('btn-danger');
});
});
describe('with gfm', () => {
it('sets data-clipboard-text with gfm', () => {
createWrapper({
text: 'copy me',
gfm: '`path/to/file`',
title: 'Copy this value',
cssClass: 'btn-danger',
});
expect(wrapper.attributes('data-clipboard-text')).toBe(
'{"text":"copy me","gfm":"`path/to/file`"}',
);
});
});
2021-02-22 17:27:13 +05:30
it('renders default slot as button text', () => {
createWrapper(
{
text: 'copy me',
title: 'Copy this value',
},
{
slots: {
default: 'Foo bar',
},
},
);
expect(findButton().text()).toBe('Foo bar');
});
it('re-emits button events', () => {
const onClick = jest.fn();
createWrapper(
{
text: 'copy me',
title: 'Copy this value',
},
{ listeners: { click: onClick } },
);
findButton().trigger('click');
expect(onClick).toHaveBeenCalled();
});
2021-03-08 18:12:59 +05:30
2022-01-26 12:08:38 +05:30
it('passes the category and variant props to the GlButton', () => {
const category = 'tertiary';
const variant = 'confirm';
createWrapper({ title: '', text: '', category, variant });
expect(findButton().props('category')).toBe(category);
expect(findButton().props('variant')).toBe(variant);
});
2022-03-02 08:16:31 +05:30
describe('confirmation tooltip', () => {
it('adds `id` and `data-clipboard-handle-tooltip` attributes to button', () => {
createWrapper({
text: 'copy me',
title: 'Copy this value',
});
expect(findButton().attributes()).toMatchObject({
id: 'clipboard-button-1',
'data-clipboard-handle-tooltip': 'false',
'aria-live': 'polite',
});
});
it('shows success tooltip after successful copy', () => {
expectConfirmationTooltip({
event: CLIPBOARD_SUCCESS_EVENT,
message: ClipboardButton.i18n.copied,
});
});
it('shows error tooltip after failed copy', () => {
expectConfirmationTooltip({ event: CLIPBOARD_ERROR_EVENT, message: I18N_ERROR_MESSAGE });
});
});
2021-03-08 18:12:59 +05:30
describe('integration', () => {
it('actually copies to clipboard', () => {
initCopyToClipboard();
document.execCommand = () => {};
jest.spyOn(document, 'execCommand').mockImplementation(() => true);
createWrapper(
{
text: 'copy me',
title: 'Copy this value',
},
{ attachTo: document.body },
);
findButton().trigger('click');
expect(document.execCommand).toHaveBeenCalledWith('copy');
});
});
2020-01-01 13:55:28 +05:30
});