Refactor project-package.test.ts to use new Zip and ZipDeflate classes from fflate, add buildZipArchive function
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
import { readFile } from "node:fs/promises";
|
import { readFile } from "node:fs/promises";
|
||||||
|
|
||||||
import { strToU8, unzipSync, zipSync } from "fflate";
|
import { strToU8, unzipSync, Zip, ZipDeflate } from "fflate";
|
||||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
import { loadAudioAssetFromStorage } from "../../src/assets/audio-assets";
|
import { loadAudioAssetFromStorage } from "../../src/assets/audio-assets";
|
||||||
@@ -48,6 +48,37 @@ function listPackagedFiles(packageBytes: Uint8Array): string[] {
|
|||||||
.sort();
|
.sort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function buildZipArchive(entries: Record<string, Uint8Array>): Uint8Array {
|
||||||
|
const chunks: Uint8Array[] = [];
|
||||||
|
const zip = new Zip((error, chunk) => {
|
||||||
|
if (error !== null) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chunk !== null) {
|
||||||
|
chunks.push(chunk.slice(0));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const [path, bytes] of Object.entries(entries)) {
|
||||||
|
const zippedFile = new ZipDeflate(path, { level: 6 });
|
||||||
|
zip.add(zippedFile);
|
||||||
|
zippedFile.push(bytes, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
zip.end();
|
||||||
|
|
||||||
|
const archiveBytes = new Uint8Array(chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0));
|
||||||
|
let offset = 0;
|
||||||
|
|
||||||
|
for (const chunk of chunks) {
|
||||||
|
archiveBytes.set(chunk, offset);
|
||||||
|
offset += chunk.byteLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
return archiveBytes;
|
||||||
|
}
|
||||||
|
|
||||||
describe("project package serialization", () => {
|
describe("project package serialization", () => {
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
vi.restoreAllMocks();
|
vi.restoreAllMocks();
|
||||||
@@ -58,9 +89,6 @@ describe("project package serialization", () => {
|
|||||||
const document = createEmptySceneDocument({ name: "Portable Empty Scene" });
|
const document = createEmptySceneDocument({ name: "Portable Empty Scene" });
|
||||||
|
|
||||||
const packageBytes = await saveProjectPackage(document, null);
|
const packageBytes = await saveProjectPackage(document, null);
|
||||||
// TEMP DEBUG
|
|
||||||
console.log("DEBUG package keys", Object.keys(unzipSync(packageBytes)));
|
|
||||||
console.log("DEBUG scene entry", unzipSync(packageBytes)["scene.json"]);
|
|
||||||
const restoredDocument = await loadProjectPackage(packageBytes, null);
|
const restoredDocument = await loadProjectPackage(packageBytes, null);
|
||||||
|
|
||||||
expect(restoredDocument).toEqual(document);
|
expect(restoredDocument).toEqual(document);
|
||||||
@@ -255,10 +283,8 @@ describe("project package serialization", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("fails project load when scene.json is missing", async () => {
|
it("fails project load when scene.json is missing", async () => {
|
||||||
const packageBytes = zipSync({
|
const packageBytes = buildZipArchive({
|
||||||
assets: {
|
"assets/readme.txt": strToU8("not a project")
|
||||||
"readme.txt": strToU8("not a project")
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
await expect(loadProjectPackage(packageBytes, null)).rejects.toThrow("project package is missing scene.json");
|
await expect(loadProjectPackage(packageBytes, null)).rejects.toThrow("project package is missing scene.json");
|
||||||
@@ -286,7 +312,7 @@ describe("project package serialization", () => {
|
|||||||
[imageAsset.id]: imageAsset
|
[imageAsset.id]: imageAsset
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const packageBytes = zipSync({
|
const packageBytes = buildZipArchive({
|
||||||
[PROJECT_PACKAGE_SCENE_PATH]: strToU8(serializeSceneDocument(document))
|
[PROJECT_PACKAGE_SCENE_PATH]: strToU8(serializeSceneDocument(document))
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user