1import * as AWS from "@/AWS";
2import { Keyspace } from "@/AWS/Keyspaces";
3import * as Test from "@/Test/Alchemy";
4import * as keyspaces from "@distilled.cloud/aws/keyspaces";
5import { expect } from "alchemy-test";
6import * as Effect from "effect/Effect";
7
8const { test } = Test.make({ providers: AWS.providers() });
9
10const getKeyspace = (name: string) =>
11 keyspaces
12 .getKeyspace({ keyspaceName: name })
13 .pipe(
14 Effect.catchTag("ResourceNotFoundException", () =>
15 Effect.succeed(undefined),
16 ),
17 );
18
19const getTags = (arn: string) =>
20 keyspaces
21 .listTagsForResource({ resourceArn: arn })
22 .pipe(Effect.map((r) => r.tags ?? []));
23
24test.provider(
25 "create, update tags, delete Keyspaces keyspace",
26 (stack) =>
27 Effect.gen(function* () {
28 yield* stack.destroy();
29
30 // create
31 const created = yield* stack.deploy(
32 Effect.gen(function* () {
33 return yield* Keyspace("AppData", {
34 keyspaceName: "alchemy_ks_test",
35 tags: { team: "platform" },
36 });
37 }),
38 );
39
40 expect(created.keyspaceName).toEqual("alchemy_ks_test");
41 expect(created.keyspaceArn).toContain("keyspace/alchemy_ks_test");
42
43 // out-of-band verification
44 const observed = yield* getKeyspace(created.keyspaceName);
45 expect(observed?.keyspaceName).toEqual("alchemy_ks_test");
46
47 const tags = yield* getTags(created.keyspaceArn);
48 const tagMap = Object.fromEntries(tags.map((t) => [t.key, t.value]));
49 expect(tagMap.team).toEqual("platform");
50 expect(tagMap["alchemy::id"]).toBeDefined();
51
52 // update tags
53 yield* stack.deploy(
54 Effect.gen(function* () {
55 return yield* Keyspace("AppData", {
56 keyspaceName: "alchemy_ks_test",
57 tags: { team: "data" },
58 });
59 }),
60 );
61 const reTags = yield* getTags(created.keyspaceArn);
62 const reMap = Object.fromEntries(reTags.map((t) => [t.key, t.value]));
63 expect(reMap.team).toEqual("data");
64
65 // delete
66 yield* stack.destroy();
67 const gone = yield* getKeyspace(created.keyspaceName);
68 expect(gone).toBeUndefined();
69 }),
70 {
71 tags: ["provider:aws", "provider:aws:keyspaces", "live"],
72 timeout: 180_000,
73 },
74);