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 "getProjectsLocationsRepositoriesReleaseConfigs on a missing config 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.getProjectsLocationsRepositoriesReleaseConfigs({
19 name: `projects/${project}/locations/us-central1/repositories/missing/releaseConfigs/alchemy-missing`,
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 release config",
31 (stack) =>
32 Effect.gen(function* () {
33 yield* stack.destroy();
34
35 const created = yield* stack.deploy(
36 Effect.gen(function* () {
37 const repo = yield* GCP.Dataform.Repository("ReleaseRepo", {
38 location: "us-central1",
39 displayName: "release-repo",
40 labels: { env: "test" },
41 serviceAccount:
42 "alchemy-testing@alchemy-gcp-testing-83661.iam.gserviceaccount.com",
43 });
44 const release = yield* GCP.Dataform.RepositoriesReleaseConfig(
45 "Prod",
46 {
47 repository: repo.name,
48 gitCommitish: "main",
49 disabled: true,
50 },
51 );
52 return { repo, release };
53 }),
54 );
55
56 expect(created.release.name).toContain("/releaseConfigs/");
57 expect(created.release.gitCommitish).toEqual("main");
58 expect(created.release.disabled).toEqual(true);
59 expect(created.release.vars).toMatchObject({});
60
61 const fetched =
62 yield* dataform.getProjectsLocationsRepositoriesReleaseConfigs({
63 name: created.release.name,
64 });
65 expect(fetched.name).toEqual(created.release.name);
66 expect(fetched.gitCommitish).toEqual("main");
67 expect(fetched.codeCompilationConfig?.vars?.["alchemy-id"]).toEqual(
68 expect.any(String),
69 );
70
71 const updated = yield* stack.deploy(
72 Effect.gen(function* () {
73 const repo = yield* GCP.Dataform.Repository("ReleaseRepo", {
74 repositoryId: created.repo.repositoryId,
75 location: "us-central1",
76 displayName: "release-repo",
77 labels: { env: "test" },
78 serviceAccount:
79 "alchemy-testing@alchemy-gcp-testing-83661.iam.gserviceaccount.com",
80 });
81 const release = yield* GCP.Dataform.RepositoriesReleaseConfig(
82 "Prod",
83 {
84 repository: repo.name,
85 releaseConfigId: created.release.releaseConfigId,
86 gitCommitish: "main",
87 disabled: true,
88 timeZone: "UTC",
89 },
90 );
91 return { repo, release };
92 }),
93 );
94
95 expect(updated.release.name).toEqual(created.release.name);
96 expect(updated.release.timeZone).toEqual("UTC");
97
98 yield* stack.destroy();
99 const gone = yield* waitUntilGone(
100 dataform.getProjectsLocationsRepositoriesReleaseConfigs({
101 name: created.release.name,
102 }),
103 );
104 expect(gone).toEqual("gone");
105 }).pipe(logLevel),
106 { tags: ["provider:gcp", "provider:gcp:dataform", "live"], timeout: 120_000 },
107);