1import {
2 isId,
3 resolveZoneId,
4 zoneNameCandidates,
5} from "@/Cloudflare/Zone/lookup.ts";
6import { Credentials } from "@distilled.cloud/cloudflare/Credentials";
7import { describe, expect, test } from "alchemy-test";
8import * as Effect from "effect/Effect";
9import * as HttpClient from "effect/http/HttpClient";
10
11describe(
12 "Cloudflare zone lookup",
13 {
14 tags: ["unit", "provider:cloudflare", "provider:cloudflare:zone", "local"],
15 },
16 () => {
17 const withoutCredentials = <A, E>(
18 effect: Effect.Effect<A, E, Credentials | HttpClient.HttpClient>,
19 ) =>
20 effect.pipe(
21 Effect.provideService(
22 Credentials,
23 Effect.die("explicit zone IDs must not resolve credentials"),
24 ),
25 Effect.provideService(
26 HttpClient.HttpClient,
27 HttpClient.make(() =>
28 Effect.die("explicit zone IDs must not list zones"),
29 ),
30 ),
31 Effect.runSync,
32 );
33
34 test("zoneNameCandidates walks hostname labels longest-first", () => {
35 expect(zoneNameCandidates("app.example.com")).toEqual([
36 "app.example.com",
37 "example.com",
38 ]);
39 expect(zoneNameCandidates("a.b.c.example.com")).toEqual([
40 "a.b.c.example.com",
41 "b.c.example.com",
42 "c.example.com",
43 "example.com",
44 ]);
45 expect(zoneNameCandidates("example.com")).toEqual(["example.com"]);
46 });
47
48 test("resolveZoneId returns an explicit zone id without listing zones", () => {
49 const zoneId = "0123456789abcdef0123456789abcdef";
50 expect(isId(zoneId)).toBe(true);
51 expect(
52 withoutCredentials(
53 resolveZoneId({
54 accountId: "account",
55 zone: zoneId,
56 hostname: "app.example.com",
57 }),
58 ),
59 ).toEqual(zoneId);
60 expect(
61 withoutCredentials(
62 resolveZoneId({
63 accountId: "account",
64 zone: { zoneId, name: "example.com" },
65 hostname: "app.example.com",
66 }),
67 ),
68 ).toEqual(zoneId);
69 });
70 },
71);