1import * as AWS from "@/AWS";
2import { PublicDnsNamespace } from "@/AWS/CloudMap";
3import * as Test from "@/Test/Alchemy";
4import * as sd from "@distilled.cloud/aws/servicediscovery";
5import { expect } from "alchemy-test";
6import * as Effect from "effect/Effect";
7
8const { test } = Test.make({ providers: AWS.providers() });
9
10// A public DNS namespace creates a real Route 53 public hosted zone (billed
11// while it exists, and only useful with a domain you control), so the live
12// lifecycle is opt-in.
13test.provider.skipIf(!process.env.AWS_TEST_CLOUDMAP_PUBLIC)(
14 "create and delete public DNS namespace",
15 (stack) =>
16 Effect.gen(function* () {
17 yield* stack.destroy();
18
19 const namespace = yield* stack.deploy(
20 Effect.gen(function* () {
21 return yield* PublicDnsNamespace("TestPublicNamespace", {
22 name: "alchemy-test-cloudmap.us",
23 description: "public discovery test",
24 });
25 }),
26 );
27
28 expect(namespace.namespaceId).toBeDefined();
29 expect(namespace.hostedZoneId).toBeDefined();
30
31 const created = yield* sd
32 .getNamespace({ Id: namespace.namespaceId })
33 .pipe(Effect.map((r) => r.Namespace));
34 expect(created?.Type).toBe("DNS_PUBLIC");
35
36 yield* stack.destroy();
37 const gone = yield* sd.getNamespace({ Id: namespace.namespaceId }).pipe(
38 Effect.map(() => false),
39 Effect.catchTag("NamespaceNotFound", () => Effect.succeed(true)),
40 );
41 expect(gone).toBe(true);
42 }),
43 { tags: ["provider:aws", "provider:aws:cloudmap", "live"], timeout: 240_000 },
44);