feat(cms): recover drafts and failed imports with verified UI workflows
This commit is contained in:
1 parent
410a1e466c
commit
88790d1a0d
84 files changed
+3952
-288
No files matched your search
@@ -0,0 +1,99 @@
|
||||
import { expect, test } from "@playwright/test";
|
||||
import {
|
||||
furnitureCursorFixture,
|
||||
furnitureJobFixture,
|
||||
} from "../../src/test/furniture-jobs-fixtures";
|
||||
|
||||
test("history hook deduplicates refreshes, pages and reports completion once", async ({
|
||||
page,
|
||||
}) => {
|
||||
let requests = 0;
|
||||
let completed = false;
|
||||
await page.route("**/api/admin/studio/import-jobs?*", async (route) => {
|
||||
requests++;
|
||||
const secondPage = new URL(route.request().url()).searchParams.has(
|
||||
"before",
|
||||
);
|
||||
await new Promise((resolve) => setTimeout(resolve, 100));
|
||||
await route.fulfill({
|
||||
json: {
|
||||
ok: true,
|
||||
jobs: [
|
||||
{
|
||||
...furnitureJobFixture,
|
||||
id: secondPage
|
||||
? "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb"
|
||||
: furnitureJobFixture.id,
|
||||
state: completed ? "completed" : "queued",
|
||||
},
|
||||
],
|
||||
nextCursor: secondPage ? null : furnitureCursorFixture,
|
||||
},
|
||||
});
|
||||
});
|
||||
await page.goto("/admin/jobs-harness");
|
||||
await expect(page.getByLabel("Jobs", { exact: true })).toContainText(
|
||||
furnitureJobFixture.id,
|
||||
);
|
||||
await expect(page.getByLabel("Loading", { exact: true })).toHaveText("false");
|
||||
const initial = requests;
|
||||
await page.getByRole("button", { name: "Refresh twice" }).click();
|
||||
await expect(page.getByLabel("Loading", { exact: true })).toHaveText("true");
|
||||
await expect(page.getByLabel("Loading", { exact: true })).toHaveText("false");
|
||||
expect(requests).toBe(initial + 1);
|
||||
await page.getByRole("button", { name: "Next page" }).click();
|
||||
await expect(page.getByLabel("Page", { exact: true })).toHaveText("2");
|
||||
await expect(page.getByLabel("Jobs", { exact: true })).toContainText(
|
||||
"bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
|
||||
);
|
||||
await page.getByRole("button", { name: "Previous page" }).click();
|
||||
await expect(page.getByLabel("Page", { exact: true })).toHaveText("1");
|
||||
await expect(page.getByLabel("Jobs", { exact: true })).toContainText(
|
||||
furnitureJobFixture.id,
|
||||
);
|
||||
await expect(page.getByLabel("Loading", { exact: true })).toHaveText("false");
|
||||
completed = true;
|
||||
await page.getByRole("button", { name: "Refresh twice" }).click();
|
||||
await expect(page.getByLabel("Loading", { exact: true })).toHaveText("true");
|
||||
await expect(page.getByLabel("Completions", { exact: true })).toHaveText("1");
|
||||
await page.getByRole("button", { name: "Refresh twice" }).click();
|
||||
await expect(page.getByLabel("Loading", { exact: true })).toHaveText("true");
|
||||
await expect(page.getByLabel("Loading", { exact: true })).toHaveText("false");
|
||||
await expect(page.getByLabel("Completions", { exact: true })).toHaveText("1");
|
||||
});
|
||||
|
||||
test("history polling pauses while hidden and refreshes on visibility return", async ({
|
||||
page,
|
||||
}) => {
|
||||
let requests = 0;
|
||||
await page.clock.install();
|
||||
await page.route("**/api/admin/studio/import-jobs?*", (route) => {
|
||||
requests++;
|
||||
return route.fulfill({
|
||||
json: { ok: true, jobs: [furnitureJobFixture], nextCursor: null },
|
||||
});
|
||||
});
|
||||
await page.goto("/admin/jobs-harness");
|
||||
await expect(page.getByLabel("Jobs", { exact: true })).toContainText(
|
||||
furnitureJobFixture.id,
|
||||
);
|
||||
await expect(page.getByLabel("Loading", { exact: true })).toHaveText("false");
|
||||
await page.evaluate(() => {
|
||||
Object.defineProperty(document, "visibilityState", {
|
||||
configurable: true,
|
||||
get: () => "hidden",
|
||||
});
|
||||
document.dispatchEvent(new Event("visibilitychange"));
|
||||
});
|
||||
const hiddenCount = requests;
|
||||
await page.clock.fastForward(60000);
|
||||
expect(requests).toBe(hiddenCount);
|
||||
await page.evaluate(() => {
|
||||
Object.defineProperty(document, "visibilityState", {
|
||||
configurable: true,
|
||||
get: () => "visible",
|
||||
});
|
||||
document.dispatchEvent(new Event("visibilitychange"));
|
||||
});
|
||||
await expect.poll(() => requests).toBe(hiddenCount + 1);
|
||||
});
|
||||
Reference in new issue
Block a user