From 497c4876a642eba9443e232c7202dfbd3294ee1b Mon Sep 17 00:00:00 2001 From: xCyanGrizzly Date: Mon, 27 Jul 2026 12:03:14 +0200 Subject: [PATCH] test(worker): lock in RAR multipart per-volume walk --- worker/src/archive/ranged/rar-ranged.test.ts | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/worker/src/archive/ranged/rar-ranged.test.ts b/worker/src/archive/ranged/rar-ranged.test.ts index 75feeca..35e728f 100644 --- a/worker/src/archive/ranged/rar-ranged.test.ts +++ b/worker/src/archive/ranged/rar-ranged.test.ts @@ -98,3 +98,27 @@ describe("readRarListingRanged (single part)", () => { expect(res === null || Array.isArray(res)).toBe(true); // real unrar parse covered live }); }); + +describe("readRarListingRanged (multipart)", () => { + it("walks each volume from its own signature and reconstructs all parts", async () => { + const vol = buildRar5Volume(); // reuse from Task 6 test + // Two volumes with identical structure; each RangeReader read is scoped by fileId. + const byId: Record = { p1: vol, p2: vol }; + const reads: Record = { p1: 0, p2: 0 }; + const read: RangeReader = async (fileId, offset, length) => { + reads[fileId]++; + return byId[fileId].subarray(offset, offset + length); + }; + const res = await readRarListingRanged( + [ + { fileId: "p1", fileSize: BigInt(vol.length), fileName: "x.part1.rar" }, + { fileId: "p2", fileSize: BigInt(vol.length), fileName: "x.part2.rar" }, + ], + read, + ); + // Both volumes were walked (each read at least its signature + blocks). + expect(reads.p1).toBeGreaterThan(0); + expect(reads.p2).toBeGreaterThan(0); + expect(res === null || Array.isArray(res)).toBe(true); + }); +});