@herdctl/core 0.1.0 → 0.2.0

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.
Files changed (80) hide show
  1. package/LICENSE +21 -0
  2. package/dist/config/index.d.ts +1 -1
  3. package/dist/config/index.d.ts.map +1 -1
  4. package/dist/config/index.js +3 -1
  5. package/dist/config/index.js.map +1 -1
  6. package/dist/config/schema.d.ts +992 -0
  7. package/dist/config/schema.d.ts.map +1 -1
  8. package/dist/config/schema.js +76 -0
  9. package/dist/config/schema.js.map +1 -1
  10. package/dist/fleet-manager/fleet-manager.d.ts +1 -0
  11. package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
  12. package/dist/fleet-manager/fleet-manager.js +1 -0
  13. package/dist/fleet-manager/fleet-manager.js.map +1 -1
  14. package/dist/fleet-manager/job-control.d.ts +38 -0
  15. package/dist/fleet-manager/job-control.d.ts.map +1 -1
  16. package/dist/fleet-manager/job-control.js +190 -4
  17. package/dist/fleet-manager/job-control.js.map +1 -1
  18. package/dist/fleet-manager/schedule-executor.d.ts +20 -0
  19. package/dist/fleet-manager/schedule-executor.d.ts.map +1 -1
  20. package/dist/fleet-manager/schedule-executor.js +113 -3
  21. package/dist/fleet-manager/schedule-executor.js.map +1 -1
  22. package/dist/fleet-manager/types.d.ts +18 -0
  23. package/dist/fleet-manager/types.d.ts.map +1 -1
  24. package/dist/hooks/__tests__/discord-runner.test.d.ts +5 -0
  25. package/dist/hooks/__tests__/discord-runner.test.d.ts.map +1 -0
  26. package/dist/hooks/__tests__/discord-runner.test.js +606 -0
  27. package/dist/hooks/__tests__/discord-runner.test.js.map +1 -0
  28. package/dist/hooks/__tests__/hook-executor.test.d.ts +5 -0
  29. package/dist/hooks/__tests__/hook-executor.test.d.ts.map +1 -0
  30. package/dist/hooks/__tests__/hook-executor.test.js +443 -0
  31. package/dist/hooks/__tests__/hook-executor.test.js.map +1 -0
  32. package/dist/hooks/__tests__/shell-runner.test.d.ts +5 -0
  33. package/dist/hooks/__tests__/shell-runner.test.d.ts.map +1 -0
  34. package/dist/hooks/__tests__/shell-runner.test.js +201 -0
  35. package/dist/hooks/__tests__/shell-runner.test.js.map +1 -0
  36. package/dist/hooks/__tests__/webhook-runner.test.d.ts +5 -0
  37. package/dist/hooks/__tests__/webhook-runner.test.d.ts.map +1 -0
  38. package/dist/hooks/__tests__/webhook-runner.test.js +453 -0
  39. package/dist/hooks/__tests__/webhook-runner.test.js.map +1 -0
  40. package/dist/hooks/hook-executor.d.ts +129 -0
  41. package/dist/hooks/hook-executor.d.ts.map +1 -0
  42. package/dist/hooks/hook-executor.js +195 -0
  43. package/dist/hooks/hook-executor.js.map +1 -0
  44. package/dist/hooks/index.d.ts +15 -0
  45. package/dist/hooks/index.d.ts.map +1 -0
  46. package/dist/hooks/index.js +18 -0
  47. package/dist/hooks/index.js.map +1 -0
  48. package/dist/hooks/runners/discord.d.ts +66 -0
  49. package/dist/hooks/runners/discord.d.ts.map +1 -0
  50. package/dist/hooks/runners/discord.js +294 -0
  51. package/dist/hooks/runners/discord.js.map +1 -0
  52. package/dist/hooks/runners/shell.d.ts +71 -0
  53. package/dist/hooks/runners/shell.d.ts.map +1 -0
  54. package/dist/hooks/runners/shell.js +177 -0
  55. package/dist/hooks/runners/shell.js.map +1 -0
  56. package/dist/hooks/runners/webhook.d.ts +66 -0
  57. package/dist/hooks/runners/webhook.d.ts.map +1 -0
  58. package/dist/hooks/runners/webhook.js +163 -0
  59. package/dist/hooks/runners/webhook.js.map +1 -0
  60. package/dist/hooks/types.d.ts +196 -0
  61. package/dist/hooks/types.d.ts.map +1 -0
  62. package/dist/hooks/types.js +12 -0
  63. package/dist/hooks/types.js.map +1 -0
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +2 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/runner/__tests__/sdk-adapter.test.js +4 -3
  69. package/dist/runner/__tests__/sdk-adapter.test.js.map +1 -1
  70. package/dist/runner/message-processor.d.ts +5 -1
  71. package/dist/runner/message-processor.d.ts.map +1 -1
  72. package/dist/runner/message-processor.js +211 -44
  73. package/dist/runner/message-processor.js.map +1 -1
  74. package/dist/runner/sdk-adapter.d.ts.map +1 -1
  75. package/dist/runner/sdk-adapter.js +8 -1
  76. package/dist/runner/sdk-adapter.js.map +1 -1
  77. package/dist/runner/types.d.ts +23 -2
  78. package/dist/runner/types.d.ts.map +1 -1
  79. package/dist/state/schemas/job-metadata.d.ts +4 -4
  80. package/package.json +1 -1
