1import { discoverRelatedApplications } from "./related-app-discovery.ts";23function assert(condition: unknown, message: string): asserts condition {4 if (!condition) throw new Error(message);5}67const allow = [{8 platform: "play",9 id: "com.example.companion",10 url: "https://play.google.com/store/apps/details?id=com.example.companion",11}] as const;1213Deno.test("related app discovery returns exact product-owned matches for presentation", async () => {14 const result = await discoverRelatedApplications({15 allow,16 client: {17 getInstalledRelatedApps: () =>18 Promise.resolve([{19 platform: "play",20 id: "com.example.companion",21 url: "https://play.google.com/store/apps/details?id=com.example.companion",22 version: "private-version",23 }, { platform: "play", id: "attacker.app" }]),24 },25 });26 assert(result.status === "installed", `match failed: ${JSON.stringify(result)}`);27 assert(result.installed.length === 1, "unknown app was exposed");28 assert(!("version" in result.installed[0]), "browser version escaped the presentation boundary");29});3031Deno.test("related app discovery makes unsupported, empty, and failure normal states", async () => {32 const unsupported = await discoverRelatedApplications({ allow });33 assert(unsupported.status === "unsupported", "missing API was not unsupported");34 const none = await discoverRelatedApplications({35 allow,36 client: { getInstalledRelatedApps: () => Promise.resolve([]) },37 });38 assert(none.status === "none", "empty result was not normal");39 const failed = await discoverRelatedApplications({40 allow,41 client: { getInstalledRelatedApps: () => Promise.reject(new Error("private")) },42 });43 assert(failed.status === "failed", "API failure did not degrade safely");44});4546Deno.test("related app discovery rejects invented declarations", async () => {47 for (48 const declaration of [49 { platform: "invented", id: "app" },50 { platform: "play" },51 { platform: "play", id: "app", url: "http://store.example/app" },52 ]53 ) {54 let rejected = false;55 try {56 await discoverRelatedApplications({ allow: [declaration] });57 } catch (error) {58 rejected = error instanceof TypeError;59 }60 assert(rejected, `invented declaration passed: ${JSON.stringify(declaration)}`);61 }62});