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 "getProjectsLocationsRepositories on a missing repository 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.getProjectsLocationsRepositories({
19 name: `projects/${project}/locations/us-central1/repositories/alchemy-missing-repo`,
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 repository",
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.Repository("Analytics", {
38 location: "us-central1",
39 displayName: "analytics-repo",
40 labels: { env: "test" },
41 });
42 }),
43 );
44
45 expect(created.name).toContain("/repositories/");
46 expect(created.location).toEqual("us-central1");
47 expect(created.displayName).toEqual("analytics-repo");
48 expect(created.labels).toMatchObject({ env: "test" });
49
50 const fetched = yield* dataform.getProjectsLocationsRepositories({
51 name: created.name,
52 });
53 expect(fetched.name).toEqual(created.name);
54 expect(fetched.displayName).toEqual("analytics-repo");
55 expect(fetched.labels?.env).toEqual("test");
56 expect(fetched.labels?.["alchemy-id"]).toEqual(expect.any(String));
57
58 const updated = yield* stack.deploy(
59 Effect.gen(function* () {
60 return yield* GCP.Dataform.Repository("Analytics", {
61 repositoryId: created.repositoryId,
62 location: "us-central1",
63 displayName: "analytics-repo-v2",
64 labels: { env: "prod", role: "dataform" },
65 });
66 }),
67 );
68
69 expect(updated.name).toEqual(created.name);
70 expect(updated.displayName).toEqual("analytics-repo-v2");
71 expect(updated.labels).toMatchObject({ env: "prod", role: "dataform" });
72
73 yield* stack.destroy();
74 const gone = yield* waitUntilGone(
75 dataform.getProjectsLocationsRepositories({ name: created.name }),
76 );
77 expect(gone).toEqual("gone");
78 }).pipe(logLevel),
79 { tags: ["provider:gcp", "provider:gcp:dataform", "live"], timeout: 90_000 },
80);