@herdctl/core 0.0.2 → 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.
- package/LICENSE +21 -0
- package/dist/config/__tests__/agent.test.js +30 -0
- package/dist/config/__tests__/agent.test.js.map +1 -1
- package/dist/config/__tests__/merge.test.js +1 -1
- package/dist/config/__tests__/merge.test.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +1005 -3
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +87 -4
- package/dist/config/schema.js.map +1 -1
- package/dist/fleet-manager/__tests__/coverage.test.js +6 -2
- package/dist/fleet-manager/__tests__/coverage.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/integration.test.js +5 -0
- package/dist/fleet-manager/__tests__/integration.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/job-control.test.js +13 -14
- package/dist/fleet-manager/__tests__/job-control.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/reload.test.js +13 -3
- package/dist/fleet-manager/__tests__/reload.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/status-queries.test.js +6 -0
- package/dist/fleet-manager/__tests__/status-queries.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/trigger.test.js +10 -2
- package/dist/fleet-manager/__tests__/trigger.test.js.map +1 -1
- package/dist/fleet-manager/config-reload.d.ts +1 -1
- package/dist/fleet-manager/config-reload.js +1 -1
- package/dist/fleet-manager/fleet-manager.d.ts +1 -0
- package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.js +1 -0
- package/dist/fleet-manager/fleet-manager.js.map +1 -1
- package/dist/fleet-manager/job-control.d.ts +41 -0
- package/dist/fleet-manager/job-control.d.ts.map +1 -1
- package/dist/fleet-manager/job-control.js +243 -20
- package/dist/fleet-manager/job-control.js.map +1 -1
- package/dist/fleet-manager/schedule-executor.d.ts +20 -0
- package/dist/fleet-manager/schedule-executor.d.ts.map +1 -1
- package/dist/fleet-manager/schedule-executor.js +113 -3
- package/dist/fleet-manager/schedule-executor.js.map +1 -1
- package/dist/fleet-manager/types.d.ts +18 -0
- package/dist/fleet-manager/types.d.ts.map +1 -1
- package/dist/hooks/__tests__/discord-runner.test.d.ts +5 -0
- package/dist/hooks/__tests__/discord-runner.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/discord-runner.test.js +606 -0
- package/dist/hooks/__tests__/discord-runner.test.js.map +1 -0
- package/dist/hooks/__tests__/hook-executor.test.d.ts +5 -0
- package/dist/hooks/__tests__/hook-executor.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/hook-executor.test.js +443 -0
- package/dist/hooks/__tests__/hook-executor.test.js.map +1 -0
- package/dist/hooks/__tests__/shell-runner.test.d.ts +5 -0
- package/dist/hooks/__tests__/shell-runner.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/shell-runner.test.js +201 -0
- package/dist/hooks/__tests__/shell-runner.test.js.map +1 -0
- package/dist/hooks/__tests__/webhook-runner.test.d.ts +5 -0
- package/dist/hooks/__tests__/webhook-runner.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/webhook-runner.test.js +453 -0
- package/dist/hooks/__tests__/webhook-runner.test.js.map +1 -0
- package/dist/hooks/hook-executor.d.ts +129 -0
- package/dist/hooks/hook-executor.d.ts.map +1 -0
- package/dist/hooks/hook-executor.js +195 -0
- package/dist/hooks/hook-executor.js.map +1 -0
- package/dist/hooks/index.d.ts +15 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +18 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/runners/discord.d.ts +66 -0
- package/dist/hooks/runners/discord.d.ts.map +1 -0
- package/dist/hooks/runners/discord.js +294 -0
- package/dist/hooks/runners/discord.js.map +1 -0
- package/dist/hooks/runners/shell.d.ts +71 -0
- package/dist/hooks/runners/shell.d.ts.map +1 -0
- package/dist/hooks/runners/shell.js +177 -0
- package/dist/hooks/runners/shell.js.map +1 -0
- package/dist/hooks/runners/webhook.d.ts +66 -0
- package/dist/hooks/runners/webhook.d.ts.map +1 -0
- package/dist/hooks/runners/webhook.js +163 -0
- package/dist/hooks/runners/webhook.js.map +1 -0
- package/dist/hooks/types.d.ts +196 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +12 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/runner/__tests__/sdk-adapter.test.js +4 -3
- package/dist/runner/__tests__/sdk-adapter.test.js.map +1 -1
- package/dist/runner/message-processor.d.ts +5 -1
- package/dist/runner/message-processor.d.ts.map +1 -1
- package/dist/runner/message-processor.js +238 -18
- package/dist/runner/message-processor.js.map +1 -1
- package/dist/runner/sdk-adapter.d.ts.map +1 -1
- package/dist/runner/sdk-adapter.js +8 -1
- package/dist/runner/sdk-adapter.js.map +1 -1
- package/dist/runner/types.d.ts +23 -2
- package/dist/runner/types.d.ts.map +1 -1
- package/dist/scheduler/scheduler.d.ts.map +1 -1
- package/dist/scheduler/scheduler.js +9 -0
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/state/schemas/job-metadata.d.ts +4 -4
- package/package.json +1 -1
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for HookExecutor
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
5
|
+
import { HookExecutor } from "../hook-executor.js";
|
|
6
|
+
describe("HookExecutor", () => {
|
|
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
|
+
beforeEach(() => {
|
|
35
|
+
vi.clearAllMocks();
|
|
36
|
+
});
|
|
37
|
+
describe("executeHooks", () => {
|
|
38
|
+
it("should return success when no hooks are configured", async () => {
|
|
39
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
40
|
+
const result = await executor.executeHooks(undefined, sampleContext, "after_run");
|
|
41
|
+
expect(result.success).toBe(true);
|
|
42
|
+
expect(result.totalHooks).toBe(0);
|
|
43
|
+
expect(result.successfulHooks).toBe(0);
|
|
44
|
+
expect(result.failedHooks).toBe(0);
|
|
45
|
+
});
|
|
46
|
+
it("should return success when hook list is empty", async () => {
|
|
47
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
48
|
+
const hooksConfig = {
|
|
49
|
+
after_run: [],
|
|
50
|
+
};
|
|
51
|
+
const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
|
|
52
|
+
expect(result.success).toBe(true);
|
|
53
|
+
expect(result.totalHooks).toBe(0);
|
|
54
|
+
});
|
|
55
|
+
it("should execute shell hooks successfully", async () => {
|
|
56
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
57
|
+
const hooksConfig = {
|
|
58
|
+
after_run: [
|
|
59
|
+
{
|
|
60
|
+
type: "shell",
|
|
61
|
+
command: "echo 'hook executed'",
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
|
|
66
|
+
expect(result.success).toBe(true);
|
|
67
|
+
expect(result.totalHooks).toBe(1);
|
|
68
|
+
expect(result.successfulHooks).toBe(1);
|
|
69
|
+
expect(result.failedHooks).toBe(0);
|
|
70
|
+
expect(result.results).toHaveLength(1);
|
|
71
|
+
expect(result.results[0].success).toBe(true);
|
|
72
|
+
expect(result.results[0].hookType).toBe("shell");
|
|
73
|
+
});
|
|
74
|
+
it("should execute multiple hooks sequentially", async () => {
|
|
75
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
76
|
+
const hooksConfig = {
|
|
77
|
+
after_run: [
|
|
78
|
+
{ type: "shell", command: "echo 'first'" },
|
|
79
|
+
{ type: "shell", command: "echo 'second'" },
|
|
80
|
+
{ type: "shell", command: "echo 'third'" },
|
|
81
|
+
],
|
|
82
|
+
};
|
|
83
|
+
const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
|
|
84
|
+
expect(result.success).toBe(true);
|
|
85
|
+
expect(result.totalHooks).toBe(3);
|
|
86
|
+
expect(result.successfulHooks).toBe(3);
|
|
87
|
+
expect(result.results).toHaveLength(3);
|
|
88
|
+
});
|
|
89
|
+
it("should handle hook failures with continue_on_error=true (default)", async () => {
|
|
90
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
91
|
+
const hooksConfig = {
|
|
92
|
+
after_run: [
|
|
93
|
+
{ type: "shell", command: "echo 'first'" },
|
|
94
|
+
{ type: "shell", command: "exit 1" }, // This will fail
|
|
95
|
+
{ type: "shell", command: "echo 'third'" }, // Should still run
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
|
|
99
|
+
expect(result.success).toBe(false); // Overall success is false
|
|
100
|
+
expect(result.totalHooks).toBe(3);
|
|
101
|
+
expect(result.successfulHooks).toBe(2);
|
|
102
|
+
expect(result.failedHooks).toBe(1);
|
|
103
|
+
expect(result.shouldFailJob).toBe(false); // continue_on_error is true by default
|
|
104
|
+
expect(result.results).toHaveLength(3); // All hooks ran
|
|
105
|
+
});
|
|
106
|
+
it("should set shouldFailJob=true when continue_on_error=false", async () => {
|
|
107
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
108
|
+
const hooksConfig = {
|
|
109
|
+
after_run: [
|
|
110
|
+
{
|
|
111
|
+
type: "shell",
|
|
112
|
+
command: "exit 1",
|
|
113
|
+
continue_on_error: false,
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
};
|
|
117
|
+
const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
|
|
118
|
+
expect(result.success).toBe(false);
|
|
119
|
+
expect(result.shouldFailJob).toBe(true);
|
|
120
|
+
expect(mockLogger.error).toHaveBeenCalled();
|
|
121
|
+
});
|
|
122
|
+
it("should filter hooks by on_events", async () => {
|
|
123
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
124
|
+
const hooksConfig = {
|
|
125
|
+
after_run: [
|
|
126
|
+
{
|
|
127
|
+
type: "shell",
|
|
128
|
+
command: "echo 'should run'",
|
|
129
|
+
on_events: ["completed"],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
type: "shell",
|
|
133
|
+
command: "echo 'should skip'",
|
|
134
|
+
on_events: ["failed"], // This won't match 'completed' event
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
};
|
|
138
|
+
const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
|
|
139
|
+
expect(result.success).toBe(true);
|
|
140
|
+
expect(result.totalHooks).toBe(2);
|
|
141
|
+
expect(result.successfulHooks).toBe(1);
|
|
142
|
+
expect(result.skippedHooks).toBe(1);
|
|
143
|
+
expect(result.results).toHaveLength(1); // Only the one that ran
|
|
144
|
+
});
|
|
145
|
+
it("should run hooks without on_events filter for all events", async () => {
|
|
146
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
147
|
+
const hooksConfig = {
|
|
148
|
+
after_run: [
|
|
149
|
+
{
|
|
150
|
+
type: "shell",
|
|
151
|
+
command: "echo 'always runs'",
|
|
152
|
+
// No on_events specified
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
};
|
|
156
|
+
const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
|
|
157
|
+
expect(result.success).toBe(true);
|
|
158
|
+
expect(result.successfulHooks).toBe(1);
|
|
159
|
+
expect(result.skippedHooks).toBe(0);
|
|
160
|
+
});
|
|
161
|
+
it("should execute on_error hooks for failed events", async () => {
|
|
162
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
163
|
+
const failedContext = {
|
|
164
|
+
...sampleContext,
|
|
165
|
+
event: "failed",
|
|
166
|
+
result: {
|
|
167
|
+
success: false,
|
|
168
|
+
output: "Job failed",
|
|
169
|
+
error: "Something went wrong",
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
const hooksConfig = {
|
|
173
|
+
on_error: [
|
|
174
|
+
{
|
|
175
|
+
type: "shell",
|
|
176
|
+
command: "echo 'error handler'",
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
};
|
|
180
|
+
const result = await executor.executeHooks(hooksConfig, failedContext, "on_error");
|
|
181
|
+
expect(result.success).toBe(true);
|
|
182
|
+
expect(result.successfulHooks).toBe(1);
|
|
183
|
+
});
|
|
184
|
+
it("should handle timeout event type", async () => {
|
|
185
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
186
|
+
const timeoutContext = {
|
|
187
|
+
...sampleContext,
|
|
188
|
+
event: "timeout",
|
|
189
|
+
result: {
|
|
190
|
+
success: false,
|
|
191
|
+
output: "",
|
|
192
|
+
error: "Job timed out",
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
const hooksConfig = {
|
|
196
|
+
after_run: [
|
|
197
|
+
{
|
|
198
|
+
type: "shell",
|
|
199
|
+
command: "echo 'timeout handler'",
|
|
200
|
+
on_events: ["timeout"],
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
};
|
|
204
|
+
const result = await executor.executeHooks(hooksConfig, timeoutContext, "after_run");
|
|
205
|
+
expect(result.success).toBe(true);
|
|
206
|
+
expect(result.successfulHooks).toBe(1);
|
|
207
|
+
});
|
|
208
|
+
it("should handle cancelled event type", async () => {
|
|
209
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
210
|
+
const cancelledContext = {
|
|
211
|
+
...sampleContext,
|
|
212
|
+
event: "cancelled",
|
|
213
|
+
result: {
|
|
214
|
+
success: false,
|
|
215
|
+
output: "",
|
|
216
|
+
error: "Job was cancelled",
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
const hooksConfig = {
|
|
220
|
+
after_run: [
|
|
221
|
+
{
|
|
222
|
+
type: "shell",
|
|
223
|
+
command: "echo 'cancelled handler'",
|
|
224
|
+
on_events: ["cancelled"],
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
};
|
|
228
|
+
const result = await executor.executeHooks(hooksConfig, cancelledContext, "after_run");
|
|
229
|
+
expect(result.success).toBe(true);
|
|
230
|
+
expect(result.successfulHooks).toBe(1);
|
|
231
|
+
});
|
|
232
|
+
it("should execute webhook hooks", async () => {
|
|
233
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
234
|
+
const hooksConfig = {
|
|
235
|
+
after_run: [
|
|
236
|
+
{
|
|
237
|
+
type: "webhook",
|
|
238
|
+
url: "https://example.com/hook",
|
|
239
|
+
},
|
|
240
|
+
],
|
|
241
|
+
};
|
|
242
|
+
const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
|
|
243
|
+
// Webhook hooks are now implemented - they will fail against example.com
|
|
244
|
+
// but the key thing is they're not returning "not yet implemented"
|
|
245
|
+
expect(result.results[0].hookType).toBe("webhook");
|
|
246
|
+
expect(result.results[0].error).not.toContain("not yet implemented");
|
|
247
|
+
});
|
|
248
|
+
it("should execute discord hooks (fails with missing token)", async () => {
|
|
249
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
250
|
+
const hooksConfig = {
|
|
251
|
+
after_run: [
|
|
252
|
+
{
|
|
253
|
+
type: "discord",
|
|
254
|
+
channel_id: "123456789",
|
|
255
|
+
bot_token_env: "DISCORD_TOKEN",
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
};
|
|
259
|
+
const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
|
|
260
|
+
// Discord hooks are now implemented - they will fail without the token
|
|
261
|
+
// but the key thing is they're not returning "not yet implemented"
|
|
262
|
+
expect(result.results[0].hookType).toBe("discord");
|
|
263
|
+
expect(result.results[0].error).not.toContain("not yet implemented");
|
|
264
|
+
// Should fail because DISCORD_TOKEN env var is not set
|
|
265
|
+
expect(result.results[0].error).toContain("bot token not found");
|
|
266
|
+
});
|
|
267
|
+
it("should calculate total duration", async () => {
|
|
268
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
269
|
+
const hooksConfig = {
|
|
270
|
+
after_run: [
|
|
271
|
+
{ type: "shell", command: "sleep 0.1" },
|
|
272
|
+
{ type: "shell", command: "sleep 0.1" },
|
|
273
|
+
],
|
|
274
|
+
};
|
|
275
|
+
const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
|
|
276
|
+
expect(result.totalDurationMs).toBeGreaterThanOrEqual(150); // At least 200ms combined
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
// =============================================================================
|
|
280
|
+
// US5: Error-Specific Hooks
|
|
281
|
+
// Tests that on_error hooks only run when job fails, while after_run hooks
|
|
282
|
+
// run regardless of success/failure (can filter with on_events)
|
|
283
|
+
// =============================================================================
|
|
284
|
+
describe("US5: Error-Specific Hooks", () => {
|
|
285
|
+
it("should NOT execute on_error hooks for completed (success) events", async () => {
|
|
286
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
287
|
+
const hooksConfig = {
|
|
288
|
+
on_error: [
|
|
289
|
+
{
|
|
290
|
+
type: "shell",
|
|
291
|
+
command: "echo 'error handler should not run'",
|
|
292
|
+
},
|
|
293
|
+
],
|
|
294
|
+
};
|
|
295
|
+
// Context is for a completed/success event
|
|
296
|
+
const result = await executor.executeHooks(hooksConfig, sampleContext, "on_error");
|
|
297
|
+
// on_error hooks should still execute if called directly (the filtering
|
|
298
|
+
// happens in ScheduleExecutor which only calls on_error for failed events)
|
|
299
|
+
// However, with on_events filtering, we can test the filter itself
|
|
300
|
+
expect(result.totalHooks).toBe(1);
|
|
301
|
+
});
|
|
302
|
+
it("should execute after_run hooks for completed events", async () => {
|
|
303
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
304
|
+
const hooksConfig = {
|
|
305
|
+
after_run: [
|
|
306
|
+
{
|
|
307
|
+
type: "shell",
|
|
308
|
+
command: "echo 'after_run for success'",
|
|
309
|
+
},
|
|
310
|
+
],
|
|
311
|
+
};
|
|
312
|
+
const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
|
|
313
|
+
expect(result.success).toBe(true);
|
|
314
|
+
expect(result.successfulHooks).toBe(1);
|
|
315
|
+
});
|
|
316
|
+
it("should execute after_run hooks for failed events", async () => {
|
|
317
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
318
|
+
const failedContext = {
|
|
319
|
+
...sampleContext,
|
|
320
|
+
event: "failed",
|
|
321
|
+
result: {
|
|
322
|
+
success: false,
|
|
323
|
+
output: "Job failed",
|
|
324
|
+
error: "Something went wrong",
|
|
325
|
+
},
|
|
326
|
+
};
|
|
327
|
+
const hooksConfig = {
|
|
328
|
+
after_run: [
|
|
329
|
+
{
|
|
330
|
+
type: "shell",
|
|
331
|
+
command: "echo 'after_run for failure'",
|
|
332
|
+
},
|
|
333
|
+
],
|
|
334
|
+
};
|
|
335
|
+
const result = await executor.executeHooks(hooksConfig, failedContext, "after_run");
|
|
336
|
+
expect(result.success).toBe(true);
|
|
337
|
+
expect(result.successfulHooks).toBe(1);
|
|
338
|
+
});
|
|
339
|
+
it("should allow after_run hooks to filter with on_events for error escalation", async () => {
|
|
340
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
341
|
+
const failedContext = {
|
|
342
|
+
...sampleContext,
|
|
343
|
+
event: "failed",
|
|
344
|
+
result: {
|
|
345
|
+
success: false,
|
|
346
|
+
output: "Job failed",
|
|
347
|
+
error: "Critical failure",
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
const hooksConfig = {
|
|
351
|
+
after_run: [
|
|
352
|
+
{
|
|
353
|
+
// This hook sends routine completions to general channel - should NOT run
|
|
354
|
+
type: "shell",
|
|
355
|
+
command: "echo 'general notification'",
|
|
356
|
+
on_events: ["completed"],
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
// This hook runs for all events
|
|
360
|
+
type: "shell",
|
|
361
|
+
command: "echo 'always runs'",
|
|
362
|
+
},
|
|
363
|
+
],
|
|
364
|
+
};
|
|
365
|
+
const result = await executor.executeHooks(hooksConfig, failedContext, "after_run");
|
|
366
|
+
expect(result.success).toBe(true);
|
|
367
|
+
expect(result.totalHooks).toBe(2);
|
|
368
|
+
expect(result.successfulHooks).toBe(1); // Only the unfiltered one ran
|
|
369
|
+
expect(result.skippedHooks).toBe(1); // The completed-only hook was skipped
|
|
370
|
+
});
|
|
371
|
+
it("should support separate on_error hooks for escalation while after_run logs all", async () => {
|
|
372
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
373
|
+
const failedContext = {
|
|
374
|
+
...sampleContext,
|
|
375
|
+
event: "failed",
|
|
376
|
+
result: {
|
|
377
|
+
success: false,
|
|
378
|
+
output: "Job failed",
|
|
379
|
+
error: "Critical failure",
|
|
380
|
+
},
|
|
381
|
+
};
|
|
382
|
+
// Config with both after_run (general logging) and on_error (escalation)
|
|
383
|
+
const hooksConfig = {
|
|
384
|
+
after_run: [
|
|
385
|
+
{
|
|
386
|
+
// General channel notification for all events
|
|
387
|
+
type: "shell",
|
|
388
|
+
command: "echo 'logged to general channel'",
|
|
389
|
+
},
|
|
390
|
+
],
|
|
391
|
+
on_error: [
|
|
392
|
+
{
|
|
393
|
+
// Escalation to on-call for failures only
|
|
394
|
+
type: "shell",
|
|
395
|
+
command: "echo 'escalated to on-call'",
|
|
396
|
+
},
|
|
397
|
+
],
|
|
398
|
+
};
|
|
399
|
+
// Execute after_run hooks
|
|
400
|
+
const afterRunResult = await executor.executeHooks(hooksConfig, failedContext, "after_run");
|
|
401
|
+
expect(afterRunResult.success).toBe(true);
|
|
402
|
+
expect(afterRunResult.successfulHooks).toBe(1);
|
|
403
|
+
// Execute on_error hooks
|
|
404
|
+
const onErrorResult = await executor.executeHooks(hooksConfig, failedContext, "on_error");
|
|
405
|
+
expect(onErrorResult.success).toBe(true);
|
|
406
|
+
expect(onErrorResult.successfulHooks).toBe(1);
|
|
407
|
+
});
|
|
408
|
+
it("should NOT run on_error hooks for timeout events (only failed)", async () => {
|
|
409
|
+
const executor = new HookExecutor({ logger: mockLogger });
|
|
410
|
+
const timeoutContext = {
|
|
411
|
+
...sampleContext,
|
|
412
|
+
event: "timeout",
|
|
413
|
+
result: {
|
|
414
|
+
success: false,
|
|
415
|
+
output: "",
|
|
416
|
+
error: "Job timed out",
|
|
417
|
+
},
|
|
418
|
+
};
|
|
419
|
+
const hooksConfig = {
|
|
420
|
+
on_error: [
|
|
421
|
+
{
|
|
422
|
+
type: "shell",
|
|
423
|
+
command: "echo 'on_error should not run for timeout'",
|
|
424
|
+
on_events: ["failed"], // Explicitly only for failed
|
|
425
|
+
},
|
|
426
|
+
],
|
|
427
|
+
after_run: [
|
|
428
|
+
{
|
|
429
|
+
type: "shell",
|
|
430
|
+
command: "echo 'after_run runs for timeout'",
|
|
431
|
+
},
|
|
432
|
+
],
|
|
433
|
+
};
|
|
434
|
+
// on_error with failed filter should skip timeout
|
|
435
|
+
const onErrorResult = await executor.executeHooks(hooksConfig, timeoutContext, "on_error");
|
|
436
|
+
expect(onErrorResult.skippedHooks).toBe(1);
|
|
437
|
+
// after_run should still run
|
|
438
|
+
const afterRunResult = await executor.executeHooks(hooksConfig, timeoutContext, "after_run");
|
|
439
|
+
expect(afterRunResult.successfulHooks).toBe(1);
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
//# sourceMappingURL=hook-executor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-executor.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/hook-executor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-runner.test.d.ts","sourceRoot":"","sources":["../../../src/hooks/__tests__/shell-runner.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|