1import * as AWS from "@/AWS";
2import { ParameterGroup } from "@/AWS/DAX";
3import * as Test from "@/Test/Alchemy";
4import * as dax from "@distilled.cloud/aws/dax";
5import { expect } from "alchemy-test";
6import * as Effect from "effect/Effect";
7import * as Schedule from "effect/Schedule";
8
9const { test } = Test.make({ providers: AWS.providers() });
10
11// Ungated typed-error probe: prove the distilled error union carries the
12// not-found tag this provider's read/delete paths depend on.
13test.provider(
14 "describeParameterGroups on a nonexistent group fails with ParameterGroupNotFoundFault",
15 () =>
16 Effect.gen(function* () {
17 const error = yield* Effect.flip(
18 dax.describeParameterGroups({
19 ParameterGroupNames: ["alchemy-nonexistent-dax-params-probe"],
20 }),
21 );
22 expect(error._tag).toBe("ParameterGroupNotFoundFault");
23 }),
24 { tags: ["provider:aws", "provider:aws:dax", "live"] },
25);
26
27const readParameterValue = (groupName: string, parameterName: string) =>
28 dax
29 .describeParameters({ ParameterGroupName: groupName })
30 .pipe(
31 Effect.map(
32 (response) =>
33 (response.Parameters ?? []).find(
34 (p) => p.ParameterName === parameterName,
35 )?.ParameterValue,
36 ),
37 );
38
39const assertGone = (name: string) =>
40 dax.describeParameterGroups({ ParameterGroupNames: [name] }).pipe(
41 Effect.flatMap(() =>
42 Effect.fail(new Error(`parameter group '${name}' still exists`)),
43 ),
44 Effect.catchTag("ParameterGroupNotFoundFault", () => Effect.void),
45 Effect.retry({
46 schedule: Schedule.max([
47 Schedule.fixed("2 seconds"),
48 Schedule.recurs(10),
49 ]),
50 }),
51 );
52
53test.provider(
54 "create, update parameters, delete a DAX parameter group",
55 (stack) =>
56 Effect.gen(function* () {
57 yield* stack.destroy();
58
59 const { group } = yield* stack.deploy(
60 Effect.gen(function* () {
61 const group = yield* ParameterGroup("Params", {
62 description: "alchemy dax parameter group",
63 parameters: { "query-ttl-millis": "60000" },
64 });
65 return { group };
66 }),
67 );
68
69 expect(group.parameterGroupName).toBeDefined();
70 expect(group.parameters["query-ttl-millis"]).toBe("60000");
71
72 // Out-of-band verification via distilled.
73 const observedValue = yield* readParameterValue(
74 group.parameterGroupName,
75 "query-ttl-millis",
76 );
77 expect(observedValue).toBe("60000");
78
79 // Update a parameter value and add a second override in place.
80 const { group: updated } = yield* stack.deploy(
81 Effect.gen(function* () {
82 const group = yield* ParameterGroup("Params", {
83 description: "alchemy dax parameter group",
84 parameters: {
85 "query-ttl-millis": "120000",
86 "record-ttl-millis": "300000",
87 },
88 });
89 return { group };
90 }),
91 );
92 expect(updated.parameterGroupName).toBe(group.parameterGroupName);
93 expect(updated.parameters["query-ttl-millis"]).toBe("120000");
94 expect(updated.parameters["record-ttl-millis"]).toBe("300000");
95
96 const requeried = yield* readParameterValue(
97 group.parameterGroupName,
98 "query-ttl-millis",
99 );
100 expect(requeried).toBe("120000");
101
102 yield* stack.destroy();
103 yield* assertGone(group.parameterGroupName);
104 }),
105 { tags: ["provider:aws", "provider:aws:dax", "live"], timeout: 240_000 },
106);