feat(POSTV1-ASSET-ALL-16): 在编辑器接入全部复杂素材
Dada P0-A isolated Windows CI / validate-and-package (push) Waiting to run
Dada P0-A isolated Windows CI / validate-and-package (push) Waiting to run
This commit is contained in:
@@ -64,7 +64,10 @@ async function routeEditor(page: Page, backend: Backend) {
|
||||
});
|
||||
await page.route("**/api/v1/assets/recent?asset_kind=text_template", (route) => route.fulfill({ body: JSON.stringify({ items: [] }), contentType: "application/json" }));
|
||||
await page.route("**/api/v1/assets/recent", (route) => route.fulfill({ body: JSON.stringify({ status: "recorded" }), contentType: "application/json" }));
|
||||
await page.route("**/api/v1/assets/public/p0a-complex-v1/*", (route) => route.fulfill({ body: fontBytes, contentType: "font/ttf" }));
|
||||
await page.route("**/api/v1/assets/public/p0a-complex-v1/*", (route) => {
|
||||
const preview = new URL(route.request().url()).pathname.includes("TEXT-PREVIEW-");
|
||||
return route.fulfill(preview ? { body: png, contentType: "image/png" } : { body: fontBytes, contentType: "font/ttf" });
|
||||
});
|
||||
await page.route("**/api/v1/assets/public/p0a-static-v1/*", (route) => route.fulfill({ body: png, contentType: "image/png" }));
|
||||
await page.route(`**/api/v1/private-assets/projects/${projectId}/images/${backgroundId}`, (route) => route.fulfill({ body: rawSvg(), contentType: "image/svg+xml" }));
|
||||
}
|
||||
@@ -91,7 +94,7 @@ test.beforeAll(async () => {
|
||||
|
||||
test.afterAll(async () => vite.close());
|
||||
|
||||
test("TDD-WP5-WHITE-001 exposes only the P0-A public allowlist", async ({ page }) => {
|
||||
test("POSTV1-ASSET-ALL-16 exposes the complete complex asset catalog", async ({ page }) => {
|
||||
const backend: Backend = { canvas: canvas(), saves: 0, version: 1 };
|
||||
await routeEditor(page, backend);
|
||||
await page.goto(`${webUrl}/app/projects/${projectId}/editor`);
|
||||
@@ -99,7 +102,6 @@ test("TDD-WP5-WHITE-001 exposes only the P0-A public allowlist", async ({ page }
|
||||
await page.getByRole("button", { name: "文字模板", exact: true }).click();
|
||||
const textIds = await page.locator(".editor-template-grid button strong").allTextContents();
|
||||
expect(textIds).toEqual(P0A_TEXT_TEMPLATE_IDS);
|
||||
expect(textIds).not.toContain("FLOWER009");
|
||||
await page.getByRole("button", { name: /FLOWER001 春日计划/ }).click();
|
||||
await expect(page.getByText("对象 1 / 50")).toBeVisible();
|
||||
await expect(page.getByLabel("字体覆盖")).toBeVisible();
|
||||
@@ -109,12 +111,12 @@ test("TDD-WP5-WHITE-001 exposes only the P0-A public allowlist", async ({ page }
|
||||
await page.getByRole("button", { name: "色卡", exact: true }).click();
|
||||
const colorIds = await page.locator(".editor-provider-grid button strong").allTextContents();
|
||||
expect(colorIds).toEqual(P0A_COLOR_CARD_IDS);
|
||||
expect(colorIds).not.toContain("COLOR003");
|
||||
|
||||
await page.getByRole("button", { name: "动态贴纸", exact: true }).click();
|
||||
const dynamicIds = await page.locator(".editor-provider-grid button strong").allTextContents();
|
||||
expect([...dynamicIds].sort()).toEqual([...P0A_DYNAMIC_STICKER_IDS].sort());
|
||||
expect(dynamicIds).not.toContain("DYN005");
|
||||
await page.getByRole("button", { name: /添加动态贴纸 DYN035/ }).click();
|
||||
await expect.poll(() => backend.canvas.elements.some((element) => element.template_or_asset_id === "DYN035")).toBe(true);
|
||||
|
||||
await page.getByRole("button", { name: "普通贴纸", exact: true }).click();
|
||||
await expect(page.getByText("共 1,407 张", { exact: true })).toBeVisible();
|
||||
@@ -130,27 +132,22 @@ test("TDD-WP5-WHITE-001 exposes only the P0-A public allowlist", async ({ page }
|
||||
}
|
||||
});
|
||||
|
||||
test("TDD-WP5-COL-001 renders four layouts from one shared five-color snapshot", async ({ page }) => {
|
||||
test("POSTV1-ASSET-ALL-16 renders sixteen layouts from one shared five-color snapshot", async ({ page }) => {
|
||||
test.setTimeout(60_000);
|
||||
const backend: Backend = { canvas: canvas(), saves: 0, version: 1 };
|
||||
await routeEditor(page, backend);
|
||||
await page.goto(`${webUrl}/app/projects/${projectId}/editor`);
|
||||
await page.getByRole("button", { name: "色卡", exact: true }).click();
|
||||
const placements = [
|
||||
[["ArrowLeft", 10], ["ArrowUp", 8]],
|
||||
[["ArrowRight", 10], ["ArrowUp", 8]],
|
||||
[["ArrowLeft", 10], ["ArrowDown", 8]],
|
||||
[["ArrowRight", 10], ["ArrowDown", 8]],
|
||||
] as const;
|
||||
for (const [index, id] of P0A_COLOR_CARD_IDS.entries()) {
|
||||
await page.getByRole("button", { name: new RegExp(`添加色卡 ${id}`) }).click();
|
||||
await expect.poll(() => backend.canvas.elements.length).toBe(index + 1);
|
||||
for (const [key, times] of placements[index]!) {
|
||||
for (let press = 0; press < times; press += 1) await page.getByLabel("编辑画布").press(`Shift+${key}`);
|
||||
}
|
||||
await expect(page.getByText(`对象 ${index + 1} / 50`)).toBeVisible();
|
||||
}
|
||||
await expect.poll(() => backend.canvas.elements.length, { timeout: 10_000 }).toBe(16);
|
||||
const palettes = backend.canvas.elements.map((element) => element.colors);
|
||||
expect(palettes.every((palette) => JSON.stringify(palette) === JSON.stringify(palettes[0]))).toBe(true);
|
||||
expect(backend.canvas.elements.map((element) => element.style_id)).toEqual(["style_01", "style_02", "style_08", "style_16"]);
|
||||
expect(backend.canvas.elements.map((element) => element.style_id)).toEqual(
|
||||
Array.from({ length: 16 }, (_, index) => `style_${String(index + 1).padStart(2, "0")}`),
|
||||
);
|
||||
const pixels = await page.getByLabel("编辑画布").evaluate((stage: HTMLCanvasElement) => {
|
||||
const context = stage.getContext("2d");
|
||||
if (!context) throw new Error("canvas context unavailable");
|
||||
@@ -161,7 +158,7 @@ test("TDD-WP5-COL-001 renders four layouts from one shared five-color snapshot",
|
||||
});
|
||||
mergeEvidence(evidencePath("color", "palette.json"), { browser_palettes: palettes, same_palette_snapshot: true });
|
||||
mergeEvidence(evidencePath("color", "pixel-diff.json"), {
|
||||
...pixels, four_renderers_visible: true, significant_pixel_ratio: 0, status: pixels.opaque_pixels > 0 ? "passed" : "failed",
|
||||
...pixels, sixteen_renderers_available: true, significant_pixel_ratio: 0, status: pixels.opaque_pixels > 0 ? "passed" : "failed",
|
||||
});
|
||||
const screenshot = evidencePath("color", "screenshots/color-cards.png");
|
||||
if (screenshot) {
|
||||
|
||||
Reference in New Issue
Block a user