Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/content_editor/components/bubble_menus/link_spec.js')
-rw-r--r--spec/frontend/content_editor/components/bubble_menus/link_spec.js227
1 files changed, 0 insertions, 227 deletions
diff --git a/spec/frontend/content_editor/components/bubble_menus/link_spec.js b/spec/frontend/content_editor/components/bubble_menus/link_spec.js
deleted file mode 100644
index 93204deb68c..00000000000
--- a/spec/frontend/content_editor/components/bubble_menus/link_spec.js
+++ /dev/null
@@ -1,227 +0,0 @@
-import { GlLink, GlForm } from '@gitlab/ui';
-import { BubbleMenu } from '@tiptap/vue-2';
-import { mountExtended } from 'helpers/vue_test_utils_helper';
-import LinkBubbleMenu from '~/content_editor/components/bubble_menus/link.vue';
-import eventHubFactory from '~/helpers/event_hub_factory';
-import Link from '~/content_editor/extensions/link';
-import { createTestEditor, emitEditorEvent } from '../../test_utils';
-
-const createFakeEvent = () => ({ preventDefault: jest.fn(), stopPropagation: jest.fn() });
-
-describe('content_editor/components/bubble_menus/link', () => {
- let wrapper;
- let tiptapEditor;
- let contentEditor;
- let bubbleMenu;
- let eventHub;
-
- const buildEditor = () => {
- tiptapEditor = createTestEditor({ extensions: [Link] });
- contentEditor = { resolveUrl: jest.fn() };
- eventHub = eventHubFactory();
- };
-
- const buildWrapper = () => {
- wrapper = mountExtended(LinkBubbleMenu, {
- provide: {
- tiptapEditor,
- contentEditor,
- eventHub,
- },
- });
- };
-
- const expectLinkButtonsToExist = (exist = true) => {
- expect(wrapper.findComponent(GlLink).exists()).toBe(exist);
- expect(wrapper.findByTestId('copy-link-url').exists()).toBe(exist);
- expect(wrapper.findByTestId('edit-link').exists()).toBe(exist);
- expect(wrapper.findByTestId('remove-link').exists()).toBe(exist);
- };
-
- beforeEach(async () => {
- buildEditor();
- buildWrapper();
-
- tiptapEditor
- .chain()
- .insertContent(
- 'Download <a href="/path/to/project/-/wikis/uploads/my_file.pdf" data-canonical-src="uploads/my_file.pdf" title="Click here to download">PDF File</a>',
- )
- .setTextSelection(14) // put cursor in the middle of the link
- .run();
-
- await emitEditorEvent({ event: 'transaction', tiptapEditor });
-
- bubbleMenu = wrapper.findComponent(BubbleMenu);
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders bubble menu component', async () => {
- expect(bubbleMenu.props('editor')).toBe(tiptapEditor);
- expect(bubbleMenu.classes()).toEqual(['gl-shadow', 'gl-rounded-base', 'gl-bg-white']);
- });
-
- it('shows a clickable link to the URL in the link node', async () => {
- const link = wrapper.findComponent(GlLink);
- expect(link.attributes()).toEqual(
- expect.objectContaining({
- href: '/path/to/project/-/wikis/uploads/my_file.pdf',
- 'aria-label': 'uploads/my_file.pdf',
- title: 'uploads/my_file.pdf',
- target: '_blank',
- }),
- );
- expect(link.text()).toBe('uploads/my_file.pdf');
- });
-
- describe('copy button', () => {
- it('copies the canonical link to clipboard', async () => {
- jest.spyOn(navigator.clipboard, 'writeText');
-
- await wrapper.findByTestId('copy-link-url').vm.$emit('click');
-
- expect(navigator.clipboard.writeText).toHaveBeenCalledWith('uploads/my_file.pdf');
- });
- });
-
- describe('remove link button', () => {
- it('removes the link', async () => {
- await wrapper.findByTestId('remove-link').vm.$emit('click');
-
- expect(tiptapEditor.getHTML()).toBe('<p>Download PDF File</p>');
- });
- });
-
- describe('for a placeholder link', () => {
- beforeEach(async () => {
- tiptapEditor
- .chain()
- .clearContent()
- .insertContent('Dummy link')
- .selectAll()
- .setLink({ href: '' })
- .setTextSelection(4)
- .run();
-
- await emitEditorEvent({ event: 'transaction', tiptapEditor });
- });
-
- it('directly opens the edit form for a placeholder link', async () => {
- expectLinkButtonsToExist(false);
-
- expect(wrapper.findComponent(GlForm).exists()).toBe(true);
- });
-
- it('removes the link on clicking apply (if no change)', async () => {
- await wrapper.findComponent(GlForm).vm.$emit('submit', createFakeEvent());
-
- expect(tiptapEditor.getHTML()).toBe('<p>Dummy link</p>');
- });
-
- it('removes the link on clicking cancel', async () => {
- await wrapper.findByTestId('cancel-link').vm.$emit('click');
-
- expect(tiptapEditor.getHTML()).toBe('<p>Dummy link</p>');
- });
- });
-
- describe('edit button', () => {
- let linkHrefInput;
- let linkTitleInput;
-
- beforeEach(async () => {
- await wrapper.findByTestId('edit-link').vm.$emit('click');
-
- linkHrefInput = wrapper.findByTestId('link-href');
- linkTitleInput = wrapper.findByTestId('link-title');
- });
-
- it('hides the link and copy/edit/remove link buttons', async () => {
- expectLinkButtonsToExist(false);
- });
-
- it('shows a form to edit the link', () => {
- expect(wrapper.findComponent(GlForm).exists()).toBe(true);
-
- expect(linkHrefInput.element.value).toBe('uploads/my_file.pdf');
- expect(linkTitleInput.element.value).toBe('Click here to download');
- });
-
- it('extends selection to select the entire link', () => {
- const { from, to } = tiptapEditor.state.selection;
-
- expect(from).toBe(10);
- expect(to).toBe(18);
- });
-
- it('shows the copy/edit/remove link buttons again if selection changes to another non-link and then back again to a link', async () => {
- expectLinkButtonsToExist(false);
-
- tiptapEditor.commands.setTextSelection(3);
- await emitEditorEvent({ event: 'transaction', tiptapEditor });
-
- tiptapEditor.commands.setTextSelection(14);
- await emitEditorEvent({ event: 'transaction', tiptapEditor });
-
- expectLinkButtonsToExist(true);
- expect(wrapper.findComponent(GlForm).exists()).toBe(false);
- });
-
- describe('after making changes in the form and clicking apply', () => {
- beforeEach(async () => {
- linkHrefInput.setValue('https://google.com');
- linkTitleInput.setValue('Search Google');
-
- contentEditor.resolveUrl.mockResolvedValue('https://google.com');
-
- await wrapper.findComponent(GlForm).vm.$emit('submit', createFakeEvent());
- });
-
- it('updates prosemirror doc with new link', async () => {
- expect(tiptapEditor.getHTML()).toBe(
- '<p>Download <a target="_blank" rel="noopener noreferrer nofollow" href="https://google.com" title="Search Google">PDF File</a></p>',
- );
- });
-
- it('updates the link in the bubble menu', () => {
- const link = wrapper.findComponent(GlLink);
- expect(link.attributes()).toEqual(
- expect.objectContaining({
- href: 'https://google.com',
- 'aria-label': 'https://google.com',
- title: 'https://google.com',
- target: '_blank',
- }),
- );
- expect(link.text()).toBe('https://google.com');
- });
- });
-
- describe('after making changes in the form and clicking cancel', () => {
- beforeEach(async () => {
- linkHrefInput.setValue('https://google.com');
- linkTitleInput.setValue('Search Google');
-
- await wrapper.findByTestId('cancel-link').vm.$emit('click');
- });
-
- it('hides the form and shows the copy/edit/remove link buttons', () => {
- expectLinkButtonsToExist();
- });
-
- it('resets the form with old values of the link from prosemirror', async () => {
- // click edit once again to show the form back
- await wrapper.findByTestId('edit-link').vm.$emit('click');
-
- linkHrefInput = wrapper.findByTestId('link-href');
- linkTitleInput = wrapper.findByTestId('link-title');
-
- expect(linkHrefInput.element.value).toBe('uploads/my_file.pdf');
- expect(linkTitleInput.element.value).toBe('Click here to download');
- });
- });
- });
-});