import { describe, expect, it } from "@suaveplan/testing/runner"; import { urlBase64ToUint8Array } from "./vapid"; describe("urlBase64ToUint8Array", () => { it("decodes padded and unpadded VAPID keys identically", { timeout: 5000, }, () => { const unpadded = "BFa-rtw9CKqL_BdcVqj7m0vYBzcsLkpsZBXmEdYxYsAj42SOPaCQq4qqkKZ9d5R6cy_xpDk0jUVx9b6CgPCu2wo"; const padded = `${unpadded}=`; const a = urlBase64ToUint8Array(unpadded); const b = urlBase64ToUint8Array(padded); expect(a.length).toBe(65); expect(b.length).toBe(65); expect(Array.from(a)).toEqual(Array.from(b)); }); it("round-trips simple known bytes", { timeout: 5000 }, () => { // "Aa" in base64 (URL-safe) is "QWE=" const out = urlBase64ToUint8Array("QWE"); expect(out.length).toBe(2); expect(out[0]).toBe(65); expect(out[1]).toBe(97); }); it("handles URL-safe replacements", { timeout: 5000 }, () => { // bytes [251, 255, 191] → standard base64 +/+/ = "+/+/" → URL-safe "-_-_" const standard = "-_-_"; const out = urlBase64ToUint8Array(standard); expect(out.length).toBeGreaterThan(0); }); it("throws on invalid base64", { timeout: 5000 }, () => { expect(() => urlBase64ToUint8Array("not%base64!")).toThrow(); }); });