1import * as GCP from "@/GCP";
2import * as Test from "@/Test/Alchemy";
3import * as datamigration from "@distilled.cloud/gcp/datamigration_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 "getProjectsLocationsConversionWorkspaces on a missing workspace fails with a typed tag",
12 (stack) =>
13 Effect.gen(function* () {
14 const project = yield* currentProject;
15
16 yield* stack.destroy();
17
18 const error = yield* Effect.flip(
19 datamigration.getProjectsLocationsConversionWorkspaces({
20 name: `projects/${project}/locations/us-central1/conversionWorkspaces/alchemy-missing-workspace`,
21 }),
22 );
23 expect(error._tag).toEqual("NotFound");
24
25 yield* stack.destroy();
26 }).pipe(logLevel),
27 {
28 tags: ["provider:gcp", "provider:gcp:datamigration", "live"],
29 timeout: 90_000,
30 },
31);
32
33test.provider(
34 "create, update, and delete a conversion workspace",
35 (stack) =>
36 Effect.gen(function* () {
37 const project = yield* currentProject;
38
39 yield* stack.destroy();
40
41 const created = yield* stack.deploy(
42 Effect.gen(function* () {
43 return yield* GCP.DataMigration.ConversionWorkspace("OracleToPg", {
44 location: "us-central1",
45 displayName: "oracle-to-pg",
46 source: { engine: "ORACLE", version: "11" },
47 destination: { engine: "POSTGRESQL", version: "14" },
48 globalSettings: { skip_triggers: "false" },
49 });
50 }),
51 );
52
53 expect(created.conversionWorkspaceId).toEqual(expect.any(String));
54 expect(created.name).toEqual(
55 `projects/${project}/locations/us-central1/conversionWorkspaces/${created.conversionWorkspaceId}`,
56 );
57 expect(created.location).toEqual("us-central1");
58 expect(created.displayName).toEqual("oracle-to-pg");
59 expect(created.source?.engine).toEqual("ORACLE");
60 expect(created.destination?.engine).toEqual("POSTGRESQL");
61 expect(created.globalSettings).toMatchObject({ skip_triggers: "false" });
62
63 const fetched =
64 yield* datamigration.getProjectsLocationsConversionWorkspaces({
65 name: created.name,
66 });
67 expect(fetched.name).toEqual(created.name);
68 expect(fetched.displayName).toMatch(/^\[(alchemy|alc) /);
69 expect(fetched.displayName).toContain("oracle-to-pg");
70 expect(fetched.source?.engine).toEqual("ORACLE");
71 expect(fetched.destination?.version).toEqual("14");
72
73 const updated = yield* stack.deploy(
74 Effect.gen(function* () {
75 return yield* GCP.DataMigration.ConversionWorkspace("OracleToPg", {
76 conversionWorkspaceId: created.conversionWorkspaceId,
77 location: "us-central1",
78 displayName: "oracle-to-pg-v2",
79 source: { engine: "ORACLE", version: "11" },
80 destination: { engine: "POSTGRESQL", version: "14" },
81 globalSettings: { skip_triggers: "true" },
82 });
83 }),
84 );
85
86 expect(updated.name).toEqual(created.name);
87 expect(updated.displayName).toEqual("oracle-to-pg-v2");
88 expect(updated.globalSettings).toMatchObject({ skip_triggers: "true" });
89
90 const fetchedUpdate =
91 yield* datamigration.getProjectsLocationsConversionWorkspaces({
92 name: updated.name,
93 });
94 expect(fetchedUpdate.displayName).toContain("oracle-to-pg-v2");
95 expect(fetchedUpdate.globalSettings?.skip_triggers).toEqual("true");
96
97 yield* stack.destroy();
98 const gone = yield* waitUntilGone(
99 datamigration.getProjectsLocationsConversionWorkspaces({
100 name: created.name,
101 }),
102 );
103 expect(gone).toEqual("gone");
104 }).pipe(logLevel),
105 {
106 tags: ["provider:gcp", "provider:gcp:datamigration", "live"],
107 timeout: 90_000,
108 },
109);