1import * as GCP from "@/GCP";
2import * as Test from "@/Test/Alchemy";
3import * as datalabeling from "@distilled.cloud/gcp/datalabeling_v1beta1";
4import { expect } from "alchemy-test";
5import * as Effect from "effect/Effect";
6import {
7 logLevel,
8 probe,
9 currentProject,
10 runLifecycle,
11 waitUntilGone,
12} from "./common.ts";
13
14const { test } = Test.make({ providers: GCP.providers() });
15
16test.provider(
17 "getProjectsDatasetsAnnotatedDatasetsFeedbackThreadsFeedbackMessages on a missing message fails with a typed tag",
18 (stack) =>
19 Effect.gen(function* () {
20 const project = yield* currentProject;
21 yield* stack.destroy();
22
23 const error = yield* Effect.flip(
24 probe(
25 datalabeling.getProjectsDatasetsAnnotatedDatasetsFeedbackThreadsFeedbackMessages(
26 {
27 name: `projects/${project}/datasets/missing/annotatedDatasets/missing/feedbackThreads/missing/feedbackMessages/alchemy-missing`,
28 },
29 ),
30 ),
31 );
32 expect(error._tag).toEqual("NotFound");
33
34 yield* stack.destroy();
35 }).pipe(logLevel),
36 {
37 tags: ["provider:gcp", "provider:gcp:datalabeling", "live"],
38 timeout: 90_000,
39 },
40);
41
42test.provider.skipIf(!runLifecycle)(
43 "create, replace, and delete a feedback message",
44 (stack) =>
45 Effect.gen(function* () {
46 const project = yield* currentProject;
47 yield* stack.destroy();
48
49 const threadParent = `projects/${project}/datasets/missing/annotatedDatasets/missing/feedbackThreads/missing`;
50
51 const created = yield* stack.deploy(
52 Effect.gen(function* () {
53 return yield* GCP.DataLabeling.DatasetsAnnotatedDatasetsFeedbackThreadsFeedbackMessage(
54 "Note",
55 {
56 parent: threadParent,
57 body: "please relabel the occluded boxes",
58 },
59 );
60 }),
61 );
62
63 expect(created.name).toContain("/feedback");
64 expect(created.body).toEqual("please relabel the occluded boxes");
65
66 const fetched =
67 yield* datalabeling.getProjectsDatasetsAnnotatedDatasetsFeedbackThreadsFeedbackMessages(
68 { name: created.name },
69 );
70 expect(fetched.name).toEqual(created.name);
71 expect(fetched.body).toContain("alchemy-id=");
72
73 const updated = yield* stack.deploy(
74 Effect.gen(function* () {
75 return yield* GCP.DataLabeling.DatasetsAnnotatedDatasetsFeedbackThreadsFeedbackMessage(
76 "Note",
77 {
78 parent: created.parent,
79 feedbackMessageId: created.feedbackMessageId,
80 body: "updated relabel note",
81 },
82 );
83 }),
84 );
85
86 expect(updated.body).toEqual("updated relabel note");
87
88 yield* stack.destroy();
89 const gone = yield* waitUntilGone(
90 datalabeling.getProjectsDatasetsAnnotatedDatasetsFeedbackThreadsFeedbackMessages(
91 { name: updated.name },
92 ),
93 );
94 expect(gone).toEqual("gone");
95 }).pipe(logLevel),
96 {
97 tags: ["provider:gcp", "provider:gcp:datalabeling", "live"],
98 timeout: 90_000,
99 },
100);