Files
ttstd-infinite-canvas/web/test/asset-storage-revision.test.ts

56 lines
2.1 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import { parseAssetRecord } from "@/lib/asset-record";
import { parseAssetStorageDocument, parseAssetStorageDocumentRecovering } from "@/lib/asset-storage-revision";
import type { Asset } from "@/stores/use-asset-store";
const completeAsset = {
id: "library-image",
kind: "image",
title: "素材",
coverUrl: "",
tags: [],
createdAt: "2026-08-29T00:00:00.000Z",
updatedAt: "2026-08-29T00:00:00.000Z",
data: { dataUrl: "opaque://legacy", width: 1, height: 1, bytes: 1, mimeType: "image/png" },
} as Asset;
describe("asset storage revision", () => {
test("parses complete persisted assets without rewriting tags", () => {
const document = parseAssetStorageDocument(JSON.stringify({
state: { assets: [completeAsset] },
version: 1,
storageRevision: 3,
tombstones: { assets: {} },
}));
expect(document.state.assets[0]?.tags).toEqual([]);
expect(document.state.assets[0]?.tags.join(" ")).toBe("");
expect(parseAssetRecord(completeAsset).id).toBe("library-image");
});
test("rejects persisted assets that are missing tags", () => {
const { tags: _tags, ...legacyAsset } = completeAsset;
expect(() => parseAssetStorageDocument(JSON.stringify({
state: { assets: [legacyAsset] },
version: 1,
storageRevision: 3,
tombstones: { assets: {} },
}))).toThrow(/tags/);
});
test("isolates malformed historical records while preserving valid assets", () => {
const { tags: _tags, ...legacyAsset } = completeAsset;
const recovery = parseAssetStorageDocumentRecovering(JSON.stringify({
state: { assets: [legacyAsset, completeAsset] },
version: 1,
storageRevision: 3,
tombstones: { assets: {} },
}));
expect(recovery.document.state.assets.map((asset) => asset.id)).toEqual(["library-image"]);
expect(recovery.invalid).toEqual([{ index: 0, id: "library-image", error: expect.stringMatching(/tags/) }]);
});
});