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/media_spec.js')
-rw-r--r--spec/frontend/content_editor/components/bubble_menus/media_spec.js234
1 files changed, 0 insertions, 234 deletions
diff --git a/spec/frontend/content_editor/components/bubble_menus/media_spec.js b/spec/frontend/content_editor/components/bubble_menus/media_spec.js
deleted file mode 100644
index fada4f06743..00000000000
--- a/spec/frontend/content_editor/components/bubble_menus/media_spec.js
+++ /dev/null
@@ -1,234 +0,0 @@
-import { GlLink, GlForm } from '@gitlab/ui';
-import { BubbleMenu } from '@tiptap/vue-2';
-import { mountExtended } from 'helpers/vue_test_utils_helper';
-import MediaBubbleMenu from '~/content_editor/components/bubble_menus/media.vue';
-import eventHubFactory from '~/helpers/event_hub_factory';
-import Image from '~/content_editor/extensions/image';
-import Audio from '~/content_editor/extensions/audio';
-import Video from '~/content_editor/extensions/video';
-import { createTestEditor, emitEditorEvent, mockChainedCommands } from '../../test_utils';
-import {
- PROJECT_WIKI_ATTACHMENT_IMAGE_HTML,
- PROJECT_WIKI_ATTACHMENT_AUDIO_HTML,
- PROJECT_WIKI_ATTACHMENT_VIDEO_HTML,
-} from '../../test_constants';
-
-const TIPTAP_IMAGE_HTML = `<p>
- <img src="https://gitlab.com/favicon.png" alt="gitlab favicon" title="gitlab favicon">
-</p>`;
-
-const TIPTAP_AUDIO_HTML = `<p>
- <span class="media-container audio-container"><audio src="https://gitlab.com/favicon.png" controls="true" data-setup="{}" data-title="gitlab favicon"></audio><a href="https://gitlab.com/favicon.png">gitlab favicon</a></span>
-</p>`;
-
-const TIPTAP_VIDEO_HTML = `<p>
- <span class="media-container video-container"><video src="https://gitlab.com/favicon.png" controls="true" data-setup="{}" data-title="gitlab favicon"></video><a href="https://gitlab.com/favicon.png">gitlab favicon</a></span>
-</p>`;
-
-const createFakeEvent = () => ({ preventDefault: jest.fn(), stopPropagation: jest.fn() });
-
-describe.each`
- mediaType | mediaHTML | filePath | mediaOutputHTML
- ${'image'} | ${PROJECT_WIKI_ATTACHMENT_IMAGE_HTML} | ${'test-file.png'} | ${TIPTAP_IMAGE_HTML}
- ${'audio'} | ${PROJECT_WIKI_ATTACHMENT_AUDIO_HTML} | ${'test-file.mp3'} | ${TIPTAP_AUDIO_HTML}
- ${'video'} | ${PROJECT_WIKI_ATTACHMENT_VIDEO_HTML} | ${'test-file.mp4'} | ${TIPTAP_VIDEO_HTML}
-`(
- 'content_editor/components/bubble_menus/media ($mediaType)',
- ({ mediaType, mediaHTML, filePath, mediaOutputHTML }) => {
- let wrapper;
- let tiptapEditor;
- let contentEditor;
- let bubbleMenu;
- let eventHub;
-
- const buildEditor = () => {
- tiptapEditor = createTestEditor({ extensions: [Image, Audio, Video] });
- contentEditor = { resolveUrl: jest.fn() };
- eventHub = eventHubFactory();
- };
-
- const buildWrapper = () => {
- wrapper = mountExtended(MediaBubbleMenu, {
- provide: {
- tiptapEditor,
- contentEditor,
- eventHub,
- },
- });
- };
-
- const selectFile = async (file) => {
- const input = wrapper.find({ ref: 'fileSelector' });
-
- // override the property definition because `input.files` isn't directly modifyable
- Object.defineProperty(input.element, 'files', { value: [file], writable: true });
- await input.trigger('change');
- };
-
- const expectLinkButtonsToExist = (exist = true) => {
- expect(wrapper.findComponent(GlLink).exists()).toBe(exist);
- expect(wrapper.findByTestId('copy-media-src').exists()).toBe(exist);
- expect(wrapper.findByTestId('edit-media').exists()).toBe(exist);
- expect(wrapper.findByTestId('delete-media').exists()).toBe(exist);
- };
-
- beforeEach(async () => {
- buildEditor();
- buildWrapper();
-
- tiptapEditor
- .chain()
- .insertContent(mediaHTML)
- .setNodeSelection(4) // select the media
- .run();
-
- contentEditor.resolveUrl.mockResolvedValue(`/group1/project1/-/wikis/${filePath}`);
-
- 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 image', async () => {
- const link = wrapper.findComponent(GlLink);
- expect(link.attributes()).toEqual(
- expect.objectContaining({
- href: `/group1/project1/-/wikis/${filePath}`,
- 'aria-label': filePath,
- title: filePath,
- target: '_blank',
- }),
- );
- expect(link.text()).toBe(filePath);
- });
-
- describe('copy button', () => {
- it(`copies the canonical link to the ${mediaType} to clipboard`, async () => {
- jest.spyOn(navigator.clipboard, 'writeText');
-
- await wrapper.findByTestId('copy-media-src').vm.$emit('click');
-
- expect(navigator.clipboard.writeText).toHaveBeenCalledWith(filePath);
- });
- });
-
- describe(`remove ${mediaType} button`, () => {
- it(`removes the ${mediaType}`, async () => {
- await wrapper.findByTestId('delete-media').vm.$emit('click');
-
- expect(tiptapEditor.getHTML()).toBe('<p>\n \n</p>');
- });
- });
-
- describe(`replace ${mediaType} button`, () => {
- it('uploads and replaces the selected image when file input changes', async () => {
- const commands = mockChainedCommands(tiptapEditor, [
- 'focus',
- 'deleteSelection',
- 'uploadAttachment',
- 'run',
- ]);
- const file = new File(['foo'], 'foo.png', { type: 'image/png' });
-
- await wrapper.findByTestId('replace-media').vm.$emit('click');
- await selectFile(file);
-
- expect(commands.focus).toHaveBeenCalled();
- expect(commands.deleteSelection).toHaveBeenCalled();
- expect(commands.uploadAttachment).toHaveBeenCalledWith({ file });
- expect(commands.run).toHaveBeenCalled();
- });
- });
-
- describe('edit button', () => {
- let mediaSrcInput;
- let mediaTitleInput;
- let mediaAltInput;
-
- beforeEach(async () => {
- await wrapper.findByTestId('edit-media').vm.$emit('click');
-
- mediaSrcInput = wrapper.findByTestId('media-src');
- mediaTitleInput = wrapper.findByTestId('media-title');
- mediaAltInput = wrapper.findByTestId('media-alt');
- });
-
- it('hides the link and copy/edit/remove link buttons', async () => {
- expectLinkButtonsToExist(false);
- });
-
- it(`shows a form to edit the ${mediaType} src/title/alt`, () => {
- expect(wrapper.findComponent(GlForm).exists()).toBe(true);
-
- expect(mediaSrcInput.element.value).toBe(filePath);
- expect(mediaTitleInput.element.value).toBe('');
- expect(mediaAltInput.element.value).toBe('test-file');
- });
-
- describe('after making changes in the form and clicking apply', () => {
- beforeEach(async () => {
- mediaSrcInput.setValue('https://gitlab.com/favicon.png');
- mediaAltInput.setValue('gitlab favicon');
- mediaTitleInput.setValue('gitlab favicon');
-
- contentEditor.resolveUrl.mockResolvedValue('https://gitlab.com/favicon.png');
-
- await wrapper.findComponent(GlForm).vm.$emit('submit', createFakeEvent());
- });
-
- it(`updates prosemirror doc with new src to the ${mediaType}`, async () => {
- expect(tiptapEditor.getHTML()).toBe(mediaOutputHTML);
- });
-
- it(`updates the link to the ${mediaType} in the bubble menu`, () => {
- const link = wrapper.findComponent(GlLink);
- expect(link.attributes()).toEqual(
- expect.objectContaining({
- href: 'https://gitlab.com/favicon.png',
- 'aria-label': 'https://gitlab.com/favicon.png',
- title: 'https://gitlab.com/favicon.png',
- target: '_blank',
- }),
- );
- expect(link.text()).toBe('https://gitlab.com/favicon.png');
- });
- });
-
- describe('after making changes in the form and clicking cancel', () => {
- beforeEach(async () => {
- mediaSrcInput.setValue('https://gitlab.com/favicon.png');
- mediaAltInput.setValue('gitlab favicon');
- mediaTitleInput.setValue('gitlab favicon');
-
- await wrapper.findByTestId('cancel-editing-media').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 ${mediaType} from prosemirror`, async () => {
- // click edit once again to show the form back
- await wrapper.findByTestId('edit-media').vm.$emit('click');
-
- mediaSrcInput = wrapper.findByTestId('media-src');
- mediaTitleInput = wrapper.findByTestId('media-title');
- mediaAltInput = wrapper.findByTestId('media-alt');
-
- expect(mediaSrcInput.element.value).toBe(filePath);
- expect(mediaAltInput.element.value).toBe('test-file');
- expect(mediaTitleInput.element.value).toBe('');
- });
- });
- });
- },
-);