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 "getProjectsLocationsTeamFolders on a missing team 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.getProjectsLocationsTeamFolders({
19 name: `projects/${project}/locations/us-central1/teamFolders/alchemy-missing-team`,
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 team 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.Team("Analytics", {
38 location: "us-central1",
39 displayName: "analytics-team",
40 });
41 }),
42 );
43
44 expect(created.name).toContain("/teamFolders/");
45 expect(created.location).toEqual("us-central1");
46 expect(created.displayName).toEqual("analytics-team");
47
48 const fetched = yield* dataform.getProjectsLocationsTeamFolders({
49 name: created.name,
50 });
51 expect(fetched.name).toEqual(created.name);
52 expect(fetched.displayName).toContain("analytics-team");
53 expect(fetched.displayName).toMatch(/\[alc(hemy)? /);
54
55 const updated = yield* stack.deploy(
56 Effect.gen(function* () {
57 return yield* GCP.Dataform.Team("Analytics", {
58 location: "us-central1",
59 displayName: "analytics-team-v2",
60 });
61 }),
62 );
63
64 expect(updated.name).toEqual(created.name);
65 expect(updated.displayName).toEqual("analytics-team-v2");
66
67 yield* stack.destroy();
68 const gone = yield* waitUntilGone(
69 dataform.getProjectsLocationsTeamFolders({ name: created.name }),
70 );
71 expect(gone).toEqual("gone");
72 }).pipe(logLevel),
73 { tags: ["provider:gcp", "provider:gcp:dataform", "live"], timeout: 90_000 },
74);