/* RFC-1325: pin the single site-host classification contract — workers.dev predicate normalization, channelHost derivation, workersDevHost builder. PIN/protection behavior — access-protection.test.ts owns that. RFC-1325: initial — predicate/classifier/builder coverage. RFC-1325: provisional workers.dev as first-class site host Single host predicate module in werkstatt-shared; provisional registration derives dev/alt/main workers.dev channels from the account subdomain; first dev deploy auto-protects provisional hosts; provisional main responses carry noindex; dns-aid skips provisional sites; site.domain.adopt cuts over to a custom domain. */ import { describe, expect, test } from "vitest"; import { channelHost, isDevOrAltHost, isProvisionalHost, siteHostKind, workersDevHost, } from "../site-host.ts"; describe("site-host (RFC-1325)", () => { describe("isProvisionalHost", () => { test.each([ "dp7.syrokomskyi.workers.dev", "https://dp7.syrokomskyi.workers.dev", "https://dp7.syrokomskyi.workers.dev/path/page", "dev-dp7.syrokomskyi.workers.dev", "DP7.SYROKOMSKYI.WORKERS.DEV", "workers.dev", ])("provisional: %s", (host) => { expect(isProvisionalHost(host)).toBe(true); }); test.each([ "dp7.example.com", "dev.dp7.example.com", "https://dp7.example.com", "workers.dev.evil.example.com", "myworkers.dev", "", ])("custom: %s", (host) => { expect(isProvisionalHost(host)).toBe(false); }); test("undefined is not provisional", () => { expect(isProvisionalHost(undefined)).toBe(false); }); }); describe("siteHostKind", () => { test("workers.dev suffix → provisional; everything else → custom-domain", () => { expect(siteHostKind("a.b.workers.dev")).toBe("provisional-workers-dev"); expect(siteHostKind("example.com")).toBe("custom-domain"); }); }); describe("channelHost", () => { test("custom-domain follows the dev./alt. prefix convention", () => { expect(channelHost("custom-domain", "example.com", "dev", "x")).toBe("dev.example.com"); expect(channelHost("custom-domain", "example.com", "alt", "x")).toBe("alt.example.com"); expect(channelHost("custom-domain", "example.com", "main", "x")).toBe("example.com"); }); test("provisional host maps to the channel worker name on the account subdomain", () => { expect( channelHost("provisional-workers-dev", "dp7.syrokomskyi.workers.dev", "dev", "dev-dp7"), ).toBe("dev-dp7.syrokomskyi.workers.dev"); expect( channelHost("provisional-workers-dev", "dp7.syrokomskyi.workers.dev", "main", "dp7"), ).toBe("dp7.syrokomskyi.workers.dev"); }); }); describe("workersDevHost", () => { test("builds ..workers.dev", () => { expect(workersDevHost("dp7", "syrokomskyi")).toBe("dp7.syrokomskyi.workers.dev"); expect(workersDevHost("dev-dp7", "syrokomskyi")).toBe("dev-dp7.syrokomskyi.workers.dev"); }); }); describe("isDevOrAltHost", () => { test.each(["dev.example.com", "alt.example.com", "dev-dp7.acct.workers.dev"])( "dev/alt: %s", (host) => { expect(isDevOrAltHost(host)).toBe(true); }, ); test.each(["example.com", "dp7.acct.workers.dev", "adept.example.com"])( "not dev/alt: %s", (host) => { expect(isDevOrAltHost(host)).toBe(false); }, ); }); });