1import * as GCP from "@/GCP";
2import * as Test from "@/Test/Alchemy";
3import * as translate from "@distilled.cloud/gcp/translate_v3";
4import { expect } from "alchemy-test";
5import * as Effect from "effect/Effect";
6import * as Schedule from "effect/Schedule";
7import { location, logLevel, currentParent } from "./common.ts";
8
9const { test } = Test.make({ providers: GCP.providers() });
10
11const waitUntilGone = (name: string) =>
12 translate.getProjectsLocationsAdaptiveMtDatasets({ name }).pipe(
13 Effect.as("found" as const),
14 Effect.catchTag("NotFound", () => Effect.succeed("gone" as const)),
15 Effect.repeat({
16 schedule: Schedule.spaced("1 second"),
17 until: (status) => status === "gone",
18 times: 10,
19 }),
20 );
21
22test.provider(
23 "getProjectsLocationsAdaptiveMtDatasets on a missing dataset fails with a typed tag",
24 (stack) =>
25 Effect.gen(function* () {
26 const parent = yield* currentParent;
27 yield* stack.destroy();
28
29 const error = yield* Effect.flip(
30 translate.getProjectsLocationsAdaptiveMtDatasets({
31 name: `${parent}/adaptiveMtDatasets/alchemy-missing-dataset`,
32 }),
33 );
34 expect(error._tag).toEqual("NotFound");
35
36 yield* stack.destroy();
37 }).pipe(logLevel),
38 { tags: ["provider:gcp", "provider:gcp:translate", "live"], timeout: 90_000 },
39);
40
41test.provider(
42 "create, update, and delete an Adaptive MT dataset",
43 (stack) =>
44 Effect.gen(function* () {
45 yield* stack.destroy();
46
47 const created = yield* stack.deploy(
48 Effect.gen(function* () {
49 return yield* GCP.Translate.AdaptiveMtDataset("EnEs", {
50 location,
51 sourceLanguageCode: "en",
52 targetLanguageCode: "es",
53 displayName: "enes",
54 });
55 }),
56 );
57
58 expect(created.datasetId).toEqual(expect.any(String));
59 expect(created.name).toContain("/adaptiveMtDatasets/");
60 expect(created.location).toEqual(location);
61 expect(created.sourceLanguageCode).toEqual("en");
62 expect(created.targetLanguageCode).toEqual("es");
63 expect(created.displayName).toEqual("enes");
64
65 const fetched = yield* translate.getProjectsLocationsAdaptiveMtDatasets({
66 name: created.name,
67 });
68 expect(fetched.name).toEqual(created.name);
69 expect(fetched.sourceLanguageCode).toEqual("en");
70 expect(fetched.targetLanguageCode).toEqual("es");
71 expect(fetched.displayName).toEqual("enes");
72
73 const updated = yield* stack.deploy(
74 Effect.gen(function* () {
75 return yield* GCP.Translate.AdaptiveMtDataset("EnEs", {
76 datasetId: created.datasetId,
77 location,
78 sourceLanguageCode: "en",
79 targetLanguageCode: "es",
80 displayName: "enes",
81 });
82 }),
83 );
84
85 expect(updated.name).toEqual(created.name);
86 expect(updated.sourceLanguageCode).toEqual("en");
87
88 yield* stack.destroy();
89 const gone = yield* waitUntilGone(created.name);
90 expect(gone).toEqual("gone");
91 }).pipe(logLevel),
92 { tags: ["provider:gcp", "provider:gcp:translate", "live"], timeout: 90_000 },
93);