@herdctl/slack 0.0.1 → 0.2.1
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/__tests__/command-handler.test.d.ts +2 -0
- package/dist/__tests__/command-handler.test.d.ts.map +1 -0
- package/dist/__tests__/command-handler.test.js +141 -0
- package/dist/__tests__/command-handler.test.js.map +1 -0
- package/dist/__tests__/error-handler.test.d.ts +2 -0
- package/dist/__tests__/error-handler.test.d.ts.map +1 -0
- package/dist/__tests__/error-handler.test.js +168 -0
- package/dist/__tests__/error-handler.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +133 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/formatting.test.d.ts +2 -0
- package/dist/__tests__/formatting.test.d.ts.map +1 -0
- package/dist/__tests__/formatting.test.js +216 -0
- package/dist/__tests__/formatting.test.js.map +1 -0
- package/dist/__tests__/logger.test.d.ts +2 -0
- package/dist/__tests__/logger.test.d.ts.map +1 -0
- package/dist/__tests__/logger.test.js +97 -0
- package/dist/__tests__/logger.test.js.map +1 -0
- package/dist/__tests__/message-handler.test.d.ts +2 -0
- package/dist/__tests__/message-handler.test.d.ts.map +1 -0
- package/dist/__tests__/message-handler.test.js +78 -0
- package/dist/__tests__/message-handler.test.js.map +1 -0
- package/dist/__tests__/session-manager.test.d.ts +2 -0
- package/dist/__tests__/session-manager.test.d.ts.map +1 -0
- package/dist/__tests__/session-manager.test.js +214 -0
- package/dist/__tests__/session-manager.test.js.map +1 -0
- package/dist/__tests__/slack-connector.test.d.ts +2 -0
- package/dist/__tests__/slack-connector.test.d.ts.map +1 -0
- package/dist/__tests__/slack-connector.test.js +376 -0
- package/dist/__tests__/slack-connector.test.js.map +1 -0
- package/dist/commands/command-handler.d.ts +72 -0
- package/dist/commands/command-handler.d.ts.map +1 -0
- package/dist/commands/command-handler.js +85 -0
- package/dist/commands/command-handler.js.map +1 -0
- package/dist/commands/help.d.ts +6 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +22 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/index.d.ts +11 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +10 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/reset.d.ts +6 -0
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +18 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +94 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/error-handler.d.ts +50 -0
- package/dist/error-handler.d.ts.map +1 -0
- package/dist/error-handler.js +123 -0
- package/dist/error-handler.js.map +1 -0
- package/dist/errors.d.ts +59 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +73 -0
- package/dist/errors.js.map +1 -0
- package/dist/formatting.d.ts +83 -0
- package/dist/formatting.d.ts.map +1 -0
- package/dist/formatting.js +155 -0
- package/dist/formatting.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +28 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +41 -0
- package/dist/logger.js.map +1 -0
- package/dist/message-handler.d.ts +62 -0
- package/dist/message-handler.d.ts.map +1 -0
- package/dist/message-handler.js +85 -0
- package/dist/message-handler.js.map +1 -0
- package/dist/session-manager/errors.d.ts +58 -0
- package/dist/session-manager/errors.d.ts.map +1 -0
- package/dist/session-manager/errors.js +70 -0
- package/dist/session-manager/errors.js.map +1 -0
- package/dist/session-manager/index.d.ts +9 -0
- package/dist/session-manager/index.d.ts.map +1 -0
- package/dist/session-manager/index.js +13 -0
- package/dist/session-manager/index.js.map +1 -0
- package/dist/session-manager/session-manager.d.ts +62 -0
- package/dist/session-manager/session-manager.d.ts.map +1 -0
- package/dist/session-manager/session-manager.js +320 -0
- package/dist/session-manager/session-manager.js.map +1 -0
- package/dist/session-manager/types.d.ts +154 -0
- package/dist/session-manager/types.d.ts.map +1 -0
- package/dist/session-manager/types.js +57 -0
- package/dist/session-manager/types.js.map +1 -0
- package/dist/slack-connector.d.ts +53 -0
- package/dist/slack-connector.d.ts.map +1 -0
- package/dist/slack-connector.js +447 -0
- package/dist/slack-connector.js.map +1 -0
- package/dist/types.d.ts +211 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +42 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Egghead Research
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-handler.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/command-handler.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { CommandHandler, } from "../commands/command-handler.js";
|
|
3
|
+
const createMockContext = (overrides = {}) => ({
|
|
4
|
+
agentName: "test-agent",
|
|
5
|
+
channelId: "C0123456789",
|
|
6
|
+
userId: "U0123456789",
|
|
7
|
+
reply: vi.fn().mockResolvedValue(undefined),
|
|
8
|
+
sessionManager: {
|
|
9
|
+
getOrCreateSession: vi.fn(),
|
|
10
|
+
touchSession: vi.fn(),
|
|
11
|
+
getSession: vi.fn(),
|
|
12
|
+
setSession: vi.fn(),
|
|
13
|
+
clearSession: vi.fn(),
|
|
14
|
+
cleanupExpiredSessions: vi.fn(),
|
|
15
|
+
getActiveSessionCount: vi.fn(),
|
|
16
|
+
},
|
|
17
|
+
connectorState: {
|
|
18
|
+
status: "connected",
|
|
19
|
+
botUser: { id: "UBOT", username: "test-bot" },
|
|
20
|
+
connectedAt: new Date().toISOString(),
|
|
21
|
+
reconnectAttempts: 0,
|
|
22
|
+
lastError: null,
|
|
23
|
+
},
|
|
24
|
+
...overrides,
|
|
25
|
+
});
|
|
26
|
+
const createTestCommand = (name, executeFn) => ({
|
|
27
|
+
name,
|
|
28
|
+
description: `Test ${name} command`,
|
|
29
|
+
execute: executeFn ?? vi.fn().mockResolvedValue(undefined),
|
|
30
|
+
});
|
|
31
|
+
describe("CommandHandler", () => {
|
|
32
|
+
describe("registerCommand", () => {
|
|
33
|
+
it("registers a command", () => {
|
|
34
|
+
const handler = new CommandHandler();
|
|
35
|
+
const command = createTestCommand("test");
|
|
36
|
+
handler.registerCommand(command);
|
|
37
|
+
expect(handler.getCommands()).toHaveLength(1);
|
|
38
|
+
expect(handler.getCommands()[0].name).toBe("test");
|
|
39
|
+
});
|
|
40
|
+
it("registers multiple commands", () => {
|
|
41
|
+
const handler = new CommandHandler();
|
|
42
|
+
handler.registerCommand(createTestCommand("cmd1"));
|
|
43
|
+
handler.registerCommand(createTestCommand("cmd2"));
|
|
44
|
+
expect(handler.getCommands()).toHaveLength(2);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe("isCommand", () => {
|
|
48
|
+
it("returns true for registered commands", () => {
|
|
49
|
+
const handler = new CommandHandler();
|
|
50
|
+
handler.registerCommand(createTestCommand("reset"));
|
|
51
|
+
expect(handler.isCommand("!reset")).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
it("returns false for unregistered commands", () => {
|
|
54
|
+
const handler = new CommandHandler();
|
|
55
|
+
handler.registerCommand(createTestCommand("reset"));
|
|
56
|
+
expect(handler.isCommand("!unknown")).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
it("returns false for non-command messages", () => {
|
|
59
|
+
const handler = new CommandHandler();
|
|
60
|
+
handler.registerCommand(createTestCommand("reset"));
|
|
61
|
+
expect(handler.isCommand("hello")).toBe(false);
|
|
62
|
+
});
|
|
63
|
+
it("is case-insensitive", () => {
|
|
64
|
+
const handler = new CommandHandler();
|
|
65
|
+
handler.registerCommand(createTestCommand("Reset"));
|
|
66
|
+
expect(handler.isCommand("!RESET")).toBe(true);
|
|
67
|
+
expect(handler.isCommand("!reset")).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
it("handles commands with extra whitespace", () => {
|
|
70
|
+
const handler = new CommandHandler();
|
|
71
|
+
handler.registerCommand(createTestCommand("reset"));
|
|
72
|
+
expect(handler.isCommand(" !reset ")).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
it("handles commands with arguments", () => {
|
|
75
|
+
const handler = new CommandHandler();
|
|
76
|
+
handler.registerCommand(createTestCommand("reset"));
|
|
77
|
+
expect(handler.isCommand("!reset --force")).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe("executeCommand", () => {
|
|
81
|
+
it("executes a registered command", async () => {
|
|
82
|
+
const executeFn = vi.fn().mockResolvedValue(undefined);
|
|
83
|
+
const handler = new CommandHandler();
|
|
84
|
+
handler.registerCommand(createTestCommand("test", executeFn));
|
|
85
|
+
const context = createMockContext();
|
|
86
|
+
const result = await handler.executeCommand("!test", context);
|
|
87
|
+
expect(result).toBe(true);
|
|
88
|
+
expect(executeFn).toHaveBeenCalledWith(context);
|
|
89
|
+
});
|
|
90
|
+
it("returns false for non-command messages", async () => {
|
|
91
|
+
const handler = new CommandHandler();
|
|
92
|
+
handler.registerCommand(createTestCommand("test"));
|
|
93
|
+
const context = createMockContext();
|
|
94
|
+
const result = await handler.executeCommand("hello", context);
|
|
95
|
+
expect(result).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
it("returns false for unregistered commands", async () => {
|
|
98
|
+
const handler = new CommandHandler();
|
|
99
|
+
const context = createMockContext();
|
|
100
|
+
const result = await handler.executeCommand("!unknown", context);
|
|
101
|
+
expect(result).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
it("handles command execution errors", async () => {
|
|
104
|
+
const handler = new CommandHandler();
|
|
105
|
+
handler.registerCommand(createTestCommand("fail", async () => {
|
|
106
|
+
throw new Error("Command failed");
|
|
107
|
+
}));
|
|
108
|
+
const context = createMockContext();
|
|
109
|
+
const result = await handler.executeCommand("!fail", context);
|
|
110
|
+
expect(result).toBe(true); // Command was attempted
|
|
111
|
+
expect(context.reply).toHaveBeenCalledWith(expect.stringContaining("error"));
|
|
112
|
+
});
|
|
113
|
+
it("handles reply error during error handling", async () => {
|
|
114
|
+
const handler = new CommandHandler();
|
|
115
|
+
handler.registerCommand(createTestCommand("fail", async () => {
|
|
116
|
+
throw new Error("Command failed");
|
|
117
|
+
}));
|
|
118
|
+
const context = createMockContext({
|
|
119
|
+
reply: vi.fn().mockRejectedValue(new Error("Reply failed")),
|
|
120
|
+
});
|
|
121
|
+
// Should not throw
|
|
122
|
+
const result = await handler.executeCommand("!fail", context);
|
|
123
|
+
expect(result).toBe(true);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe("getCommands", () => {
|
|
127
|
+
it("returns empty array when no commands registered", () => {
|
|
128
|
+
const handler = new CommandHandler();
|
|
129
|
+
expect(handler.getCommands()).toEqual([]);
|
|
130
|
+
});
|
|
131
|
+
it("returns all registered commands", () => {
|
|
132
|
+
const handler = new CommandHandler();
|
|
133
|
+
handler.registerCommand(createTestCommand("cmd1"));
|
|
134
|
+
handler.registerCommand(createTestCommand("cmd2"));
|
|
135
|
+
handler.registerCommand(createTestCommand("cmd3"));
|
|
136
|
+
const commands = handler.getCommands();
|
|
137
|
+
expect(commands).toHaveLength(3);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=command-handler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-handler.test.js","sourceRoot":"","sources":["../../src/__tests__/command-handler.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/error-handler.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { ErrorCategory, USER_ERROR_MESSAGES, classifyError, safeExecute, safeExecuteWithReply, } from "../error-handler.js";
|
|
3
|
+
const createMockLogger = () => ({
|
|
4
|
+
debug: vi.fn(),
|
|
5
|
+
info: vi.fn(),
|
|
6
|
+
warn: vi.fn(),
|
|
7
|
+
error: vi.fn(),
|
|
8
|
+
});
|
|
9
|
+
describe("ErrorCategory", () => {
|
|
10
|
+
it("has all expected categories", () => {
|
|
11
|
+
expect(ErrorCategory.AUTH).toBe("auth");
|
|
12
|
+
expect(ErrorCategory.RATE_LIMIT).toBe("rate_limit");
|
|
13
|
+
expect(ErrorCategory.NETWORK).toBe("network");
|
|
14
|
+
expect(ErrorCategory.API).toBe("api");
|
|
15
|
+
expect(ErrorCategory.INTERNAL).toBe("internal");
|
|
16
|
+
expect(ErrorCategory.UNKNOWN).toBe("unknown");
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
describe("USER_ERROR_MESSAGES", () => {
|
|
20
|
+
it("has messages for all categories", () => {
|
|
21
|
+
expect(USER_ERROR_MESSAGES.auth).toBeDefined();
|
|
22
|
+
expect(USER_ERROR_MESSAGES.rate_limit).toBeDefined();
|
|
23
|
+
expect(USER_ERROR_MESSAGES.network).toBeDefined();
|
|
24
|
+
expect(USER_ERROR_MESSAGES.api).toBeDefined();
|
|
25
|
+
expect(USER_ERROR_MESSAGES.internal).toBeDefined();
|
|
26
|
+
expect(USER_ERROR_MESSAGES.unknown).toBeDefined();
|
|
27
|
+
});
|
|
28
|
+
it("error messages are user-friendly", () => {
|
|
29
|
+
const messages = Object.values(USER_ERROR_MESSAGES);
|
|
30
|
+
for (const message of messages) {
|
|
31
|
+
expect(message).not.toMatch(/^Error:/);
|
|
32
|
+
expect(message).not.toContain(".ts:");
|
|
33
|
+
expect(message).not.toContain(".js:");
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("classifyError", () => {
|
|
38
|
+
it("classifies auth errors", () => {
|
|
39
|
+
const result = classifyError(new Error("invalid_auth"));
|
|
40
|
+
expect(result.category).toBe(ErrorCategory.AUTH);
|
|
41
|
+
expect(result.isRetryable).toBe(false);
|
|
42
|
+
expect(result.userMessage).toBe(USER_ERROR_MESSAGES.auth);
|
|
43
|
+
});
|
|
44
|
+
it("classifies token_expired as auth", () => {
|
|
45
|
+
const result = classifyError(new Error("token_expired"));
|
|
46
|
+
expect(result.category).toBe(ErrorCategory.AUTH);
|
|
47
|
+
expect(result.isRetryable).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
it("classifies token_revoked as auth", () => {
|
|
50
|
+
const result = classifyError(new Error("token_revoked"));
|
|
51
|
+
expect(result.category).toBe(ErrorCategory.AUTH);
|
|
52
|
+
expect(result.isRetryable).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
it("classifies not_authed as auth", () => {
|
|
55
|
+
const result = classifyError(new Error("not_authed"));
|
|
56
|
+
expect(result.category).toBe(ErrorCategory.AUTH);
|
|
57
|
+
expect(result.isRetryable).toBe(false);
|
|
58
|
+
});
|
|
59
|
+
it("does not classify unrelated 'token' substring as auth", () => {
|
|
60
|
+
const result = classifyError(new Error("invalid JSON token at position 42"));
|
|
61
|
+
expect(result.category).not.toBe(ErrorCategory.AUTH);
|
|
62
|
+
});
|
|
63
|
+
it("classifies rate limit errors", () => {
|
|
64
|
+
const result = classifyError(new Error("rate_limited"));
|
|
65
|
+
expect(result.category).toBe(ErrorCategory.RATE_LIMIT);
|
|
66
|
+
expect(result.isRetryable).toBe(true);
|
|
67
|
+
expect(result.userMessage).toBe(USER_ERROR_MESSAGES.rate_limit);
|
|
68
|
+
});
|
|
69
|
+
it("classifies ratelimited errors", () => {
|
|
70
|
+
const result = classifyError(new Error("ratelimited"));
|
|
71
|
+
expect(result.category).toBe(ErrorCategory.RATE_LIMIT);
|
|
72
|
+
expect(result.isRetryable).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
it("classifies network errors (ECONNREFUSED)", () => {
|
|
75
|
+
const result = classifyError(new Error("connect ECONNREFUSED"));
|
|
76
|
+
expect(result.category).toBe(ErrorCategory.NETWORK);
|
|
77
|
+
expect(result.isRetryable).toBe(true);
|
|
78
|
+
expect(result.userMessage).toBe(USER_ERROR_MESSAGES.network);
|
|
79
|
+
});
|
|
80
|
+
it("classifies network errors (ENOTFOUND)", () => {
|
|
81
|
+
const result = classifyError(new Error("getaddrinfo ENOTFOUND"));
|
|
82
|
+
expect(result.category).toBe(ErrorCategory.NETWORK);
|
|
83
|
+
expect(result.isRetryable).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
it("classifies timeout errors", () => {
|
|
86
|
+
const result = classifyError(new Error("Request timeout"));
|
|
87
|
+
expect(result.category).toBe(ErrorCategory.NETWORK);
|
|
88
|
+
expect(result.isRetryable).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
it("classifies Slack API errors", () => {
|
|
91
|
+
const result = classifyError(new Error("Slack API returned error"));
|
|
92
|
+
expect(result.category).toBe(ErrorCategory.API);
|
|
93
|
+
expect(result.isRetryable).toBe(true);
|
|
94
|
+
expect(result.userMessage).toBe(USER_ERROR_MESSAGES.api);
|
|
95
|
+
});
|
|
96
|
+
it("classifies unknown errors", () => {
|
|
97
|
+
const result = classifyError(new Error("Something unexpected"));
|
|
98
|
+
expect(result.category).toBe(ErrorCategory.UNKNOWN);
|
|
99
|
+
expect(result.isRetryable).toBe(false);
|
|
100
|
+
expect(result.userMessage).toBe(USER_ERROR_MESSAGES.unknown);
|
|
101
|
+
});
|
|
102
|
+
it("preserves original error", () => {
|
|
103
|
+
const error = new Error("test error");
|
|
104
|
+
const result = classifyError(error);
|
|
105
|
+
expect(result.originalError).toBe(error);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe("safeExecute", () => {
|
|
109
|
+
it("returns result on success", async () => {
|
|
110
|
+
const logger = createMockLogger();
|
|
111
|
+
const result = await safeExecute(async () => "success", logger, "test operation");
|
|
112
|
+
expect(result).toBe("success");
|
|
113
|
+
expect(logger.error).not.toHaveBeenCalled();
|
|
114
|
+
});
|
|
115
|
+
it("returns undefined and logs error on failure", async () => {
|
|
116
|
+
const logger = createMockLogger();
|
|
117
|
+
const result = await safeExecute(async () => {
|
|
118
|
+
throw new Error("Operation failed");
|
|
119
|
+
}, logger, "test operation");
|
|
120
|
+
expect(result).toBeUndefined();
|
|
121
|
+
expect(logger.error).toHaveBeenCalledWith("Error in test operation: Operation failed");
|
|
122
|
+
});
|
|
123
|
+
it("handles non-Error throws", async () => {
|
|
124
|
+
const logger = createMockLogger();
|
|
125
|
+
const result = await safeExecute(async () => {
|
|
126
|
+
throw "string error";
|
|
127
|
+
}, logger, "test");
|
|
128
|
+
expect(result).toBeUndefined();
|
|
129
|
+
expect(logger.error).toHaveBeenCalledWith("Error in test: string error");
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
describe("safeExecuteWithReply", () => {
|
|
133
|
+
it("executes function on success", async () => {
|
|
134
|
+
const logger = createMockLogger();
|
|
135
|
+
const reply = vi.fn();
|
|
136
|
+
const fn = vi.fn().mockResolvedValue(undefined);
|
|
137
|
+
await safeExecuteWithReply(fn, reply, logger, "test");
|
|
138
|
+
expect(fn).toHaveBeenCalled();
|
|
139
|
+
expect(reply).not.toHaveBeenCalled();
|
|
140
|
+
});
|
|
141
|
+
it("sends error reply on failure", async () => {
|
|
142
|
+
const logger = createMockLogger();
|
|
143
|
+
const reply = vi.fn();
|
|
144
|
+
await safeExecuteWithReply(async () => {
|
|
145
|
+
throw new Error("connect ECONNREFUSED");
|
|
146
|
+
}, reply, logger, "test");
|
|
147
|
+
expect(reply).toHaveBeenCalledWith(USER_ERROR_MESSAGES.network);
|
|
148
|
+
expect(logger.error).toHaveBeenCalled();
|
|
149
|
+
});
|
|
150
|
+
it("handles reply failure gracefully", async () => {
|
|
151
|
+
const logger = createMockLogger();
|
|
152
|
+
const reply = vi.fn().mockRejectedValue(new Error("Reply failed"));
|
|
153
|
+
await safeExecuteWithReply(async () => {
|
|
154
|
+
throw new Error("Original error");
|
|
155
|
+
}, reply, logger, "test");
|
|
156
|
+
// Should log both errors
|
|
157
|
+
expect(logger.error).toHaveBeenCalledTimes(2);
|
|
158
|
+
});
|
|
159
|
+
it("handles non-Error throws", async () => {
|
|
160
|
+
const logger = createMockLogger();
|
|
161
|
+
const reply = vi.fn();
|
|
162
|
+
await safeExecuteWithReply(async () => {
|
|
163
|
+
throw "string error";
|
|
164
|
+
}, reply, logger, "test");
|
|
165
|
+
expect(reply).toHaveBeenCalled();
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
//# sourceMappingURL=error-handler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.test.js","sourceRoot":"","sources":["../../src/__tests__/error-handler.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { SlackErrorCode, SlackConnectorError, SlackConnectionError, AlreadyConnectedError, MissingTokenError, InvalidTokenError, isSlackConnectorError, } from "../errors.js";
|
|
3
|
+
describe("SlackConnectorError", () => {
|
|
4
|
+
it("creates error with correct properties", () => {
|
|
5
|
+
const error = new SlackConnectorError("Test error message", SlackErrorCode.CONNECTION_FAILED);
|
|
6
|
+
expect(error.message).toBe("Test error message");
|
|
7
|
+
expect(error.code).toBe(SlackErrorCode.CONNECTION_FAILED);
|
|
8
|
+
expect(error.name).toBe("SlackConnectorError");
|
|
9
|
+
});
|
|
10
|
+
it("extends Error", () => {
|
|
11
|
+
const error = new SlackConnectorError("Test", SlackErrorCode.CONNECTION_FAILED);
|
|
12
|
+
expect(error).toBeInstanceOf(Error);
|
|
13
|
+
expect(error).toBeInstanceOf(SlackConnectorError);
|
|
14
|
+
});
|
|
15
|
+
it("preserves cause when provided", () => {
|
|
16
|
+
const cause = new Error("Original error");
|
|
17
|
+
const error = new SlackConnectorError("Wrapped error", SlackErrorCode.CONNECTION_FAILED, { cause });
|
|
18
|
+
expect(error.cause).toBe(cause);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe("SlackConnectionError", () => {
|
|
22
|
+
it("creates error with correct properties", () => {
|
|
23
|
+
const error = new SlackConnectionError("Connection timed out");
|
|
24
|
+
expect(error.message).toBe("Connection timed out");
|
|
25
|
+
expect(error.code).toBe(SlackErrorCode.CONNECTION_FAILED);
|
|
26
|
+
expect(error.name).toBe("SlackConnectionError");
|
|
27
|
+
});
|
|
28
|
+
it("extends SlackConnectorError", () => {
|
|
29
|
+
const error = new SlackConnectionError("Test");
|
|
30
|
+
expect(error).toBeInstanceOf(SlackConnectorError);
|
|
31
|
+
expect(error).toBeInstanceOf(Error);
|
|
32
|
+
});
|
|
33
|
+
it("preserves cause when provided", () => {
|
|
34
|
+
const cause = new Error("Socket error");
|
|
35
|
+
const error = new SlackConnectionError("Connection lost", { cause });
|
|
36
|
+
expect(error.cause).toBe(cause);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe("AlreadyConnectedError", () => {
|
|
40
|
+
it("creates error with correct message", () => {
|
|
41
|
+
const error = new AlreadyConnectedError();
|
|
42
|
+
expect(error.message).toBe("Slack connector is already connected");
|
|
43
|
+
expect(error.code).toBe(SlackErrorCode.ALREADY_CONNECTED);
|
|
44
|
+
expect(error.name).toBe("AlreadyConnectedError");
|
|
45
|
+
});
|
|
46
|
+
it("extends SlackConnectorError", () => {
|
|
47
|
+
const error = new AlreadyConnectedError();
|
|
48
|
+
expect(error).toBeInstanceOf(SlackConnectorError);
|
|
49
|
+
expect(error).toBeInstanceOf(Error);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("MissingTokenError", () => {
|
|
53
|
+
it("creates error for bot token", () => {
|
|
54
|
+
const error = new MissingTokenError("bot", "SLACK_BOT_TOKEN");
|
|
55
|
+
expect(error.message).toBe("Slack bot token not found in environment variable 'SLACK_BOT_TOKEN'");
|
|
56
|
+
expect(error.code).toBe(SlackErrorCode.MISSING_TOKEN);
|
|
57
|
+
expect(error.tokenType).toBe("bot");
|
|
58
|
+
expect(error.name).toBe("MissingTokenError");
|
|
59
|
+
});
|
|
60
|
+
it("creates error for app token", () => {
|
|
61
|
+
const error = new MissingTokenError("app", "SLACK_APP_TOKEN");
|
|
62
|
+
expect(error.message).toBe("Slack app token not found in environment variable 'SLACK_APP_TOKEN'");
|
|
63
|
+
expect(error.tokenType).toBe("app");
|
|
64
|
+
});
|
|
65
|
+
it("extends SlackConnectorError", () => {
|
|
66
|
+
const error = new MissingTokenError("bot", "TOKEN");
|
|
67
|
+
expect(error).toBeInstanceOf(SlackConnectorError);
|
|
68
|
+
expect(error).toBeInstanceOf(Error);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe("InvalidTokenError", () => {
|
|
72
|
+
it("creates error with message", () => {
|
|
73
|
+
const error = new InvalidTokenError("Token format is wrong");
|
|
74
|
+
expect(error.message).toBe("Token format is wrong");
|
|
75
|
+
expect(error.code).toBe(SlackErrorCode.INVALID_TOKEN);
|
|
76
|
+
expect(error.name).toBe("InvalidTokenError");
|
|
77
|
+
});
|
|
78
|
+
it("extends SlackConnectorError", () => {
|
|
79
|
+
const error = new InvalidTokenError("Test");
|
|
80
|
+
expect(error).toBeInstanceOf(SlackConnectorError);
|
|
81
|
+
expect(error).toBeInstanceOf(Error);
|
|
82
|
+
});
|
|
83
|
+
it("preserves cause when provided", () => {
|
|
84
|
+
const cause = new Error("Auth error");
|
|
85
|
+
const error = new InvalidTokenError("Bad token", { cause });
|
|
86
|
+
expect(error.cause).toBe(cause);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe("isSlackConnectorError", () => {
|
|
90
|
+
it("returns true for SlackConnectorError", () => {
|
|
91
|
+
const error = new SlackConnectorError("Test", SlackErrorCode.CONNECTION_FAILED);
|
|
92
|
+
expect(isSlackConnectorError(error)).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
it("returns true for SlackConnectionError", () => {
|
|
95
|
+
const error = new SlackConnectionError("Test");
|
|
96
|
+
expect(isSlackConnectorError(error)).toBe(true);
|
|
97
|
+
});
|
|
98
|
+
it("returns true for AlreadyConnectedError", () => {
|
|
99
|
+
const error = new AlreadyConnectedError();
|
|
100
|
+
expect(isSlackConnectorError(error)).toBe(true);
|
|
101
|
+
});
|
|
102
|
+
it("returns true for MissingTokenError", () => {
|
|
103
|
+
const error = new MissingTokenError("bot", "TOKEN");
|
|
104
|
+
expect(isSlackConnectorError(error)).toBe(true);
|
|
105
|
+
});
|
|
106
|
+
it("returns true for InvalidTokenError", () => {
|
|
107
|
+
const error = new InvalidTokenError("Test");
|
|
108
|
+
expect(isSlackConnectorError(error)).toBe(true);
|
|
109
|
+
});
|
|
110
|
+
it("returns false for regular Error", () => {
|
|
111
|
+
expect(isSlackConnectorError(new Error("Test"))).toBe(false);
|
|
112
|
+
});
|
|
113
|
+
it("returns false for null", () => {
|
|
114
|
+
expect(isSlackConnectorError(null)).toBe(false);
|
|
115
|
+
});
|
|
116
|
+
it("returns false for undefined", () => {
|
|
117
|
+
expect(isSlackConnectorError(undefined)).toBe(false);
|
|
118
|
+
});
|
|
119
|
+
it("returns false for string", () => {
|
|
120
|
+
expect(isSlackConnectorError("error message")).toBe(false);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe("SlackErrorCode", () => {
|
|
124
|
+
it("has all expected error codes", () => {
|
|
125
|
+
expect(SlackErrorCode.CONNECTION_FAILED).toBe("SLACK_CONNECTION_FAILED");
|
|
126
|
+
expect(SlackErrorCode.ALREADY_CONNECTED).toBe("SLACK_ALREADY_CONNECTED");
|
|
127
|
+
expect(SlackErrorCode.MISSING_TOKEN).toBe("SLACK_MISSING_TOKEN");
|
|
128
|
+
expect(SlackErrorCode.INVALID_TOKEN).toBe("SLACK_INVALID_TOKEN");
|
|
129
|
+
expect(SlackErrorCode.MESSAGE_SEND_FAILED).toBe("SLACK_MESSAGE_SEND_FAILED");
|
|
130
|
+
expect(SlackErrorCode.SOCKET_MODE_ERROR).toBe("SLACK_SOCKET_MODE_ERROR");
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=errors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/formatting.test.ts"],"names":[],"mappings":""}
|