@@ -0,0 +1,606 @@
1
+ /**
2
+ * Tests for DiscordHookRunner
3
+ */
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
5
+ import { DiscordHookRunner } from "../runners/discord.js";
6
+ describe("DiscordHookRunner", () => {
7
+ // Create a mock logger
8
+ const mockLogger = {
9
+ debug: vi.fn(),
10
+ info: vi.fn(),
11
+ warn: vi.fn(),
12
+ error: vi.fn(),
13
+ };
14
+ // Create a sample hook context
15
+ const sampleContext = {
16
+ event: "completed",
17
+ job: {
18
+ id: "job-2024-01-15-abc123",
19
+ agentId: "test-agent",
20
+ scheduleName: "daily-run",
21
+ startedAt: "2024-01-15T10:00:00.000Z",
22
+ completedAt: "2024-01-15T10:05:00.000Z",
23
+ durationMs: 300000,
24
+ },
25
+ result: {
26
+ success: true,
27
+ output: "Job completed successfully",
28
+ },
29
+ agent: {
30
+ id: "test-agent",
31
+ name: "Test Agent",
32
+ },
33
+ };
34
+ // Store original env
35
+ const originalEnv = { ...process.env };
36
+ beforeEach(() => {
37
+ vi.clearAllMocks();
38
+ // Reset env before each test
39
+ process.env = { ...originalEnv };
40
+ // Set up a default test token
41
+ process.env.DISCORD_BOT_TOKEN = "test-bot-token-12345";
42
+ });
43
+ afterEach(() => {
44
+ // Restore original env
45
+ process.env = originalEnv;
46
+ });
47
+ describe("execute", () => {
48
+ it("should POST to Discord API successfully", async () => {
49
+ const mockFetch = vi.fn().mockResolvedValue({
50
+ ok: true,
51
+ status: 200,
52
+ statusText: "OK",
53
+ text: () => Promise.resolve('{"id": "123456"}'),
54
+ });
55
+ const runner = new DiscordHookRunner({
56
+ logger: mockLogger,
57
+ fetch: mockFetch,
58
+ });
59
+ const config = {
60
+ type: "discord",
61
+ channel_id: "987654321",
62
+ bot_token_env: "DISCORD_BOT_TOKEN",
63
+ };
64
+ const result = await runner.execute(config, sampleContext);
65
+ expect(result.success).toBe(true);
66
+ expect(result.hookType).toBe("discord");
67
+ expect(result.durationMs).toBeGreaterThanOrEqual(0);
68
+ expect(result.output).toBe('{"id": "123456"}');
69
+ // Verify fetch was called correctly
70
+ expect(mockFetch).toHaveBeenCalledTimes(1);
71
+ const [url, options] = mockFetch.mock.calls[0];
72
+ expect(url).toBe("https://discord.com/api/v10/channels/987654321/messages");
73
+ expect(options.method).toBe("POST");
74
+ expect(options.headers["Content-Type"]).toBe("application/json");
75
+ expect(options.headers["Authorization"]).toBe("Bot test-bot-token-12345");
76
+ expect(mockLogger.info).toHaveBeenCalled();
77
+ });
78
+ it("should include correct embed structure in request body", async () => {
79
+ const mockFetch = vi.fn().mockResolvedValue({
80
+ ok: true,
81
+ status: 200,
82
+ statusText: "OK",
83
+ text: () => Promise.resolve(""),
84
+ });
85
+ const runner = new DiscordHookRunner({
86
+ logger: mockLogger,
87
+ fetch: mockFetch,
88
+ });
89
+ const config = {
90
+ type: "discord",
91
+ channel_id: "987654321",
92
+ bot_token_env: "DISCORD_BOT_TOKEN",
93
+ };
94
+ await runner.execute(config, sampleContext);
95
+ const [, options] = mockFetch.mock.calls[0];
96
+ const body = JSON.parse(options.body);
97
+ // Verify embed structure
98
+ expect(body.embeds).toHaveLength(1);
99
+ const embed = body.embeds[0];
100
+ expect(embed.title).toBe("✅ Job Completed");
101
+ expect(embed.color).toBe(0x22c55e); // green
102
+ expect(embed.timestamp).toBe("2024-01-15T10:05:00.000Z");
103
+ expect(embed.footer.text).toBe("herdctl");
104
+ // Verify fields
105
+ const fieldNames = embed.fields.map((f) => f.name);
106
+ expect(fieldNames).toContain("Agent");
107
+ expect(fieldNames).toContain("Job ID");
108
+ expect(fieldNames).toContain("Duration");
109
+ expect(fieldNames).toContain("Schedule");
110
+ expect(fieldNames).toContain("Output");
111
+ // Verify field values
112
+ const agentField = embed.fields.find((f) => f.name === "Agent");
113
+ expect(agentField.value).toBe("Test Agent");
114
+ const jobIdField = embed.fields.find((f) => f.name === "Job ID");
115
+ expect(jobIdField.value).toBe("`job-2024-01-15-abc123`");
116
+ const durationField = embed.fields.find((f) => f.name === "Duration");
117
+ expect(durationField.value).toBe("5m"); // 300000ms = 5 minutes
118
+ });
119
+ it("should use red color for failed events", async () => {
120
+ const mockFetch = vi.fn().mockResolvedValue({
121
+ ok: true,
122
+ status: 200,
123
+ statusText: "OK",
124
+ text: () => Promise.resolve(""),
125
+ });
126
+ const runner = new DiscordHookRunner({
127
+ logger: mockLogger,
128
+ fetch: mockFetch,
129
+ });
130
+ const failedContext = {
131
+ ...sampleContext,
132
+ event: "failed",
133
+ result: {
134
+ success: false,
135
+ output: "Job failed",
136
+ error: "Connection timeout",
137
+ },
138
+ };
139
+ const config = {
140
+ type: "discord",
141
+ channel_id: "987654321",
142
+ bot_token_env: "DISCORD_BOT_TOKEN",
143
+ };
144
+ await runner.execute(config, failedContext);
145
+ const [, options] = mockFetch.mock.calls[0];
146
+ const body = JSON.parse(options.body);
147
+ expect(body.embeds[0].title).toBe("❌ Job Failed");
148
+ expect(body.embeds[0].color).toBe(0xef4444); // red
149
+ // Verify error field is included
150
+ const errorField = body.embeds[0].fields.find((f) => f.name === "Error");
151
+ expect(errorField).toBeDefined();
152
+ expect(errorField.value).toContain("Connection timeout");
153
+ });
154
+ it("should use amber color for timeout events", async () => {
155
+ const mockFetch = vi.fn().mockResolvedValue({
156
+ ok: true,
157
+ status: 200,
158
+ statusText: "OK",
159
+ text: () => Promise.resolve(""),
160
+ });
161
+ const runner = new DiscordHookRunner({
162
+ logger: mockLogger,
163
+ fetch: mockFetch,
164
+ });
165
+ const timeoutContext = {
166
+ ...sampleContext,
167
+ event: "timeout",
168
+ };
169
+ const config = {
170
+ type: "discord",
171
+ channel_id: "987654321",
172
+ bot_token_env: "DISCORD_BOT_TOKEN",
173
+ };
174
+ await runner.execute(config, timeoutContext);
175
+ const [, options] = mockFetch.mock.calls[0];
176
+ const body = JSON.parse(options.body);
177
+ expect(body.embeds[0].title).toBe("⏱️ Job Timed Out");
178
+ expect(body.embeds[0].color).toBe(0xf59e0b); // amber
179
+ });
180
+ it("should use gray color for cancelled events", async () => {
181
+ const mockFetch = vi.fn().mockResolvedValue({
182
+ ok: true,
183
+ status: 200,
184
+ statusText: "OK",
185
+ text: () => Promise.resolve(""),
186
+ });
187
+ const runner = new DiscordHookRunner({
188
+ logger: mockLogger,
189
+ fetch: mockFetch,
190
+ });
191
+ const cancelledContext = {
192
+ ...sampleContext,
193
+ event: "cancelled",
194
+ };
195
+ const config = {
196
+ type: "discord",
197
+ channel_id: "987654321",
198
+ bot_token_env: "DISCORD_BOT_TOKEN",
199
+ };
200
+ await runner.execute(config, cancelledContext);
201
+ const [, options] = mockFetch.mock.calls[0];
202
+ const body = JSON.parse(options.body);
203
+ expect(body.embeds[0].title).toBe("🚫 Job Cancelled");
204
+ expect(body.embeds[0].color).toBe(0x6b7280); // gray
205
+ });
206
+ it("should fail if bot token env var is not set", async () => {
207
+ delete process.env.DISCORD_BOT_TOKEN;
208
+ const mockFetch = vi.fn();
209
+ const runner = new DiscordHookRunner({
210
+ logger: mockLogger,
211
+ fetch: mockFetch,
212
+ });
213
+ const config = {
214
+ type: "discord",
215
+ channel_id: "987654321",
216
+ bot_token_env: "DISCORD_BOT_TOKEN",
217
+ };
218
+ const result = await runner.execute(config, sampleContext);
219
+ expect(result.success).toBe(false);
220
+ expect(result.hookType).toBe("discord");
221
+ expect(result.error).toContain("bot token not found");
222
+ expect(result.error).toContain("DISCORD_BOT_TOKEN");
223
+ expect(mockFetch).not.toHaveBeenCalled();
224
+ expect(mockLogger.error).toHaveBeenCalled();
225
+ });
226
+ it("should use custom env var name for bot token", async () => {
227
+ process.env.MY_CUSTOM_TOKEN = "my-custom-token-value";
228
+ const mockFetch = vi.fn().mockResolvedValue({
229
+ ok: true,
230
+ status: 200,
231
+ statusText: "OK",
232
+ text: () => Promise.resolve(""),
233
+ });
234
+ const runner = new DiscordHookRunner({
235
+ logger: mockLogger,
236
+ fetch: mockFetch,
237
+ });
238
+ const config = {
239
+ type: "discord",
240
+ channel_id: "987654321",
241
+ bot_token_env: "MY_CUSTOM_TOKEN",
242
+ };
243
+ const result = await runner.execute(config, sampleContext);
244
+ expect(result.success).toBe(true);
245
+ const [, options] = mockFetch.mock.calls[0];
246
+ expect(options.headers["Authorization"]).toBe("Bot my-custom-token-value");
247
+ });
248
+ it("should handle Discord API error responses", async () => {
249
+ const mockFetch = vi.fn().mockResolvedValue({
250
+ ok: false,
251
+ status: 403,
252
+ statusText: "Forbidden",
253
+ text: () => Promise.resolve('{"message": "Missing Permissions", "code": 50013}'),
254
+ });
255
+ const runner = new DiscordHookRunner({
256
+ logger: mockLogger,
257
+ fetch: mockFetch,
258
+ });
259
+ const config = {
260
+ type: "discord",
261
+ channel_id: "987654321",
262
+ bot_token_env: "DISCORD_BOT_TOKEN",
263
+ };
264
+ const result = await runner.execute(config, sampleContext);
265
+ expect(result.success).toBe(false);
266
+ expect(result.hookType).toBe("discord");
267
+ expect(result.error).toContain("Missing Permissions");
268
+ expect(result.error).toContain("50013");
269
+ expect(mockLogger.warn).toHaveBeenCalled();
270
+ });
271
+ it("should handle invalid channel ID errors", async () => {
272
+ const mockFetch = vi.fn().mockResolvedValue({
273
+ ok: false,
274
+ status: 404,
275
+ statusText: "Not Found",
276
+ text: () => Promise.resolve('{"message": "Unknown Channel", "code": 10003}'),
277
+ });
278
+ const runner = new DiscordHookRunner({
279
+ logger: mockLogger,
280
+ fetch: mockFetch,
281
+ });
282
+ const config = {
283
+ type: "discord",
284
+ channel_id: "invalid-channel",
285
+ bot_token_env: "DISCORD_BOT_TOKEN",
286
+ };
287
+ const result = await runner.execute(config, sampleContext);
288
+ expect(result.success).toBe(false);
289
+ expect(result.error).toContain("Unknown Channel");
290
+ });
291
+ it("should handle network errors", async () => {
292
+ const mockFetch = vi.fn().mockRejectedValue(new Error("Network error: ECONNREFUSED"));
293
+ const runner = new DiscordHookRunner({
294
+ logger: mockLogger,
295
+ fetch: mockFetch,
296
+ });
297
+ const config = {
298
+ type: "discord",
299
+ channel_id: "987654321",
300
+ bot_token_env: "DISCORD_BOT_TOKEN",
301
+ };
302
+ const result = await runner.execute(config, sampleContext);
303
+ expect(result.success).toBe(false);
304
+ expect(result.error).toContain("ECONNREFUSED");
305
+ expect(mockLogger.error).toHaveBeenCalled();
306
+ });
307
+ it("should handle timeout", async () => {
308
+ // Create a mock that simulates a timeout by aborting
309
+ const mockFetch = vi.fn().mockImplementation(async (_url, options) => {
310
+ return new Promise((_, reject) => {
311
+ options.signal.addEventListener("abort", () => {
312
+ const error = new Error("The operation was aborted");
313
+ error.name = "AbortError";
314
+ reject(error);
315
+ });
316
+ });
317
+ });
318
+ const runner = new DiscordHookRunner({
319
+ logger: mockLogger,
320
+ fetch: mockFetch,
321
+ });
322
+ const config = {
323
+ type: "discord",
324
+ channel_id: "987654321",
325
+ bot_token_env: "DISCORD_BOT_TOKEN",
326
+ };
327
+ // Note: This test uses the default 10000ms timeout, but the mock
328
+ // aborts immediately when the signal fires
329
+ const result = await runner.execute(config, sampleContext);
330
+ expect(result.success).toBe(false);
331
+ expect(result.error).toContain("timed out");
332
+ expect(mockLogger.error).toHaveBeenCalled();
333
+ }, 15000); // Extend test timeout
334
+ it("should truncate long output to 1000 characters", async () => {
335
+ const mockFetch = vi.fn().mockResolvedValue({
336
+ ok: true,
337
+ status: 200,
338
+ statusText: "OK",
339
+ text: () => Promise.resolve(""),
340
+ });
341
+ const runner = new DiscordHookRunner({
342
+ logger: mockLogger,
343
+ fetch: mockFetch,
344
+ });
345
+ // Create a context with very long output
346
+ const longOutputContext = {
347
+ ...sampleContext,
348
+ result: {
349
+ success: true,
350
+ output: "A".repeat(2000), // 2000 characters
351
+ },
352
+ };
353
+ const config = {
354
+ type: "discord",
355
+ channel_id: "987654321",
356
+ bot_token_env: "DISCORD_BOT_TOKEN",
357
+ };
358
+ await runner.execute(config, longOutputContext);
359
+ const [, options] = mockFetch.mock.calls[0];
360
+ const body = JSON.parse(options.body);
361
+ const outputField = body.embeds[0].fields.find((f) => f.name === "Output");
362
+ expect(outputField).toBeDefined();
363
+ // The value includes code fence markers, so we check the truncated content
364
+ expect(outputField.value).toContain("...");
365
+ // Total should be under 1100 chars (1000 + code fences + ellipsis)
366
+ expect(outputField.value.length).toBeLessThanOrEqual(1020);
367
+ });
368
+ it("should format duration correctly for various values", async () => {
369
+ const mockFetch = vi.fn().mockResolvedValue({
370
+ ok: true,
371
+ status: 200,
372
+ statusText: "OK",
373
+ text: () => Promise.resolve(""),
374
+ });
375
+ const runner = new DiscordHookRunner({
376
+ logger: mockLogger,
377
+ fetch: mockFetch,
378
+ });
379
+ const config = {
380
+ type: "discord",
381
+ channel_id: "987654321",
382
+ bot_token_env: "DISCORD_BOT_TOKEN",
383
+ };
384
+ // Test milliseconds
385
+ let context = { ...sampleContext, job: { ...sampleContext.job, durationMs: 500 } };
386
+ await runner.execute(config, context);
387
+ let body = JSON.parse(mockFetch.mock.calls[0][1].body);
388
+ let durationField = body.embeds[0].fields.find((f) => f.name === "Duration");
389
+ expect(durationField.value).toBe("500ms");
390
+ mockFetch.mockClear();
391
+ // Test seconds
392
+ context = { ...sampleContext, job: { ...sampleContext.job, durationMs: 45000 } };
393
+ await runner.execute(config, context);
394
+ body = JSON.parse(mockFetch.mock.calls[0][1].body);
395
+ durationField = body.embeds[0].fields.find((f) => f.name === "Duration");
396
+ expect(durationField.value).toBe("45s");
397
+ mockFetch.mockClear();
398
+ // Test hours
399
+ context = { ...sampleContext, job: { ...sampleContext.job, durationMs: 3660000 } }; // 1h 1m
400
+ await runner.execute(config, context);
401
+ body = JSON.parse(mockFetch.mock.calls[0][1].body);
402
+ durationField = body.embeds[0].fields.find((f) => f.name === "Duration");
403
+ expect(durationField.value).toBe("1h 1m");
404
+ });
405
+ it("should omit schedule field if not present", async () => {
406
+ const mockFetch = vi.fn().mockResolvedValue({
407
+ ok: true,
408
+ status: 200,
409
+ statusText: "OK",
410
+ text: () => Promise.resolve(""),
411
+ });
412
+ const runner = new DiscordHookRunner({
413
+ logger: mockLogger,
414
+ fetch: mockFetch,
415
+ });
416
+ const noScheduleContext = {
417
+ ...sampleContext,
418
+ job: {
419
+ ...sampleContext.job,
420
+ scheduleName: undefined,
421
+ },
422
+ };
423
+ const config = {
424
+ type: "discord",
425
+ channel_id: "987654321",
426
+ bot_token_env: "DISCORD_BOT_TOKEN",
427
+ };
428
+ await runner.execute(config, noScheduleContext);
429
+ const [, options] = mockFetch.mock.calls[0];
430
+ const body = JSON.parse(options.body);
431
+ const scheduleField = body.embeds[0].fields.find((f) => f.name === "Schedule");
432
+ expect(scheduleField).toBeUndefined();
433
+ });
434
+ it("should use agent id if name is not provided", async () => {
435
+ const mockFetch = vi.fn().mockResolvedValue({
436
+ ok: true,
437
+ status: 200,
438
+ statusText: "OK",
439
+ text: () => Promise.resolve(""),
440
+ });
441
+ const runner = new DiscordHookRunner({
442
+ logger: mockLogger,
443
+ fetch: mockFetch,
444
+ });
445
+ const noNameContext = {
446
+ ...sampleContext,
447
+ agent: {
448
+ id: "agent-id-123",
449
+ name: undefined,
450
+ },
451
+ };
452
+ const config = {
453
+ type: "discord",
454
+ channel_id: "987654321",
455
+ bot_token_env: "DISCORD_BOT_TOKEN",
456
+ };
457
+ await runner.execute(config, noNameContext);
458
+ const [, options] = mockFetch.mock.calls[0];
459
+ const body = JSON.parse(options.body);
460
+ const agentField = body.embeds[0].fields.find((f) => f.name === "Agent");
461
+ expect(agentField.value).toBe("agent-id-123");
462
+ });
463
+ it("should measure execution duration", async () => {
464
+ const mockFetch = vi.fn().mockImplementation(async () => {
465
+ // Add a small delay to measure
466
+ await new Promise((resolve) => setTimeout(resolve, 50));
467
+ return {
468
+ ok: true,
469
+ status: 200,
470
+ statusText: "OK",
471
+ text: () => Promise.resolve(""),
472
+ };
473
+ });
474
+ const runner = new DiscordHookRunner({
475
+ logger: mockLogger,
476
+ fetch: mockFetch,
477
+ });
478
+ const config = {
479
+ type: "discord",
480
+ channel_id: "987654321",
481
+ bot_token_env: "DISCORD_BOT_TOKEN",
482
+ };
483
+ const result = await runner.execute(config, sampleContext);
484
+ expect(result.success).toBe(true);
485
+ expect(result.durationMs).toBeGreaterThanOrEqual(40); // Allow some tolerance
486
+ expect(result.durationMs).toBeLessThan(5000);
487
+ });
488
+ it("should work without a logger", async () => {
489
+ const mockFetch = vi.fn().mockResolvedValue({
490
+ ok: true,
491
+ status: 200,
492
+ statusText: "OK",
493
+ text: () => Promise.resolve("no logger"),
494
+ });
495
+ const runner = new DiscordHookRunner({ fetch: mockFetch }); // No logger
496
+ const config = {
497
+ type: "discord",
498
+ channel_id: "987654321",
499
+ bot_token_env: "DISCORD_BOT_TOKEN",
500
+ };
501
+ const result = await runner.execute(config, sampleContext);
502
+ expect(result.success).toBe(true);
503
+ expect(result.output).toBe("no logger");
504
+ });
505
+ it("should handle response body read errors gracefully", async () => {
506
+ const mockFetch = vi.fn().mockResolvedValue({
507
+ ok: true,
508
+ status: 200,
509
+ statusText: "OK",
510
+ text: () => Promise.reject(new Error("Body read error")),
511
+ });
512
+ const runner = new DiscordHookRunner({
513
+ logger: mockLogger,
514
+ fetch: mockFetch,
515
+ });
516
+ const config = {
517
+ type: "discord",
518
+ channel_id: "987654321",
519
+ bot_token_env: "DISCORD_BOT_TOKEN",
520
+ };
521
+ const result = await runner.execute(config, sampleContext);
522
+ expect(result.success).toBe(true);
523
+ expect(result.output).toBeUndefined();
524
+ });
525
+ it("should handle non-JSON error responses gracefully", async () => {
526
+ const mockFetch = vi.fn().mockResolvedValue({
527
+ ok: false,
528
+ status: 500,
529
+ statusText: "Internal Server Error",
530
+ text: () => Promise.resolve("Something went wrong"),
531
+ });
532
+ const runner = new DiscordHookRunner({
533
+ logger: mockLogger,
534
+ fetch: mockFetch,
535
+ });
536
+ const config = {
537
+ type: "discord",
538
+ channel_id: "987654321",
539
+ bot_token_env: "DISCORD_BOT_TOKEN",
540
+ };
541
+ const result = await runner.execute(config, sampleContext);
542
+ expect(result.success).toBe(false);
543
+ expect(result.error).toContain("HTTP 500");
544
+ expect(result.error).toContain("Something went wrong");
545
+ });
546
+ it("should not include output field if output is empty", async () => {
547
+ const mockFetch = vi.fn().mockResolvedValue({
548
+ ok: true,
549
+ status: 200,
550
+ statusText: "OK",
551
+ text: () => Promise.resolve(""),
552
+ });
553
+ const runner = new DiscordHookRunner({
554
+ logger: mockLogger,
555
+ fetch: mockFetch,
556
+ });
557
+ const emptyOutputContext = {
558
+ ...sampleContext,
559
+ result: {
560
+ success: true,
561
+ output: "", // Empty output
562
+ },
563
+ };
564
+ const config = {
565
+ type: "discord",
566
+ channel_id: "987654321",
567
+ bot_token_env: "DISCORD_BOT_TOKEN",
568
+ };
569
+ await runner.execute(config, emptyOutputContext);
570
+ const [, options] = mockFetch.mock.calls[0];
571
+ const body = JSON.parse(options.body);
572
+ const outputField = body.embeds[0].fields.find((f) => f.name === "Output");
573
+ expect(outputField).toBeUndefined();
574
+ });
575
+ it("should not include output field if output is whitespace only", async () => {
576
+ const mockFetch = vi.fn().mockResolvedValue({
577
+ ok: true,
578
+ status: 200,
579
+ statusText: "OK",
580
+ text: () => Promise.resolve(""),
581
+ });
582
+ const runner = new DiscordHookRunner({
583
+ logger: mockLogger,
584
+ fetch: mockFetch,
585
+ });
586
+ const whitespaceOutputContext = {
587
+ ...sampleContext,
588
+ result: {
589
+ success: true,
590
+ output: " \n\t ", // Whitespace only
591
+ },
592
+ };
593
+ const config = {
594
+ type: "discord",
595
+ channel_id: "987654321",
596
+ bot_token_env: "DISCORD_BOT_TOKEN",
597
+ };
598
+ await runner.execute(config, whitespaceOutputContext);
599
+ const [, options] = mockFetch.mock.calls[0];
600
+ const body = JSON.parse(options.body);
601
+ const outputField = body.embeds[0].fields.find((f) => f.name === "Output");
602
+ expect(outputField).toBeUndefined();
603
+ });
604
+ });
605
+ });
606
+ //# sourceMappingURL=discord-runner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-runner.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/discord-runner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for HookExecutor
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=hook-executor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-executor.test.d.ts","sourceRoot":"","sources":["../../../src/hooks/__tests__/hook-executor.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}