import { assertEquals } from "https://deno.land/std@0.224.0/assert/mod.ts"; import { countryFlag, getSoftwareConfig, getTrackedSoftware, PDS_SOFTWARE_REGISTRY, } from "./constants.ts"; Deno.test("countryFlag returns correct emoji for country codes", () => { assertEquals(countryFlag("US"), "\u{1F1FA}\u{1F1F8}"); assertEquals(countryFlag("NL"), "\u{1F1F3}\u{1F1F1}"); assertEquals(countryFlag("DE"), "\u{1F1E9}\u{1F1EA}"); }); Deno.test("countryFlag handles lowercase input", () => { assertEquals(countryFlag("us"), countryFlag("US")); }); // --- PDS Software Registry tests --- Deno.test("getSoftwareConfig returns config for known IDs", () => { const bsky = getSoftwareConfig("bluesky-pds"); assertEquals(bsky?.displayName, "Bluesky PDS"); assertEquals(bsky?.githubOwner, "bluesky-social"); const milli = getSoftwareConfig("millipds"); assertEquals(milli?.displayName, "millipds"); const tranquil = getSoftwareConfig("tranquil"); assertEquals(tranquil?.displayName, "Tranquil"); }); Deno.test("getSoftwareConfig returns undefined for unknown ID", () => { assertEquals(getSoftwareConfig("nonexistent"), undefined); }); Deno.test("getTrackedSoftware returns only entries with GitHub info", () => { const tracked = getTrackedSoftware(); for (const sw of tracked) { assertEquals(typeof sw.githubOwner, "string"); assertEquals(typeof sw.githubRepo, "string"); assertEquals(typeof sw.parseVersion, "function"); } // Link-only entries should not be included const ids = tracked.map((s) => s.id); assertEquals(ids.includes("tranquil"), false); assertEquals(ids.includes("hexpds"), false); assertEquals(ids.includes("picopds"), false); // Tracked entries should be included assertEquals(ids.includes("bluesky-pds"), true); assertEquals(ids.includes("millipds"), true); assertEquals(ids.includes("cirrus"), true); assertEquals(ids.includes("cocoon"), true); }); // --- parseVersion tests --- Deno.test("bluesky-pds parseVersion handles valid tags", () => { const sw = getSoftwareConfig("bluesky-pds")!; assertEquals(sw.parseVersion!("v0.4.74"), "0.4.74"); assertEquals(sw.parseVersion!("v1.0.0"), "1.0.0"); }); Deno.test("bluesky-pds parseVersion rejects invalid tags", () => { const sw = getSoftwareConfig("bluesky-pds")!; assertEquals(sw.parseVersion!("0.4.74"), null); assertEquals(sw.parseVersion!("v0.4"), null); assertEquals(sw.parseVersion!("release-1.0"), null); assertEquals(sw.parseVersion!("@getcirrus/pds@0.10.4"), null); }); Deno.test("millipds parseVersion handles valid tags", () => { const sw = getSoftwareConfig("millipds")!; assertEquals(sw.parseVersion!("v0.0.5"), "0.0.5"); assertEquals(sw.parseVersion!("v1.2.3"), "1.2.3"); }); Deno.test("millipds parseVersion rejects invalid tags", () => { const sw = getSoftwareConfig("millipds")!; assertEquals(sw.parseVersion!("0.0.5"), null); assertEquals(sw.parseVersion!("release-0.0.5"), null); }); Deno.test("cirrus parseVersion handles scoped tags", () => { const sw = getSoftwareConfig("cirrus")!; assertEquals(sw.parseVersion!("@getcirrus/pds@0.10.4"), "0.10.4"); assertEquals(sw.parseVersion!("@getcirrus/pds@1.0.0"), "1.0.0"); }); Deno.test("cirrus parseVersion rejects non-matching tags", () => { const sw = getSoftwareConfig("cirrus")!; assertEquals(sw.parseVersion!("v0.10.4"), null); assertEquals(sw.parseVersion!("0.10.4"), null); assertEquals(sw.parseVersion!("@getcirrus/other@0.10.4"), null); }); Deno.test("cocoon parseVersion handles valid tags", () => { const sw = getSoftwareConfig("cocoon")!; assertEquals(sw.parseVersion!("v0.8.5"), "0.8.5"); assertEquals(sw.parseVersion!("v2.0.0"), "2.0.0"); }); Deno.test("cocoon parseVersion rejects invalid tags", () => { const sw = getSoftwareConfig("cocoon")!; assertEquals(sw.parseVersion!("0.8.5"), null); assertEquals(sw.parseVersion!("cocoon-v0.8.5"), null); }); Deno.test("all registry entries have required fields", () => { for (const sw of PDS_SOFTWARE_REGISTRY) { assertEquals(typeof sw.id, "string"); assertEquals(sw.id.length > 0, true); assertEquals(typeof sw.displayName, "string"); assertEquals(typeof sw.projectUrl, "string"); assertEquals(sw.projectUrl.startsWith("http"), true); } });