@temporal-contract/client 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +259 -102
- package/dist/index.d.cts +115 -99
- package/dist/index.d.mts +115 -99
- package/dist/index.mjs +236 -103
- package/package.json +26 -20
- package/.turbo/turbo-build.log +0 -17
- package/CHANGELOG.md +0 -9
- package/src/client.spec.ts +0 -564
- package/src/client.ts +0 -366
- package/src/errors.ts +0 -91
- package/src/index.ts +0 -9
- package/tsconfig.json +0 -9
- package/vitest.config.ts +0 -12
package/src/client.spec.ts
DELETED
|
@@ -1,564 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
import { defineContract } from "@temporal-contract/contract";
|
|
4
|
-
import { TypedClient } from "./client.js";
|
|
5
|
-
import {
|
|
6
|
-
WorkflowNotFoundError,
|
|
7
|
-
WorkflowValidationError,
|
|
8
|
-
QueryValidationError,
|
|
9
|
-
SignalValidationError,
|
|
10
|
-
UpdateValidationError,
|
|
11
|
-
} from "./errors.js";
|
|
12
|
-
|
|
13
|
-
// Create mock workflow object
|
|
14
|
-
const createMockWorkflow = () => ({
|
|
15
|
-
start: vi.fn(),
|
|
16
|
-
execute: vi.fn(),
|
|
17
|
-
getHandle: vi.fn(),
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
// Mock Temporal Client
|
|
21
|
-
const mockWorkflow = createMockWorkflow();
|
|
22
|
-
|
|
23
|
-
vi.mock("@temporalio/client", () => ({
|
|
24
|
-
Client: class {
|
|
25
|
-
workflow = mockWorkflow;
|
|
26
|
-
},
|
|
27
|
-
WorkflowHandle: vi.fn(),
|
|
28
|
-
}));
|
|
29
|
-
|
|
30
|
-
describe("TypedClient", () => {
|
|
31
|
-
const testContract = defineContract({
|
|
32
|
-
taskQueue: "test-queue",
|
|
33
|
-
workflows: {
|
|
34
|
-
testWorkflow: {
|
|
35
|
-
input: z.tuple([z.string(), z.number()]),
|
|
36
|
-
output: z.object({ result: z.string() }),
|
|
37
|
-
queries: {
|
|
38
|
-
getStatus: {
|
|
39
|
-
input: z.tuple([]),
|
|
40
|
-
output: z.string(),
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
signals: {
|
|
44
|
-
updateProgress: {
|
|
45
|
-
input: z.tuple([z.number()]),
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
updates: {
|
|
49
|
-
setConfig: {
|
|
50
|
-
input: z.tuple([z.object({ value: z.string() })]),
|
|
51
|
-
output: z.boolean(),
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
simpleWorkflow: {
|
|
56
|
-
input: z.tuple([z.string()]),
|
|
57
|
-
output: z.string(),
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
let typedClient: TypedClient<typeof testContract>;
|
|
63
|
-
|
|
64
|
-
beforeEach(() => {
|
|
65
|
-
vi.clearAllMocks();
|
|
66
|
-
typedClient = TypedClient.create(testContract, { namespace: "default" });
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
describe("TypedClient.create", () => {
|
|
70
|
-
it("should create a typed client instance", () => {
|
|
71
|
-
expect(typedClient).toBeInstanceOf(TypedClient);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
describe("startWorkflow", () => {
|
|
76
|
-
it("should start a workflow with valid input", async () => {
|
|
77
|
-
const mockHandle = {
|
|
78
|
-
workflowId: "test-123",
|
|
79
|
-
result: vi.fn().mockResolvedValue({ result: "success" }),
|
|
80
|
-
query: vi.fn(),
|
|
81
|
-
signal: vi.fn(),
|
|
82
|
-
executeUpdate: vi.fn(),
|
|
83
|
-
terminate: vi.fn(),
|
|
84
|
-
cancel: vi.fn(),
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
mockWorkflow.start.mockResolvedValue(mockHandle);
|
|
88
|
-
|
|
89
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
90
|
-
workflowId: "test-123",
|
|
91
|
-
args: ["hello", 42],
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
expect(mockWorkflow.start).toHaveBeenCalledWith("testWorkflow", {
|
|
95
|
-
workflowId: "test-123",
|
|
96
|
-
taskQueue: "test-queue",
|
|
97
|
-
args: [["hello", 42]],
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
expect(handle.workflowId).toBe("test-123");
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it("should throw WorkflowNotFoundError for unknown workflow", async () => {
|
|
104
|
-
await expect(
|
|
105
|
-
// @ts-expect-error Testing invalid workflow name
|
|
106
|
-
typedClient.startWorkflow("unknownWorkflow", {
|
|
107
|
-
workflowId: "test-123",
|
|
108
|
-
args: ["test"],
|
|
109
|
-
}),
|
|
110
|
-
).rejects.toThrow(WorkflowNotFoundError);
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it("should throw WorkflowValidationError for invalid input", async () => {
|
|
114
|
-
await expect(
|
|
115
|
-
typedClient.startWorkflow("testWorkflow", {
|
|
116
|
-
workflowId: "test-123",
|
|
117
|
-
// @ts-expect-error Testing invalid input
|
|
118
|
-
args: ["hello", "not-a-number"],
|
|
119
|
-
}),
|
|
120
|
-
).rejects.toThrow(WorkflowValidationError);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it("should pass Temporal options to underlying client", async () => {
|
|
124
|
-
const mockHandle = {
|
|
125
|
-
workflowId: "test-123",
|
|
126
|
-
result: vi.fn().mockResolvedValue({ result: "success" }),
|
|
127
|
-
query: vi.fn(),
|
|
128
|
-
signal: vi.fn(),
|
|
129
|
-
executeUpdate: vi.fn(),
|
|
130
|
-
terminate: vi.fn(),
|
|
131
|
-
cancel: vi.fn(),
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
mockWorkflow.start.mockResolvedValue(mockHandle);
|
|
135
|
-
|
|
136
|
-
await typedClient.startWorkflow("testWorkflow", {
|
|
137
|
-
workflowId: "test-123",
|
|
138
|
-
args: ["hello", 42],
|
|
139
|
-
workflowExecutionTimeout: "1 day",
|
|
140
|
-
retry: { maximumAttempts: 3 },
|
|
141
|
-
memo: { userId: "user-123" },
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
expect(mockWorkflow.start).toHaveBeenCalledWith("testWorkflow", {
|
|
145
|
-
workflowId: "test-123",
|
|
146
|
-
taskQueue: "test-queue",
|
|
147
|
-
args: [["hello", 42]],
|
|
148
|
-
workflowExecutionTimeout: "1 day",
|
|
149
|
-
retry: { maximumAttempts: 3 },
|
|
150
|
-
memo: { userId: "user-123" },
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
describe("executeWorkflow", () => {
|
|
156
|
-
it("should execute a workflow with valid input and output", async () => {
|
|
157
|
-
mockWorkflow.execute.mockResolvedValue({ result: "success" });
|
|
158
|
-
|
|
159
|
-
const result = await typedClient.executeWorkflow("testWorkflow", {
|
|
160
|
-
workflowId: "test-123",
|
|
161
|
-
args: ["hello", 42],
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
expect(mockWorkflow.execute).toHaveBeenCalledWith("testWorkflow", {
|
|
165
|
-
workflowId: "test-123",
|
|
166
|
-
taskQueue: "test-queue",
|
|
167
|
-
args: [["hello", 42]],
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
expect(result).toEqual({ result: "success" });
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it("should throw WorkflowNotFoundError for unknown workflow", async () => {
|
|
174
|
-
await expect(
|
|
175
|
-
// @ts-expect-error Testing invalid workflow name
|
|
176
|
-
typedClient.executeWorkflow("unknownWorkflow", {
|
|
177
|
-
workflowId: "test-123",
|
|
178
|
-
args: ["test"],
|
|
179
|
-
}),
|
|
180
|
-
).rejects.toThrow(WorkflowNotFoundError);
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
it("should throw WorkflowValidationError for invalid input", async () => {
|
|
184
|
-
await expect(
|
|
185
|
-
typedClient.executeWorkflow("testWorkflow", {
|
|
186
|
-
workflowId: "test-123",
|
|
187
|
-
// @ts-expect-error Testing invalid input
|
|
188
|
-
args: ["hello", "not-a-number"],
|
|
189
|
-
}),
|
|
190
|
-
).rejects.toThrow(WorkflowValidationError);
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
it("should throw WorkflowValidationError for invalid output", async () => {
|
|
194
|
-
mockWorkflow.execute.mockResolvedValue({ wrongField: "value" });
|
|
195
|
-
|
|
196
|
-
await expect(
|
|
197
|
-
typedClient.executeWorkflow("testWorkflow", {
|
|
198
|
-
workflowId: "test-123",
|
|
199
|
-
args: ["hello", 42],
|
|
200
|
-
}),
|
|
201
|
-
).rejects.toThrow(WorkflowValidationError);
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
it("should pass Temporal options to underlying client", async () => {
|
|
205
|
-
mockWorkflow.execute.mockResolvedValue({ result: "success" });
|
|
206
|
-
|
|
207
|
-
await typedClient.executeWorkflow("testWorkflow", {
|
|
208
|
-
workflowId: "test-123",
|
|
209
|
-
args: ["hello", 42],
|
|
210
|
-
workflowExecutionTimeout: "1 day",
|
|
211
|
-
cronSchedule: "0 0 * * *",
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
expect(mockWorkflow.execute).toHaveBeenCalledWith("testWorkflow", {
|
|
215
|
-
workflowId: "test-123",
|
|
216
|
-
taskQueue: "test-queue",
|
|
217
|
-
args: [["hello", 42]],
|
|
218
|
-
workflowExecutionTimeout: "1 day",
|
|
219
|
-
cronSchedule: "0 0 * * *",
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
describe("getHandle", () => {
|
|
225
|
-
it("should get a handle to an existing workflow", async () => {
|
|
226
|
-
const mockHandle = {
|
|
227
|
-
workflowId: "test-123",
|
|
228
|
-
result: vi.fn().mockResolvedValue({ result: "success" }),
|
|
229
|
-
query: vi.fn(),
|
|
230
|
-
signal: vi.fn(),
|
|
231
|
-
executeUpdate: vi.fn(),
|
|
232
|
-
terminate: vi.fn(),
|
|
233
|
-
cancel: vi.fn(),
|
|
234
|
-
};
|
|
235
|
-
|
|
236
|
-
mockWorkflow.getHandle.mockReturnValue(mockHandle);
|
|
237
|
-
|
|
238
|
-
const handle = await typedClient.getHandle("testWorkflow", "test-123");
|
|
239
|
-
|
|
240
|
-
expect(mockWorkflow.getHandle).toHaveBeenCalledWith("test-123");
|
|
241
|
-
expect(handle.workflowId).toBe("test-123");
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
it("should throw WorkflowNotFoundError for unknown workflow", async () => {
|
|
245
|
-
await expect(
|
|
246
|
-
// @ts-expect-error Testing invalid workflow name
|
|
247
|
-
typedClient.getHandle("unknownWorkflow", "test-123"),
|
|
248
|
-
).rejects.toThrow(WorkflowNotFoundError);
|
|
249
|
-
});
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
describe("TypedWorkflowHandle", () => {
|
|
253
|
-
let mockHandle: {
|
|
254
|
-
workflowId: string;
|
|
255
|
-
result: ReturnType<typeof vi.fn>;
|
|
256
|
-
query: ReturnType<typeof vi.fn>;
|
|
257
|
-
signal: ReturnType<typeof vi.fn>;
|
|
258
|
-
executeUpdate: ReturnType<typeof vi.fn>;
|
|
259
|
-
terminate: ReturnType<typeof vi.fn>;
|
|
260
|
-
cancel: ReturnType<typeof vi.fn>;
|
|
261
|
-
describe?: ReturnType<typeof vi.fn>;
|
|
262
|
-
fetchHistory?: ReturnType<typeof vi.fn>;
|
|
263
|
-
};
|
|
264
|
-
|
|
265
|
-
beforeEach(async () => {
|
|
266
|
-
mockHandle = {
|
|
267
|
-
workflowId: "test-123",
|
|
268
|
-
result: vi.fn().mockResolvedValue({ result: "success" }),
|
|
269
|
-
query: vi.fn(),
|
|
270
|
-
signal: vi.fn(),
|
|
271
|
-
executeUpdate: vi.fn(),
|
|
272
|
-
terminate: vi.fn(),
|
|
273
|
-
cancel: vi.fn(),
|
|
274
|
-
describe: vi.fn(),
|
|
275
|
-
fetchHistory: vi.fn(),
|
|
276
|
-
};
|
|
277
|
-
|
|
278
|
-
mockWorkflow.start.mockResolvedValue(mockHandle);
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
describe("result", () => {
|
|
282
|
-
it("should return validated workflow result", async () => {
|
|
283
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
284
|
-
workflowId: "test-123",
|
|
285
|
-
args: ["hello", 42],
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
const result = await handle.result();
|
|
289
|
-
|
|
290
|
-
expect(mockHandle.result).toHaveBeenCalled();
|
|
291
|
-
expect(result).toEqual({ result: "success" });
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
it("should throw WorkflowValidationError for invalid output", async () => {
|
|
295
|
-
mockHandle.result.mockResolvedValue({ wrongField: "value" });
|
|
296
|
-
|
|
297
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
298
|
-
workflowId: "test-123",
|
|
299
|
-
args: ["hello", 42],
|
|
300
|
-
});
|
|
301
|
-
|
|
302
|
-
await expect(handle.result()).rejects.toThrow(WorkflowValidationError);
|
|
303
|
-
});
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
describe("queries", () => {
|
|
307
|
-
it("should execute typed query with valid input and output", async () => {
|
|
308
|
-
mockHandle.query.mockResolvedValue("running");
|
|
309
|
-
|
|
310
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
311
|
-
workflowId: "test-123",
|
|
312
|
-
args: ["hello", 42],
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
const status = await handle.queries.getStatus([]);
|
|
316
|
-
|
|
317
|
-
expect(mockHandle.query).toHaveBeenCalledWith("getStatus", []);
|
|
318
|
-
expect(status).toBe("running");
|
|
319
|
-
});
|
|
320
|
-
|
|
321
|
-
it("should throw QueryValidationError for invalid input", async () => {
|
|
322
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
323
|
-
workflowId: "test-123",
|
|
324
|
-
args: ["hello", 42],
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
await expect(
|
|
328
|
-
// @ts-expect-error Testing invalid query input
|
|
329
|
-
handle.queries.getStatus(["invalid"]),
|
|
330
|
-
).rejects.toThrow(QueryValidationError);
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
it("should throw QueryValidationError for invalid output", async () => {
|
|
334
|
-
mockHandle.query.mockResolvedValue(123);
|
|
335
|
-
|
|
336
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
337
|
-
workflowId: "test-123",
|
|
338
|
-
args: ["hello", 42],
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
await expect(handle.queries.getStatus([])).rejects.toThrow(QueryValidationError);
|
|
342
|
-
});
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
describe("signals", () => {
|
|
346
|
-
it("should send typed signal with valid input", async () => {
|
|
347
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
348
|
-
workflowId: "test-123",
|
|
349
|
-
args: ["hello", 42],
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
await handle.signals.updateProgress([50]);
|
|
353
|
-
|
|
354
|
-
expect(mockHandle.signal).toHaveBeenCalledWith("updateProgress", [50]);
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
it("should throw SignalValidationError for invalid input", async () => {
|
|
358
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
359
|
-
workflowId: "test-123",
|
|
360
|
-
args: ["hello", 42],
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
await expect(
|
|
364
|
-
// @ts-expect-error Testing invalid signal input
|
|
365
|
-
handle.signals.updateProgress(["not-a-number"]),
|
|
366
|
-
).rejects.toThrow(SignalValidationError);
|
|
367
|
-
});
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
describe("updates", () => {
|
|
371
|
-
it("should execute typed update with valid input and output", async () => {
|
|
372
|
-
mockHandle.executeUpdate.mockResolvedValue(true);
|
|
373
|
-
|
|
374
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
375
|
-
workflowId: "test-123",
|
|
376
|
-
args: ["hello", 42],
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
const result = await handle.updates.setConfig([{ value: "new-config" }]);
|
|
380
|
-
|
|
381
|
-
expect(mockHandle.executeUpdate).toHaveBeenCalledWith("setConfig", {
|
|
382
|
-
args: [[{ value: "new-config" }]],
|
|
383
|
-
});
|
|
384
|
-
expect(result).toBe(true);
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
it("should throw UpdateValidationError for invalid input", async () => {
|
|
388
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
389
|
-
workflowId: "test-123",
|
|
390
|
-
args: ["hello", 42],
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
await expect(
|
|
394
|
-
// @ts-expect-error Testing invalid update input
|
|
395
|
-
handle.updates.setConfig([{ wrongField: "value" }]),
|
|
396
|
-
).rejects.toThrow(UpdateValidationError);
|
|
397
|
-
});
|
|
398
|
-
|
|
399
|
-
it("should throw UpdateValidationError for invalid output", async () => {
|
|
400
|
-
mockHandle.executeUpdate.mockResolvedValue("not-a-boolean");
|
|
401
|
-
|
|
402
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
403
|
-
workflowId: "test-123",
|
|
404
|
-
args: ["hello", 42],
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
await expect(handle.updates.setConfig([{ value: "new-config" }])).rejects.toThrow(
|
|
408
|
-
UpdateValidationError,
|
|
409
|
-
);
|
|
410
|
-
});
|
|
411
|
-
});
|
|
412
|
-
|
|
413
|
-
describe("terminate", () => {
|
|
414
|
-
it("should terminate workflow", async () => {
|
|
415
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
416
|
-
workflowId: "test-123",
|
|
417
|
-
args: ["hello", 42],
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
await handle.terminate("test reason");
|
|
421
|
-
|
|
422
|
-
expect(mockHandle.terminate).toHaveBeenCalledWith("test reason");
|
|
423
|
-
});
|
|
424
|
-
|
|
425
|
-
it("should terminate workflow without reason", async () => {
|
|
426
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
427
|
-
workflowId: "test-123",
|
|
428
|
-
args: ["hello", 42],
|
|
429
|
-
});
|
|
430
|
-
|
|
431
|
-
await handle.terminate();
|
|
432
|
-
|
|
433
|
-
expect(mockHandle.terminate).toHaveBeenCalledWith(undefined);
|
|
434
|
-
});
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
describe("cancel", () => {
|
|
438
|
-
it("should cancel workflow", async () => {
|
|
439
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
440
|
-
workflowId: "test-123",
|
|
441
|
-
args: ["hello", 42],
|
|
442
|
-
});
|
|
443
|
-
|
|
444
|
-
await handle.cancel();
|
|
445
|
-
|
|
446
|
-
expect(mockHandle.cancel).toHaveBeenCalled();
|
|
447
|
-
});
|
|
448
|
-
});
|
|
449
|
-
|
|
450
|
-
describe("describe", () => {
|
|
451
|
-
it("should call describe on underlying handle", async () => {
|
|
452
|
-
const mockDescription = {
|
|
453
|
-
workflowExecutionInfo: {
|
|
454
|
-
workflowExecution: { workflowId: "test-123", runId: "run-123" },
|
|
455
|
-
type: { name: "testWorkflow" },
|
|
456
|
-
startTime: new Date(),
|
|
457
|
-
status: "RUNNING" as const,
|
|
458
|
-
},
|
|
459
|
-
};
|
|
460
|
-
|
|
461
|
-
mockHandle.describe = vi.fn().mockResolvedValue(mockDescription);
|
|
462
|
-
|
|
463
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
464
|
-
workflowId: "test-123",
|
|
465
|
-
args: ["hello", 42],
|
|
466
|
-
});
|
|
467
|
-
|
|
468
|
-
const description = await handle.describe();
|
|
469
|
-
|
|
470
|
-
expect(mockHandle.describe).toHaveBeenCalled();
|
|
471
|
-
expect(description).toEqual(mockDescription);
|
|
472
|
-
});
|
|
473
|
-
});
|
|
474
|
-
|
|
475
|
-
describe("fetchHistory", () => {
|
|
476
|
-
it("should call fetchHistory on underlying handle", async () => {
|
|
477
|
-
const mockHistoryIterator = (async function* () {
|
|
478
|
-
yield { eventId: 1n, eventType: "WorkflowExecutionStarted" };
|
|
479
|
-
yield { eventId: 2n, eventType: "WorkflowTaskScheduled" };
|
|
480
|
-
})();
|
|
481
|
-
|
|
482
|
-
mockHandle.fetchHistory = vi.fn().mockReturnValue(mockHistoryIterator);
|
|
483
|
-
|
|
484
|
-
const handle = await typedClient.startWorkflow("testWorkflow", {
|
|
485
|
-
workflowId: "test-123",
|
|
486
|
-
args: ["hello", 42],
|
|
487
|
-
});
|
|
488
|
-
|
|
489
|
-
const history = handle.fetchHistory();
|
|
490
|
-
|
|
491
|
-
expect(mockHandle.fetchHistory).toHaveBeenCalled();
|
|
492
|
-
expect(history).toBeDefined();
|
|
493
|
-
});
|
|
494
|
-
});
|
|
495
|
-
});
|
|
496
|
-
|
|
497
|
-
describe("edge cases", () => {
|
|
498
|
-
it("should handle workflow with no queries", async () => {
|
|
499
|
-
const mockHandle = {
|
|
500
|
-
workflowId: "simple-123",
|
|
501
|
-
result: vi.fn().mockResolvedValue("done"),
|
|
502
|
-
query: vi.fn(),
|
|
503
|
-
signal: vi.fn(),
|
|
504
|
-
executeUpdate: vi.fn(),
|
|
505
|
-
terminate: vi.fn(),
|
|
506
|
-
cancel: vi.fn(),
|
|
507
|
-
};
|
|
508
|
-
|
|
509
|
-
mockWorkflow.start.mockResolvedValue(mockHandle);
|
|
510
|
-
|
|
511
|
-
const handle = await typedClient.startWorkflow("simpleWorkflow", {
|
|
512
|
-
workflowId: "simple-123",
|
|
513
|
-
args: ["test"],
|
|
514
|
-
});
|
|
515
|
-
|
|
516
|
-
expect(handle.queries).toBeDefined();
|
|
517
|
-
expect(Object.keys(handle.queries)).toHaveLength(0);
|
|
518
|
-
});
|
|
519
|
-
|
|
520
|
-
it("should handle workflow with no signals", async () => {
|
|
521
|
-
const mockHandle = {
|
|
522
|
-
workflowId: "simple-123",
|
|
523
|
-
result: vi.fn().mockResolvedValue("done"),
|
|
524
|
-
query: vi.fn(),
|
|
525
|
-
signal: vi.fn(),
|
|
526
|
-
executeUpdate: vi.fn(),
|
|
527
|
-
terminate: vi.fn(),
|
|
528
|
-
cancel: vi.fn(),
|
|
529
|
-
};
|
|
530
|
-
|
|
531
|
-
mockWorkflow.start.mockResolvedValue(mockHandle);
|
|
532
|
-
|
|
533
|
-
const handle = await typedClient.startWorkflow("simpleWorkflow", {
|
|
534
|
-
workflowId: "simple-123",
|
|
535
|
-
args: ["test"],
|
|
536
|
-
});
|
|
537
|
-
|
|
538
|
-
expect(handle.signals).toBeDefined();
|
|
539
|
-
expect(Object.keys(handle.signals)).toHaveLength(0);
|
|
540
|
-
});
|
|
541
|
-
|
|
542
|
-
it("should handle workflow with no updates", async () => {
|
|
543
|
-
const mockHandle = {
|
|
544
|
-
workflowId: "simple-123",
|
|
545
|
-
result: vi.fn().mockResolvedValue("done"),
|
|
546
|
-
query: vi.fn(),
|
|
547
|
-
signal: vi.fn(),
|
|
548
|
-
executeUpdate: vi.fn(),
|
|
549
|
-
terminate: vi.fn(),
|
|
550
|
-
cancel: vi.fn(),
|
|
551
|
-
};
|
|
552
|
-
|
|
553
|
-
mockWorkflow.start.mockResolvedValue(mockHandle);
|
|
554
|
-
|
|
555
|
-
const handle = await typedClient.startWorkflow("simpleWorkflow", {
|
|
556
|
-
workflowId: "simple-123",
|
|
557
|
-
args: ["test"],
|
|
558
|
-
});
|
|
559
|
-
|
|
560
|
-
expect(handle.updates).toBeDefined();
|
|
561
|
-
expect(Object.keys(handle.updates)).toHaveLength(0);
|
|
562
|
-
});
|
|
563
|
-
});
|
|
564
|
-
});
|