clone

a deno framework for local-first web apps that open instantly, work offline and sync when users choose

fix/175-template-quality-pass
lofi / package / recipes / protocol-handler_test.ts
protocol-handler_test.ts 2.3K
1import { parseCollaborativeListProtocolTarget } from "./protocol-handler.ts";23function assert(condition: unknown, message: string): asserts condition {4 if (!condition) throw new Error(message);5}67const options = { protocol: "web+lofi", parameter: "url", maxLength: 256 } as const;89Deno.test("protocol target decodes once into allow-listed identifiers", () => {10 const result = parseCollaborativeListProtocolTarget(11 "?url=web%2Blofi%3Acollaborative-list%2Flist_1%2Fitem%2Fitem-2",12 options,13 );14 assert(result.ok, `valid protocol target failed: ${JSON.stringify(result)}`);15 assert(result.target.listId === "list_1", "list ID drifted");16 assert(result.target.itemId === "item-2", "item ID drifted");1718 const encodedTwice = parseCollaborativeListProtocolTarget(19 "?url=web%252Blofi%253Acollaborative-list%252Flist_1%252Fitem%252Fitem-2",20 options,21 );22 assert(!encodedTwice.ok && encodedTwice.issue === "invalid-target", "double encoding passed");23});2425Deno.test("protocol target rejects duplicates, extras, length, scheme, and shape without values", () => {26 const cases = [27 ["", "missing-target"],28 ["?url=a&url=b", "duplicate-target"],29 ["?url=a&next=https%3A%2F%2Foutside.invalid", "unexpected-parameter"],30 [`?url=${"a".repeat(257)}`, "target-too-long"],31 ["?url=not-a-url", "invalid-target"],32 ["?url=web%2Bother%3Acollaborative-list%2Flist%2Fitem%2Fitem", "wrong-protocol"],33 ["?url=web%2Blofi%3Ahttps%3A%2F%2Foutside.invalid", "unsupported-shape"],34 ["?url=web%2Blofi%3Acollaborative-list%2Fbad%21%2Fitem%2Fitem", "invalid-list-id"],35 ["?url=web%2Blofi%3Acollaborative-list%2Flist%2Fitem%2Fbad%21", "invalid-item-id"],36 ] as const;37 for (const [search, issue] of cases) {38 const result = parseCollaborativeListProtocolTarget(search, options);39 assert(!result.ok && result.issue === issue, `${issue} produced ${JSON.stringify(result)}`);40 }41});4243Deno.test("protocol target rejects privileged and ambiguous configuration", () => {44 for (const protocol of ["https", "mailto", "web+UPPER", "web+"]) {45 let rejected = false;46 try {47 parseCollaborativeListProtocolTarget("", { protocol });48 } catch (error) {49 rejected = error instanceof TypeError;50 }51 assert(rejected, `unsafe protocol configuration passed: ${protocol}`);52 }53});