Advance Blender 5.2 web parity through M12-03D
This commit is contained in:
91
web/tests/e2e/asset-catalog-restart.spec.ts
Normal file
91
web/tests/e2e/asset-catalog-restart.spec.ts
Normal file
@@ -0,0 +1,91 @@
|
||||
import { expect, test } from "@playwright/test";
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
|
||||
const fixture = JSON.parse(fs.readFileSync(
|
||||
path.resolve(import.meta.dirname, "../../../tests/golden/M12-01D/catalog-v1.json"),
|
||||
"utf8",
|
||||
)) as unknown;
|
||||
|
||||
test("M12-01H preserves catalog order and asset identity across page and Worker restarts", async ({ page }) => {
|
||||
await page.goto("/");
|
||||
const databaseName = `m12-01h-${Date.now()}`;
|
||||
const baseline = await page.evaluate(async ({ databaseName, source }) => {
|
||||
const storage = await import("/src/storage/asset-catalog-indexeddb.ts");
|
||||
const database = await new Promise<IDBDatabase>((resolve, reject) => {
|
||||
const request = indexedDB.open(databaseName, 1);
|
||||
request.onupgradeneeded = () => {
|
||||
request.result.createObjectStore("setting", { keyPath: "id" });
|
||||
request.result.createObjectStore("migration", { keyPath: "id" });
|
||||
};
|
||||
request.onsuccess = () => resolve(request.result);
|
||||
request.onerror = () => reject(request.error);
|
||||
});
|
||||
const transaction = database.transaction("setting", "readwrite");
|
||||
transaction.objectStore("setting").put({ id: storage.ASSET_CATALOG_INDEX_V1_ID, value: source });
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
transaction.oncomplete = () => resolve();
|
||||
transaction.onerror = () => reject(transaction.error);
|
||||
transaction.onabort = () => reject(transaction.error);
|
||||
});
|
||||
const snapshot = await storage.loadAssetCatalogIndexedDBSnapshot(database);
|
||||
database.close();
|
||||
return snapshot;
|
||||
}, { databaseName, source: fixture });
|
||||
|
||||
await page.reload();
|
||||
const pageRestart = await page.evaluate(async (name) => {
|
||||
const storage = await import("/src/storage/asset-catalog-indexeddb.ts");
|
||||
const database = await new Promise<IDBDatabase>((resolve, reject) => {
|
||||
const request = indexedDB.open(name);
|
||||
request.onsuccess = () => resolve(request.result);
|
||||
request.onerror = () => reject(request.error);
|
||||
});
|
||||
const snapshot = await storage.loadAssetCatalogIndexedDBSnapshot(database);
|
||||
database.close();
|
||||
return snapshot;
|
||||
}, databaseName);
|
||||
|
||||
const workerSnapshot = async () => page.evaluate((name) => new Promise<unknown>((resolve, reject) => {
|
||||
const worker = new Worker("/src/workers/asset-catalog-restart-test.worker.ts", { type: "module" });
|
||||
worker.onmessage = (event) => {
|
||||
worker.terminate();
|
||||
event.data.ok ? resolve(event.data.snapshot) : reject(new Error(event.data.error));
|
||||
};
|
||||
worker.onerror = (event) => { worker.terminate(); reject(new Error(event.message)); };
|
||||
worker.postMessage({ databaseName: name });
|
||||
}), databaseName);
|
||||
const firstWorker = await workerSnapshot();
|
||||
const secondWorker = await workerSnapshot();
|
||||
|
||||
expect(pageRestart).toEqual(baseline);
|
||||
expect(firstWorker).toEqual(baseline);
|
||||
expect(secondWorker).toEqual(baseline);
|
||||
expect(baseline).toEqual({
|
||||
schemaVersion: 1,
|
||||
revision: 7,
|
||||
manifestSha256: "0c08ed1af1dd0998c809f76d969fd21d8fdae28ad37cf5571bdc99b16bf3ec90",
|
||||
catalogOrder: [
|
||||
{ catalogId: "44444444-4444-4444-8444-444444444444", path: "Animation" },
|
||||
{ catalogId: "fe3ca14c-95d7-549f-a13b-1bb4c07b6074", path: "Characters" },
|
||||
{ catalogId: "b4bb3608-9267-5aba-bb9e-9e97b006d5ab", path: "Characters/Heroes" },
|
||||
],
|
||||
assetOrder: [
|
||||
"asset:ac88c6147ada877adccf4df8ca54d64e1a9cb50a13514212f6d19b1da1660f8d",
|
||||
"asset:bb91ef0dddf69bb7d87dd4217a01e7f549b50ad628db0367d3896c6840b3a326",
|
||||
],
|
||||
assetIdentities: [
|
||||
{
|
||||
assetId: "asset:ac88c6147ada877adccf4df8ca54d64e1a9cb50a13514212f6d19b1da1660f8d",
|
||||
assetLibraryIdentifier: null,
|
||||
relativeAssetIdentifier: "Action/Legacy Walk",
|
||||
},
|
||||
{
|
||||
assetId: "asset:bb91ef0dddf69bb7d87dd4217a01e7f549b50ad628db0367d3896c6840b3a326",
|
||||
assetLibraryIdentifier: null,
|
||||
relativeAssetIdentifier: "Object/Legacy Hero",
|
||||
},
|
||||
],
|
||||
});
|
||||
await page.evaluate((name) => indexedDB.deleteDatabase(name), databaseName);
|
||||
});
|
||||
Reference in New Issue
Block a user