mirror of
https://seed.radicle.dev/rad:z4D5UCArafTzTQpDZNQRuqswh3ury.git
synced 2026-10-18 19:10:45 +08:00
89 lines
3.1 KiB
TypeScript
89 lines
3.1 KiB
TypeScript
import type { JSHandle, Locator, Page } from "@playwright/test";
|
|
import type { RadiclePeer } from "@tests/support/peerManager.js";
|
|
|
|
import { createProject } from "@tests/support/collaboration.js";
|
|
import { expect, test, waitForCommand } from "@tests/support/fixtures.js";
|
|
|
|
async function openIssue(page: Page, peer: RadiclePeer) {
|
|
const { rid, issueId } = await createProject(peer);
|
|
await page.goto(`/repos/${rid}/issues/${issueId}`);
|
|
await expect(page.getByText("Nobody reads them.")).toBeVisible();
|
|
}
|
|
|
|
function fileTransfer(
|
|
page: Page,
|
|
name: string,
|
|
): Promise<JSHandle<DataTransfer>> {
|
|
return page.evaluateHandle(name => {
|
|
const dataTransfer = new DataTransfer();
|
|
dataTransfer.items.add(new File(["loud"], name, { type: "text/plain" }));
|
|
return dataTransfer;
|
|
}, name);
|
|
}
|
|
|
|
async function dropFile(target: Locator, dataTransfer: JSHandle<DataTransfer>) {
|
|
for (const type of ["dragenter", "dragover", "drop"]) {
|
|
await target.dispatchEvent(type, { dataTransfer });
|
|
}
|
|
}
|
|
|
|
test("a dropped file only goes into the textarea under it", async ({
|
|
page,
|
|
peer,
|
|
}) => {
|
|
await openIssue(page, peer);
|
|
|
|
await page.getByText("Nobody reads them.").hover();
|
|
await page.getByTitle("Edit description").click();
|
|
const description = page.getByPlaceholder("Leave your comment");
|
|
await expect(description).toHaveValue("Nobody reads them.");
|
|
|
|
const composer = page.getByPlaceholder("Leave a comment");
|
|
await waitForCommand(page, "save_embed_by_bytes", () =>
|
|
fileTransfer(page, "notes.txt").then(transfer =>
|
|
dropFile(composer, transfer),
|
|
),
|
|
);
|
|
await expect(composer).toHaveValue(/\[notes\.txt\]\(\w+\)/);
|
|
await expect(description).toHaveValue("Nobody reads them.");
|
|
});
|
|
|
|
test("a file dropped while previewing is refused", async ({ page, peer }) => {
|
|
await openIssue(page, peer);
|
|
let uploads = 0;
|
|
page.on("request", request => {
|
|
if (new URL(request.url()).pathname === "/save_embed_by_bytes") {
|
|
uploads++;
|
|
}
|
|
});
|
|
|
|
await page.getByPlaceholder("Leave a comment").fill("Draft");
|
|
const composer = page.getByLabel("extended-textarea");
|
|
await composer.getByRole("button", { name: "Preview" }).click();
|
|
await dropFile(composer, await fileTransfer(page, "notes.txt"));
|
|
|
|
await composer.getByRole("button", { name: "Edit" }).click();
|
|
await expect(page.getByPlaceholder("Leave a comment")).toHaveValue("Draft");
|
|
expect(uploads).toBe(0);
|
|
});
|
|
|
|
test("the drop highlight clears once the file leaves", async ({
|
|
page,
|
|
peer,
|
|
}) => {
|
|
await openIssue(page, peer);
|
|
const transfer = await fileTransfer(page, "notes.txt");
|
|
const composer = page.getByPlaceholder("Leave a comment");
|
|
const highlight = page.getByText("Drop files to add them as embeds.");
|
|
|
|
await composer.dispatchEvent("dragenter", { dataTransfer: transfer });
|
|
await expect(highlight).toBeVisible();
|
|
// The highlight covers the textarea, so it is entered before that is left.
|
|
await highlight.dispatchEvent("dragenter", { dataTransfer: transfer });
|
|
await composer.dispatchEvent("dragleave", { dataTransfer: transfer });
|
|
await expect(highlight).toBeVisible();
|
|
|
|
await highlight.dispatchEvent("dragleave", { dataTransfer: transfer });
|
|
await expect(highlight).toBeHidden();
|
|
});
|