mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2026-05-14 15:00:25 +00:00
Test coverage: |Modal|Test| |-|-| |admin: adopt unadopted|missing, not needed| |admin: delete unadopted|missing, not needed| |admin: delete user|e2e added: `Admin: delete a user`| |delete package|missing| |new project|?| |edit project col|?| |default project col|?| |delete project col|?| |commit cherry-pick|?| |commit delete note|?| |fork redirect|?| |lock/unlock issue|?| |dismiss PR review|?| |migration delete|?| |migration cancel|?| |lfs delete|?| |convert mirror|?| |convert fork|?| |transfer repo|?| |delete repo|?| |archive repo|integration present, selectors adjusted| |delete wiki|?| |rename wiki branch|?| |push mirror edit|?| |mde: new table|e2e present, selectors adjusted| |mde: new link|e2e present, selectors adjusted| |actions: add secret|?| |actions: edit variable|?| Co-authored-by: 0ko <0ko@noreply.codeberg.org> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10287 Reviewed-by: 0ko <0ko@noreply.codeberg.org>
106 lines
3.8 KiB
TypeScript
106 lines
3.8 KiB
TypeScript
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
// @watch start
|
|
// web_src/js/features/common-global.js
|
|
// web_src/js/features/comp/Paste.js
|
|
// web_src/js/features/repo-issue.js
|
|
// web_src/js/features/repo-legacy.js
|
|
// @watch end
|
|
|
|
import {expect, type Locator, type Page} from '@playwright/test';
|
|
import {test, dynamic_id} from './utils_e2e.ts';
|
|
import {screenshot} from './shared/screenshots.ts';
|
|
|
|
test.use({user: 'user2'});
|
|
|
|
async function pasteImage(el: Locator) {
|
|
await el.evaluate(async (el) => {
|
|
const base64 = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAHklEQVQoU2MUk1P7z0AGYBzViDvURgMHT4oaQoEDAFuJEu2fuGfhAAAAAElFTkSuQmCC`;
|
|
// eslint-disable-next-line no-restricted-syntax
|
|
const response = await fetch(base64);
|
|
const blob = await response.blob();
|
|
|
|
el.focus();
|
|
|
|
let pasteEvent = new Event('paste', {bubbles: true, cancelable: true});
|
|
pasteEvent = Object.assign(pasteEvent, {
|
|
clipboardData: {
|
|
items: [
|
|
{
|
|
kind: 'file',
|
|
type: 'image/png',
|
|
getAsFile() {
|
|
return new File([blob], 'foo.png', {type: blob.type});
|
|
},
|
|
},
|
|
],
|
|
},
|
|
});
|
|
|
|
el.dispatchEvent(pasteEvent);
|
|
});
|
|
}
|
|
|
|
async function assertCopy(page: Page, startWith: string) {
|
|
const dropzone = page.locator('.dropzone');
|
|
const preview = dropzone.locator('.dz-preview');
|
|
const copyLink = preview.locator('.octicon-copy').locator('..');
|
|
await copyLink.click();
|
|
|
|
await expect(async () => {
|
|
const clipboardContent = await page.evaluate(() => navigator.clipboard.readText());
|
|
expect(clipboardContent).toContain(startWith);
|
|
}).toPass();
|
|
}
|
|
|
|
test('Paste image in new comment', async ({page}) => {
|
|
await page.goto('/user2/repo1/issues/new');
|
|
|
|
const waitForAttachmentUpload = page.waitForResponse((response) => {
|
|
return response.request().method() === 'POST' && response.url().endsWith('/attachments');
|
|
});
|
|
await pasteImage(page.locator('.markdown-text-editor'));
|
|
await waitForAttachmentUpload;
|
|
|
|
const dropzone = page.locator('.dropzone');
|
|
await expect(dropzone.locator('.files')).toHaveCount(1);
|
|
const preview = dropzone.locator('.dz-preview');
|
|
await expect(preview).toHaveCount(1);
|
|
await expect(preview.locator('.dz-filename')).toHaveText('foo.png');
|
|
await expect(preview.locator('.octicon-copy')).toBeVisible();
|
|
await assertCopy(page, ';
|
|
|
|
await screenshot(page, page.locator('.issue-content-left'));
|
|
});
|
|
|
|
test('Re-add images to dropzone on edit', async ({page}) => {
|
|
await page.goto('/user2/repo1/issues/new');
|
|
|
|
const issueTitle = dynamic_id();
|
|
await page.locator('#issue_title').fill(issueTitle);
|
|
const waitForAttachmentUpload = page.waitForResponse((response) => {
|
|
return response.request().method() === 'POST' && response.url().endsWith('/attachments');
|
|
});
|
|
await pasteImage(page.locator('.markdown-text-editor'));
|
|
await waitForAttachmentUpload;
|
|
await page.getByRole('button', {name: 'Create issue'}).click();
|
|
|
|
await expect(page).toHaveURL(/\/user2\/repo1\/issues\/\d+$/);
|
|
await page.click('.comment-container .context-menu');
|
|
const waitForAttachmentsLoad = page.waitForResponse((response) => {
|
|
return response.request().method() === 'GET' && response.url().endsWith('/attachments');
|
|
});
|
|
await page.click('.comment-container .menu > .edit-content');
|
|
await waitForAttachmentsLoad;
|
|
|
|
const dropzone = page.locator('.dropzone');
|
|
await expect(dropzone.locator('.files').first()).toHaveCount(1);
|
|
const preview = dropzone.locator('.dz-preview');
|
|
await expect(preview).toHaveCount(1);
|
|
await expect(preview.locator('.dz-filename')).toHaveText('foo.png');
|
|
await expect(preview.locator('.octicon-copy')).toBeVisible();
|
|
await assertCopy(page, ';
|
|
|
|
await screenshot(page, page.locator('.issue-content-left'));
|
|
});
|