clone

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

feat/184-task-notice-migration
lofi / package / recipes / related-app-discovery_test.ts
related-app-discovery_test.ts 2.4K
1import {2 discoverRelatedApplications,3 type VerifiedRelatedApplication,4} from "./related-app-discovery.ts";56function assert(condition: unknown, message: string): asserts condition {7 if (!condition) throw new Error(message);8}910const allow = [{11 platform: "play",12 id: "com.example.companion",13 url: "https://play.google.com/store/apps/details?id=com.example.companion",14}] as const;1516Deno.test("related app discovery returns exact product-owned matches for presentation", async () => {17 const result = await discoverRelatedApplications({18 allow,19 client: {20 getInstalledRelatedApps: () =>21 Promise.resolve([{22 platform: "play",23 id: "com.example.companion",24 url: "https://play.google.com/store/apps/details?id=com.example.companion",25 version: "private-version",26 }, { platform: "play", id: "attacker.app" }]),27 },28 });29 assert(result.status === "installed", `match failed: ${JSON.stringify(result)}`);30 assert(result.installed.length === 1, "unknown app was exposed");31 assert(!("version" in result.installed[0]), "browser version escaped the presentation boundary");32});3334Deno.test("related app discovery makes unsupported, empty, and failure normal states", async () => {35 const unsupported = await discoverRelatedApplications({ allow });36 assert(unsupported.status === "unsupported", "missing API was not unsupported");37 const none = await discoverRelatedApplications({38 allow,39 client: { getInstalledRelatedApps: () => Promise.resolve([]) },40 });41 assert(none.status === "none", "empty result was not normal");42 const failed = await discoverRelatedApplications({43 allow,44 client: { getInstalledRelatedApps: () => Promise.reject(new Error("private")) },45 });46 assert(failed.status === "failed", "API failure did not degrade safely");47});4849Deno.test("related app discovery rejects invented declarations", async () => {50 for (51 const declaration of [52 { platform: "invented", id: "app" },53 { platform: "play" },54 { platform: "play", id: "app", url: "http://store.example/app" },55 ] as readonly VerifiedRelatedApplication[]56 ) {57 let rejected = false;58 try {59 await discoverRelatedApplications({ allow: [declaration] });60 } catch (error) {61 rejected = error instanceof TypeError;62 }63 assert(rejected, `invented declaration passed: ${JSON.stringify(declaration)}`);64 }65});