1import * as GCP from "@/GCP";
2import * as Test from "@/Test/Alchemy";
3import * as dataform from "@distilled.cloud/gcp/dataform_v1";
4import { expect } from "alchemy-test";
5import * as Effect from "effect/Effect";
6import { logLevel, currentProject, waitUntilGone } from "./common.ts";
7
8const { test } = Test.make({ providers: GCP.providers() });
9
10test.provider(
11 "getProjectsLocationsFolders on a missing folder fails with a typed tag",
12 (stack) =>
13 Effect.gen(function* () {
14 const project = yield* currentProject;
15 yield* stack.destroy();
16
17 const error = yield* Effect.flip(
18 dataform.getProjectsLocationsFolders({
19 name: `projects/${project}/locations/us-central1/folders/alchemy-missing-folder`,
20 }),
21 );
22 expect(error._tag).toEqual("NotFound");
23
24 yield* stack.destroy();
25 }).pipe(logLevel),
26 { tags: ["provider:gcp", "provider:gcp:dataform", "live"], timeout: 90_000 },
27);
28
29test.provider(
30 "create, update, and delete a dataform folder",
31 (stack) =>
32 Effect.gen(function* () {
33 yield* stack.destroy();
34
35 const created = yield* stack.deploy(
36 Effect.gen(function* () {
37 return yield* GCP.Dataform.ProjectsLocationsFolder("Analytics", {
38 location: "us-central1",
39 displayName: "analytics",
40 });
41 }),
42 );
43
44 expect(created.name).toContain("/folders/");
45 expect(created.location).toEqual("us-central1");
46 expect(created.displayName).toEqual("analytics");
47
48 const fetched = yield* dataform.getProjectsLocationsFolders({
49 name: created.name,
50 });
51 expect(fetched.name).toEqual(created.name);
52 expect(fetched.displayName).toContain("analytics");
53 expect(fetched.displayName).toMatch(/\[alc(hemy)? /);
54
55 const updated = yield* stack.deploy(
56 Effect.gen(function* () {
57 return yield* GCP.Dataform.ProjectsLocationsFolder("Analytics", {
58 location: "us-central1",
59 displayName: "analytics-v2",
60 });
61 }),
62 );
63
64 expect(updated.name).toEqual(created.name);
65 expect(updated.displayName).toEqual("analytics-v2");
66
67 const fetchedUpdate = yield* dataform.getProjectsLocationsFolders({
68 name: updated.name,
69 });
70 expect(fetchedUpdate.displayName).toContain("analytics-v2");
71
72 yield* stack.destroy();
73 const gone = yield* waitUntilGone(
74 dataform.getProjectsLocationsFolders({ name: created.name }),
75 );
76 expect(gone).toEqual("gone");
77 }).pipe(logLevel),
78 { tags: ["provider:gcp", "provider:gcp:dataform", "live"], timeout: 90_000 },
79);