From 957927739bb510619aa08c952b311e90c5afb875 Mon Sep 17 00:00:00 2001 From: Aanish Bhirud Date: Fri, 27 Mar 2026 14:12:12 -0400 Subject: [PATCH] test(fragment): add baseBMP ARX decode regression tests Add two tests in fragment.test.ts for decoding baseBMP-encoded ARX fragments via decodeFragmentAsync: one for direct baseBMP payloads and one for percent-escaped BMP characters. Covers the sync-adjacent decode path that was previously untested for arx.N. wire format. Co-Authored-By: Claude Opus 4.6 (1M context) --- tests/fragment.test.ts | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/tests/fragment.test.ts b/tests/fragment.test.ts index 71b52e9..c7e0024 100644 --- a/tests/fragment.test.ts +++ b/tests/fragment.test.ts @@ -1,7 +1,8 @@ import { describe, expect, it } from "vitest"; -import { decodeFragment, encodeEnvelope } from "@/lib/payload/fragment"; +import { decodeFragment, decodeFragmentAsync, encodeEnvelope } from "@/lib/payload/fragment"; import type { PayloadEnvelope } from "@/lib/payload/schema"; import { packEnvelope } from "@/lib/payload/wire-format"; +import { arxCompressBMP, getActiveDictVersion } from "@/lib/payload/arx-codec"; const envelope: PayloadEnvelope = { v: 1, @@ -180,4 +181,33 @@ describe("fragment payload transport", () => { expect(parsed.code).toBe("decoded-too-large"); }); + + it("decodes a baseBMP-encoded arx fragment (sync path)", async () => { + const arxEnvelope: PayloadEnvelope = { ...envelope, codec: "arx" }; + const json = JSON.stringify(packEnvelope(arxEnvelope)); + const encoded = await arxCompressBMP(json); + const hash = `#agent-render=v1.arx.${getActiveDictVersion()}.${encoded}`; + + const parsed = await decodeFragmentAsync(hash); + + expect(parsed.ok).toBe(true); + if (!parsed.ok) return; + + expect(parsed.envelope.title).toBe("Test bundle"); + }); + + it("decodes a baseBMP arx fragment when BMP chars are percent-escaped", async () => { + const arxEnvelope: PayloadEnvelope = { ...envelope, codec: "arx" }; + const json = JSON.stringify(packEnvelope(arxEnvelope)); + const encoded = await arxCompressBMP(json); + const hash = `#agent-render=v1.arx.${getActiveDictVersion()}.${encoded}`; + const escapedHash = hash.replace(/[^\x00-\x7F]/g, (ch) => encodeURIComponent(ch)); + + const parsed = await decodeFragmentAsync(escapedHash); + + expect(parsed.ok).toBe(true); + if (!parsed.ok) return; + + expect(parsed.envelope.title).toBe("Test bundle"); + }); });