56 lines
2.1 KiB
TypeScript
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/) }]);
|
|
});
|
|
});
|