agent-messenger 2.10.0 → 2.10.2
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/.claude-plugin/plugin.json +1 -1
- package/dist/package.json +1 -1
- package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/teams/token-extractor.js +15 -2
- package/dist/src/platforms/teams/token-extractor.js.map +1 -1
- package/dist/src/shared/chromium/decryptor.d.ts +6 -0
- package/dist/src/shared/chromium/decryptor.d.ts.map +1 -1
- package/dist/src/shared/chromium/decryptor.js +26 -6
- package/dist/src/shared/chromium/decryptor.js.map +1 -1
- package/e2e/channeltalk.e2e.test.ts +13 -13
- package/e2e/channeltalkbot.e2e.test.ts +13 -13
- package/e2e/discord.e2e.test.ts +24 -24
- package/e2e/discordbot.e2e.test.ts +16 -16
- package/e2e/instagram.e2e.test.ts +10 -10
- package/e2e/kakaotalk.e2e.test.ts +7 -7
- package/e2e/line.e2e.test.ts +8 -8
- package/e2e/slack.e2e.test.ts +34 -34
- package/e2e/slackbot.e2e.test.ts +14 -14
- package/e2e/teams.e2e.test.ts +23 -23
- package/e2e/telegram.e2e.test.ts +8 -8
- package/e2e/webex.e2e.test.ts +14 -14
- package/e2e/whatsapp.e2e.test.ts +8 -8
- package/e2e/whatsappbot.e2e.test.ts +6 -6
- package/package.json +1 -1
- package/skills/agent-channeltalk/SKILL.md +1 -1
- package/skills/agent-channeltalkbot/SKILL.md +1 -1
- package/skills/agent-discord/SKILL.md +1 -1
- package/skills/agent-discordbot/SKILL.md +1 -1
- package/skills/agent-instagram/SKILL.md +1 -1
- package/skills/agent-kakaotalk/SKILL.md +1 -1
- package/skills/agent-line/SKILL.md +1 -1
- package/skills/agent-slack/SKILL.md +1 -1
- package/skills/agent-slackbot/SKILL.md +1 -1
- package/skills/agent-teams/SKILL.md +1 -1
- package/skills/agent-telegram/SKILL.md +1 -1
- package/skills/agent-webex/SKILL.md +1 -1
- package/skills/agent-wechatbot/SKILL.md +1 -1
- package/skills/agent-whatsapp/SKILL.md +1 -1
- package/skills/agent-whatsappbot/SKILL.md +1 -1
- package/src/platforms/channeltalk/client.test.ts +26 -26
- package/src/platforms/channeltalk/commands/auth.test.ts +16 -16
- package/src/platforms/channeltalk/commands/bot.test.ts +2 -2
- package/src/platforms/channeltalk/commands/chat.test.ts +3 -3
- package/src/platforms/channeltalk/commands/group.test.ts +4 -4
- package/src/platforms/channeltalk/commands/manager.test.ts +2 -2
- package/src/platforms/channeltalk/commands/message.test.ts +17 -17
- package/src/platforms/channeltalk/commands/snapshot.test.ts +7 -7
- package/src/platforms/channeltalk/commands/whoami.test.ts +3 -3
- package/src/platforms/channeltalk/credential-manager.test.ts +18 -18
- package/src/platforms/channeltalk/ensure-auth.test.ts +5 -5
- package/src/platforms/channeltalk/index.test.ts +23 -23
- package/src/platforms/channeltalk/token-extractor.test.ts +21 -21
- package/src/platforms/channeltalk/types.test.ts +12 -12
- package/src/platforms/channeltalkbot/client.test.ts +14 -14
- package/src/platforms/channeltalkbot/commands/auth.test.ts +16 -16
- package/src/platforms/channeltalkbot/commands/bot.test.ts +6 -6
- package/src/platforms/channeltalkbot/commands/chat.test.ts +9 -9
- package/src/platforms/channeltalkbot/commands/group.test.ts +6 -6
- package/src/platforms/channeltalkbot/commands/manager.test.ts +3 -3
- package/src/platforms/channeltalkbot/commands/message.test.ts +10 -10
- package/src/platforms/channeltalkbot/commands/snapshot.test.ts +7 -7
- package/src/platforms/channeltalkbot/commands/whoami.test.ts +4 -4
- package/src/platforms/channeltalkbot/credential-manager.test.ts +27 -27
- package/src/platforms/channeltalkbot/index.test.ts +15 -15
- package/src/platforms/discord/client.test.ts +28 -28
- package/src/platforms/discord/commands/auth.test.ts +7 -7
- package/src/platforms/discord/commands/channel.test.ts +7 -7
- package/src/platforms/discord/commands/dm.test.ts +4 -4
- package/src/platforms/discord/commands/file.test.ts +4 -4
- package/src/platforms/discord/commands/friend.test.ts +6 -6
- package/src/platforms/discord/commands/member.test.ts +5 -5
- package/src/platforms/discord/commands/mention.test.ts +5 -5
- package/src/platforms/discord/commands/message.test.ts +9 -9
- package/src/platforms/discord/commands/note.test.ts +6 -6
- package/src/platforms/discord/commands/profile.test.ts +4 -4
- package/src/platforms/discord/commands/reaction.test.ts +5 -5
- package/src/platforms/discord/commands/server.test.ts +7 -7
- package/src/platforms/discord/commands/snapshot.test.ts +6 -6
- package/src/platforms/discord/commands/thread.test.ts +6 -6
- package/src/platforms/discord/commands/user.test.ts +5 -5
- package/src/platforms/discord/commands/whoami.test.ts +6 -6
- package/src/platforms/discord/credential-manager.test.ts +16 -16
- package/src/platforms/discord/ensure-auth.test.ts +8 -8
- package/src/platforms/discord/index.test.ts +17 -17
- package/src/platforms/discord/listener.test.ts +33 -33
- package/src/platforms/discord/token-extractor.test.ts +53 -53
- package/src/platforms/discord/types.test.ts +26 -26
- package/src/platforms/discordbot/client.test.ts +31 -31
- package/src/platforms/discordbot/commands/auth.test.ts +18 -18
- package/src/platforms/discordbot/commands/channel.test.ts +11 -11
- package/src/platforms/discordbot/commands/file.test.ts +7 -7
- package/src/platforms/discordbot/commands/message.test.ts +25 -25
- package/src/platforms/discordbot/commands/reaction.test.ts +6 -6
- package/src/platforms/discordbot/commands/server.test.ts +12 -12
- package/src/platforms/discordbot/commands/snapshot.test.ts +13 -13
- package/src/platforms/discordbot/commands/thread.test.ts +10 -10
- package/src/platforms/discordbot/commands/user.test.ts +9 -9
- package/src/platforms/discordbot/commands/whoami.test.ts +4 -4
- package/src/platforms/discordbot/credential-manager.test.ts +28 -28
- package/src/platforms/instagram/client.test.ts +18 -18
- package/src/platforms/instagram/commands/auth.test.ts +11 -11
- package/src/platforms/instagram/commands/chat.test.ts +6 -6
- package/src/platforms/instagram/commands/message.test.ts +11 -11
- package/src/platforms/instagram/commands/shared.test.ts +12 -12
- package/src/platforms/instagram/commands/whoami.test.ts +3 -3
- package/src/platforms/instagram/credential-manager.test.ts +21 -21
- package/src/platforms/instagram/ensure-auth.test.ts +4 -4
- package/src/platforms/instagram/index.test.ts +9 -9
- package/src/platforms/instagram/listener.test.ts +8 -8
- package/src/platforms/instagram/token-extractor.test.ts +35 -35
- package/src/platforms/kakaotalk/client.test.ts +33 -33
- package/src/platforms/kakaotalk/commands/auth.test.ts +11 -11
- package/src/platforms/kakaotalk/commands/chat.test.ts +6 -6
- package/src/platforms/kakaotalk/commands/message.test.ts +7 -7
- package/src/platforms/kakaotalk/commands/whoami.test.ts +5 -5
- package/src/platforms/kakaotalk/credential-manager.test.ts +15 -15
- package/src/platforms/kakaotalk/index.test.ts +15 -15
- package/src/platforms/kakaotalk/listener.test.ts +17 -17
- package/src/platforms/line/client.test.ts +17 -17
- package/src/platforms/line/commands/auth.test.ts +8 -8
- package/src/platforms/line/commands/chat.test.ts +7 -7
- package/src/platforms/line/commands/friend.test.ts +6 -6
- package/src/platforms/line/commands/message.test.ts +7 -7
- package/src/platforms/line/commands/whoami.test.ts +6 -6
- package/src/platforms/line/credential-manager.test.ts +17 -17
- package/src/platforms/line/index.test.ts +10 -10
- package/src/platforms/line/listener.test.ts +15 -15
- package/src/platforms/line/types.test.ts +14 -14
- package/src/platforms/slack/cli.test.ts +8 -8
- package/src/platforms/slack/client.test.ts +151 -151
- package/src/platforms/slack/commands/activity.test.ts +13 -13
- package/src/platforms/slack/commands/auth.test.ts +34 -34
- package/src/platforms/slack/commands/bookmark.test.ts +9 -9
- package/src/platforms/slack/commands/channel.test.ts +17 -17
- package/src/platforms/slack/commands/drafts.test.ts +7 -7
- package/src/platforms/slack/commands/emoji.test.ts +3 -3
- package/src/platforms/slack/commands/file.test.ts +12 -12
- package/src/platforms/slack/commands/message.test.ts +19 -19
- package/src/platforms/slack/commands/pin.test.ts +7 -7
- package/src/platforms/slack/commands/reaction.test.ts +10 -10
- package/src/platforms/slack/commands/reminder.test.ts +9 -9
- package/src/platforms/slack/commands/saved.test.ts +7 -7
- package/src/platforms/slack/commands/sections.test.ts +5 -5
- package/src/platforms/slack/commands/snapshot.test.ts +13 -13
- package/src/platforms/slack/commands/unread.test.ts +6 -6
- package/src/platforms/slack/commands/user.test.ts +10 -10
- package/src/platforms/slack/commands/usergroup.test.ts +15 -15
- package/src/platforms/slack/commands/whoami.test.ts +6 -6
- package/src/platforms/slack/commands/workspace.test.ts +26 -26
- package/src/platforms/slack/credential-manager.test.ts +14 -14
- package/src/platforms/slack/ensure-auth.test.ts +21 -21
- package/src/platforms/slack/index.test.ts +12 -12
- package/src/platforms/slack/listener.test.ts +17 -17
- package/src/platforms/slack/token-extractor-node.test.ts +2 -2
- package/src/platforms/slack/token-extractor.test.ts +37 -37
- package/src/platforms/slack/types.test.ts +21 -21
- package/src/platforms/slackbot/client.test.ts +22 -22
- package/src/platforms/slackbot/commands/auth.test.ts +14 -14
- package/src/platforms/slackbot/commands/channel.test.ts +7 -7
- package/src/platforms/slackbot/commands/message.test.ts +13 -13
- package/src/platforms/slackbot/commands/reaction.test.ts +6 -6
- package/src/platforms/slackbot/commands/user.test.ts +7 -7
- package/src/platforms/slackbot/commands/whoami.test.ts +4 -4
- package/src/platforms/slackbot/credential-manager.test.ts +22 -22
- package/src/platforms/slackbot/types.test.ts +7 -7
- package/src/platforms/teams/client.test.ts +30 -30
- package/src/platforms/teams/commands/auth.test.ts +8 -8
- package/src/platforms/teams/commands/channel.test.ts +7 -7
- package/src/platforms/teams/commands/file.test.ts +4 -4
- package/src/platforms/teams/commands/message.test.ts +5 -5
- package/src/platforms/teams/commands/reaction.test.ts +4 -4
- package/src/platforms/teams/commands/snapshot.test.ts +7 -7
- package/src/platforms/teams/commands/team.test.ts +8 -8
- package/src/platforms/teams/commands/user.test.ts +4 -4
- package/src/platforms/teams/commands/whoami.test.ts +6 -6
- package/src/platforms/teams/credential-manager.test.ts +17 -17
- package/src/platforms/teams/ensure-auth.test.ts +13 -13
- package/src/platforms/teams/index.test.ts +15 -15
- package/src/platforms/teams/token-extractor.test.ts +219 -145
- package/src/platforms/teams/token-extractor.ts +13 -2
- package/src/platforms/teams/types.test.ts +26 -26
- package/src/platforms/telegram/app-config.test.ts +4 -4
- package/src/platforms/telegram/chat-utils.test.ts +12 -12
- package/src/platforms/telegram/client.test.ts +4 -4
- package/src/platforms/telegram/commands/auth.test.ts +16 -16
- package/src/platforms/telegram/commands/chat.test.ts +9 -9
- package/src/platforms/telegram/commands/message.test.ts +6 -6
- package/src/platforms/telegram/commands/shared.test.ts +3 -3
- package/src/platforms/telegram/commands/whoami.test.ts +3 -3
- package/src/platforms/telegram/credential-manager.test.ts +10 -10
- package/src/platforms/telegram/types.test.ts +6 -6
- package/src/platforms/webex/app-config.test.ts +8 -8
- package/src/platforms/webex/cli.test.ts +5 -5
- package/src/platforms/webex/client.test.ts +65 -65
- package/src/platforms/webex/commands/auth.test.ts +18 -18
- package/src/platforms/webex/commands/member.test.ts +5 -5
- package/src/platforms/webex/commands/message.test.ts +12 -12
- package/src/platforms/webex/commands/snapshot.test.ts +5 -5
- package/src/platforms/webex/commands/space.test.ts +10 -10
- package/src/platforms/webex/commands/whoami.test.ts +6 -6
- package/src/platforms/webex/credential-manager.test.ts +22 -22
- package/src/platforms/webex/encryption.test.ts +4 -4
- package/src/platforms/webex/ensure-auth.test.ts +5 -5
- package/src/platforms/webex/index.test.ts +5 -5
- package/src/platforms/webex/markdown-to-html.test.ts +33 -33
- package/src/platforms/webex/token-extractor.test.ts +23 -23
- package/src/platforms/webex/types.test.ts +27 -27
- package/src/platforms/wechatbot/client.test.ts +27 -27
- package/src/platforms/wechatbot/commands/auth.test.ts +15 -15
- package/src/platforms/wechatbot/commands/message.test.ts +8 -8
- package/src/platforms/wechatbot/commands/template.test.ts +9 -9
- package/src/platforms/wechatbot/commands/user.test.ts +7 -7
- package/src/platforms/wechatbot/commands/whoami.test.ts +5 -5
- package/src/platforms/wechatbot/credential-manager.test.ts +18 -18
- package/src/platforms/wechatbot/index.test.ts +10 -10
- package/src/platforms/wechatbot/types.test.ts +25 -25
- package/src/platforms/whatsapp/commands/auth.test.ts +13 -13
- package/src/platforms/whatsapp/commands/chat.test.ts +8 -8
- package/src/platforms/whatsapp/commands/message.test.ts +10 -10
- package/src/platforms/whatsapp/commands/whoami.test.ts +3 -3
- package/src/platforms/whatsapp/credential-manager.test.ts +23 -23
- package/src/platforms/whatsapp/ensure-auth.test.ts +4 -4
- package/src/platforms/whatsapp/index.test.ts +8 -8
- package/src/platforms/whatsapp/types.test.ts +42 -42
- package/src/platforms/whatsappbot/client.test.ts +27 -27
- package/src/platforms/whatsappbot/commands/auth.test.ts +14 -14
- package/src/platforms/whatsappbot/commands/message.test.ts +16 -16
- package/src/platforms/whatsappbot/commands/template.test.ts +9 -9
- package/src/platforms/whatsappbot/commands/whoami.test.ts +5 -5
- package/src/platforms/whatsappbot/credential-manager.test.ts +18 -18
- package/src/platforms/whatsappbot/index.test.ts +7 -7
- package/src/platforms/whatsappbot/types.test.ts +18 -18
- package/src/shared/chromium/browsers.test.ts +22 -22
- package/src/shared/chromium/cookie-reader.test.ts +13 -13
- package/src/shared/chromium/decryptor.test.ts +97 -32
- package/src/shared/chromium/decryptor.ts +27 -6
- package/src/shared/utils/concurrency.test.ts +6 -6
- package/src/shared/utils/derived-key-cache.test.ts +11 -11
- package/src/tui/utils.test.ts +31 -31
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
|
|
2
2
|
import { existsSync, rmSync } from 'node:fs'
|
|
3
3
|
import { mkdir, stat } from 'node:fs/promises'
|
|
4
4
|
import { tmpdir } from 'node:os'
|
|
@@ -50,7 +50,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
50
50
|
})
|
|
51
51
|
|
|
52
52
|
describe('load', () => {
|
|
53
|
-
|
|
53
|
+
it('returns empty config when no file exists', async () => {
|
|
54
54
|
const config = await manager.load()
|
|
55
55
|
|
|
56
56
|
expect(config.current).toBeNull()
|
|
@@ -59,7 +59,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
59
59
|
})
|
|
60
60
|
|
|
61
61
|
describe('save and load', () => {
|
|
62
|
-
|
|
62
|
+
it('persists config to file', async () => {
|
|
63
63
|
const config = {
|
|
64
64
|
current: { workspace_id: 'T123', bot_id: 'deploy' },
|
|
65
65
|
workspaces: {
|
|
@@ -81,11 +81,11 @@ describe('SlackBotCredentialManager', () => {
|
|
|
81
81
|
})
|
|
82
82
|
|
|
83
83
|
describe('getCredentials', () => {
|
|
84
|
-
|
|
84
|
+
it('returns null when no credentials exist', async () => {
|
|
85
85
|
expect(await manager.getCredentials()).toBeNull()
|
|
86
86
|
})
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
it('returns current bot credentials', async () => {
|
|
89
89
|
await manager.setCredentials(CREDS_A)
|
|
90
90
|
|
|
91
91
|
const creds = await manager.getCredentials()
|
|
@@ -93,7 +93,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
93
93
|
expect(creds).toEqual(CREDS_A)
|
|
94
94
|
})
|
|
95
95
|
|
|
96
|
-
|
|
96
|
+
it('returns specific bot by id', async () => {
|
|
97
97
|
await manager.setCredentials(CREDS_A)
|
|
98
98
|
await manager.setCredentials(CREDS_B)
|
|
99
99
|
|
|
@@ -102,7 +102,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
102
102
|
expect(creds).toEqual(CREDS_A)
|
|
103
103
|
})
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
it('returns specific bot by workspace_id/bot_id', async () => {
|
|
106
106
|
await manager.setCredentials(CREDS_A)
|
|
107
107
|
await manager.setCredentials(CREDS_C)
|
|
108
108
|
|
|
@@ -111,7 +111,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
111
111
|
expect(creds).toEqual(CREDS_A)
|
|
112
112
|
})
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
it('returns null for ambiguous bot_id across workspaces', async () => {
|
|
115
115
|
await manager.setCredentials(CREDS_A)
|
|
116
116
|
await manager.setCredentials(CREDS_C)
|
|
117
117
|
|
|
@@ -120,7 +120,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
120
120
|
expect(creds).toBeNull()
|
|
121
121
|
})
|
|
122
122
|
|
|
123
|
-
|
|
123
|
+
it('env vars take precedence over file', async () => {
|
|
124
124
|
await manager.setCredentials(CREDS_A)
|
|
125
125
|
|
|
126
126
|
process.env.E2E_SLACKBOT_TOKEN = 'xoxb-env-token'
|
|
@@ -136,7 +136,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
136
136
|
})
|
|
137
137
|
|
|
138
138
|
describe('setCredentials', () => {
|
|
139
|
-
|
|
139
|
+
it('stores bot and sets as current', async () => {
|
|
140
140
|
await manager.setCredentials(CREDS_A)
|
|
141
141
|
|
|
142
142
|
const config = await manager.load()
|
|
@@ -144,7 +144,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
144
144
|
expect(config.workspaces.T123.bots.deploy.token).toBe('xoxb-token-a')
|
|
145
145
|
})
|
|
146
146
|
|
|
147
|
-
|
|
147
|
+
it('stores multiple bots in same workspace', async () => {
|
|
148
148
|
await manager.setCredentials(CREDS_A)
|
|
149
149
|
await manager.setCredentials(CREDS_B)
|
|
150
150
|
|
|
@@ -153,7 +153,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
153
153
|
expect(config.current).toEqual({ workspace_id: 'T123', bot_id: 'alert' })
|
|
154
154
|
})
|
|
155
155
|
|
|
156
|
-
|
|
156
|
+
it('stores bots across workspaces', async () => {
|
|
157
157
|
await manager.setCredentials(CREDS_A)
|
|
158
158
|
await manager.setCredentials(CREDS_C)
|
|
159
159
|
|
|
@@ -163,7 +163,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
163
163
|
})
|
|
164
164
|
|
|
165
165
|
describe('listAll', () => {
|
|
166
|
-
|
|
166
|
+
it('returns all bots with current flag', async () => {
|
|
167
167
|
await manager.setCredentials(CREDS_A)
|
|
168
168
|
await manager.setCredentials(CREDS_B)
|
|
169
169
|
|
|
@@ -176,7 +176,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
176
176
|
})
|
|
177
177
|
|
|
178
178
|
describe('setCurrent', () => {
|
|
179
|
-
|
|
179
|
+
it('switches current bot', async () => {
|
|
180
180
|
await manager.setCredentials(CREDS_A)
|
|
181
181
|
await manager.setCredentials(CREDS_B)
|
|
182
182
|
|
|
@@ -187,13 +187,13 @@ describe('SlackBotCredentialManager', () => {
|
|
|
187
187
|
expect(creds?.bot_id).toBe('deploy')
|
|
188
188
|
})
|
|
189
189
|
|
|
190
|
-
|
|
190
|
+
it('returns false for unknown bot', async () => {
|
|
191
191
|
expect(await manager.setCurrent('nonexistent')).toBe(false)
|
|
192
192
|
})
|
|
193
193
|
})
|
|
194
194
|
|
|
195
195
|
describe('removeBot', () => {
|
|
196
|
-
|
|
196
|
+
it('removes a bot by id', async () => {
|
|
197
197
|
await manager.setCredentials(CREDS_A)
|
|
198
198
|
await manager.setCredentials(CREDS_B)
|
|
199
199
|
|
|
@@ -204,7 +204,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
204
204
|
expect(Object.keys(config.workspaces.T123.bots)).toEqual(['alert'])
|
|
205
205
|
})
|
|
206
206
|
|
|
207
|
-
|
|
207
|
+
it('removes workspace when last bot removed', async () => {
|
|
208
208
|
await manager.setCredentials(CREDS_A)
|
|
209
209
|
|
|
210
210
|
await manager.removeBot('deploy')
|
|
@@ -213,7 +213,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
213
213
|
expect(config.workspaces.T123).toBeUndefined()
|
|
214
214
|
})
|
|
215
215
|
|
|
216
|
-
|
|
216
|
+
it('clears current when current bot removed', async () => {
|
|
217
217
|
await manager.setCredentials(CREDS_A)
|
|
218
218
|
|
|
219
219
|
await manager.removeBot('deploy')
|
|
@@ -222,11 +222,11 @@ describe('SlackBotCredentialManager', () => {
|
|
|
222
222
|
expect(config.current).toBeNull()
|
|
223
223
|
})
|
|
224
224
|
|
|
225
|
-
|
|
225
|
+
it('returns false for unknown bot', async () => {
|
|
226
226
|
expect(await manager.removeBot('nonexistent')).toBe(false)
|
|
227
227
|
})
|
|
228
228
|
|
|
229
|
-
|
|
229
|
+
it('returns false for ambiguous bot_id across workspaces', async () => {
|
|
230
230
|
await manager.setCredentials(CREDS_A)
|
|
231
231
|
await manager.setCredentials(CREDS_C)
|
|
232
232
|
|
|
@@ -240,7 +240,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
240
240
|
})
|
|
241
241
|
|
|
242
242
|
describe('clearCredentials', () => {
|
|
243
|
-
|
|
243
|
+
it('removes all credentials', async () => {
|
|
244
244
|
await manager.setCredentials(CREDS_A)
|
|
245
245
|
await manager.setCredentials(CREDS_B)
|
|
246
246
|
|
|
@@ -253,7 +253,7 @@ describe('SlackBotCredentialManager', () => {
|
|
|
253
253
|
})
|
|
254
254
|
|
|
255
255
|
describe('file permissions', () => {
|
|
256
|
-
|
|
256
|
+
it('saves file with secure permissions (600)', async () => {
|
|
257
257
|
await manager.setCredentials(CREDS_A)
|
|
258
258
|
|
|
259
259
|
const credPath = join(tempDir, 'slackbot-credentials.json')
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, expect,
|
|
1
|
+
import { describe, expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
type SlackBotConfig,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from './types'
|
|
10
10
|
|
|
11
11
|
describe('SlackBotError', () => {
|
|
12
|
-
|
|
12
|
+
it('creates error with message and code', () => {
|
|
13
13
|
const error = new SlackBotError('Token is invalid', 'invalid_auth')
|
|
14
14
|
|
|
15
15
|
expect(error.message).toBe('Token is invalid')
|
|
@@ -20,7 +20,7 @@ describe('SlackBotError', () => {
|
|
|
20
20
|
})
|
|
21
21
|
|
|
22
22
|
describe('SlackBotCredentialsSchema', () => {
|
|
23
|
-
|
|
23
|
+
it('validates correct bot token credentials', () => {
|
|
24
24
|
const creds: SlackBotCredentials = {
|
|
25
25
|
token: 'xoxb-123456789-abcdef',
|
|
26
26
|
workspace_id: 'T12345678',
|
|
@@ -33,7 +33,7 @@ describe('SlackBotCredentialsSchema', () => {
|
|
|
33
33
|
expect(result.success).toBe(true)
|
|
34
34
|
})
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
it('rejects user tokens (xoxp-)', () => {
|
|
37
37
|
const creds = {
|
|
38
38
|
token: 'xoxp-123456789-abcdef',
|
|
39
39
|
workspace_id: 'T12345678',
|
|
@@ -46,7 +46,7 @@ describe('SlackBotCredentialsSchema', () => {
|
|
|
46
46
|
expect(result.success).toBe(false)
|
|
47
47
|
})
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
it('rejects missing fields', () => {
|
|
50
50
|
const creds = {
|
|
51
51
|
token: 'xoxb-123456789-abcdef',
|
|
52
52
|
}
|
|
@@ -57,7 +57,7 @@ describe('SlackBotCredentialsSchema', () => {
|
|
|
57
57
|
})
|
|
58
58
|
|
|
59
59
|
describe('SlackBotConfigSchema', () => {
|
|
60
|
-
|
|
60
|
+
it('validates correct config', () => {
|
|
61
61
|
const config: SlackBotConfig = {
|
|
62
62
|
current: { workspace_id: 'T12345678', bot_id: 'deploy' },
|
|
63
63
|
workspaces: {
|
|
@@ -79,7 +79,7 @@ describe('SlackBotConfigSchema', () => {
|
|
|
79
79
|
expect(result.success).toBe(true)
|
|
80
80
|
})
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
it('validates config with null current', () => {
|
|
83
83
|
const config: SlackBotConfig = {
|
|
84
84
|
current: null,
|
|
85
85
|
workspaces: {},
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
|
|
2
2
|
import { unlinkSync } from 'node:fs'
|
|
3
3
|
|
|
4
4
|
import { TeamsClient } from './client'
|
|
@@ -54,17 +54,17 @@ describe('TeamsClient', () => {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
describe('login', () => {
|
|
57
|
-
|
|
57
|
+
it('requires token', async () => {
|
|
58
58
|
await expect(new TeamsClient().login({ token: '', region: 'emea' })).rejects.toThrow(TeamsError)
|
|
59
59
|
await expect(new TeamsClient().login({ token: '', region: 'emea' })).rejects.toThrow('Token is required')
|
|
60
60
|
})
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
it('accepts valid token', async () => {
|
|
63
63
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
64
64
|
expect(client).toBeInstanceOf(TeamsClient)
|
|
65
65
|
})
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
it('accepts token with expiry time', async () => {
|
|
68
68
|
const expiresAt = new Date(Date.now() + 3600000).toISOString()
|
|
69
69
|
const client = await new TeamsClient().login({ token: 'test-token', tokenExpiresAt: expiresAt, region: 'emea' })
|
|
70
70
|
expect(client).toBeInstanceOf(TeamsClient)
|
|
@@ -72,7 +72,7 @@ describe('TeamsClient', () => {
|
|
|
72
72
|
})
|
|
73
73
|
|
|
74
74
|
describe('token expiry', () => {
|
|
75
|
-
|
|
75
|
+
it('throws when token is expired', async () => {
|
|
76
76
|
const expiredAt = new Date(Date.now() - 1000).toISOString()
|
|
77
77
|
const client = await new TeamsClient().login({
|
|
78
78
|
token: 'expired-token',
|
|
@@ -84,7 +84,7 @@ describe('TeamsClient', () => {
|
|
|
84
84
|
await expect(client.testAuth()).rejects.toThrow('Token has expired')
|
|
85
85
|
})
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
it('works when token is not expired', async () => {
|
|
88
88
|
const expiresAt = new Date(Date.now() + 3600000).toISOString()
|
|
89
89
|
mockResponse({
|
|
90
90
|
userDetails: JSON.stringify({ name: 'Test User' }),
|
|
@@ -100,7 +100,7 @@ describe('TeamsClient', () => {
|
|
|
100
100
|
})
|
|
101
101
|
|
|
102
102
|
describe('testAuth', () => {
|
|
103
|
-
|
|
103
|
+
it('returns current user info', async () => {
|
|
104
104
|
mockResponse({
|
|
105
105
|
userDetails: JSON.stringify({ name: 'Test User' }),
|
|
106
106
|
locale: 'en-us',
|
|
@@ -118,7 +118,7 @@ describe('TeamsClient', () => {
|
|
|
118
118
|
})
|
|
119
119
|
})
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
it('throws TeamsError on API error', async () => {
|
|
122
122
|
mockResponse({ message: 'Unauthorized', code: 'unauthorized' }, 401)
|
|
123
123
|
|
|
124
124
|
const client = await new TeamsClient().login({ token: 'bad-token', region: 'emea' })
|
|
@@ -127,7 +127,7 @@ describe('TeamsClient', () => {
|
|
|
127
127
|
})
|
|
128
128
|
|
|
129
129
|
describe('listTeams', () => {
|
|
130
|
-
|
|
130
|
+
it('returns list of teams from conversations', async () => {
|
|
131
131
|
mockResponse({
|
|
132
132
|
conversations: [
|
|
133
133
|
{
|
|
@@ -170,7 +170,7 @@ describe('TeamsClient', () => {
|
|
|
170
170
|
})
|
|
171
171
|
|
|
172
172
|
describe('getTeam', () => {
|
|
173
|
-
|
|
173
|
+
it('returns team info', async () => {
|
|
174
174
|
mockResponse({ id: '111', name: 'Test Team', description: 'A test team' })
|
|
175
175
|
|
|
176
176
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
@@ -183,7 +183,7 @@ describe('TeamsClient', () => {
|
|
|
183
183
|
})
|
|
184
184
|
|
|
185
185
|
describe('listChannels', () => {
|
|
186
|
-
|
|
186
|
+
it('returns list of channels for team', async () => {
|
|
187
187
|
mockResponse([
|
|
188
188
|
{ id: 'ch1', team_id: '111', name: 'General', type: 'standard' },
|
|
189
189
|
{ id: 'ch2', team_id: '111', name: 'Random', type: 'standard' },
|
|
@@ -199,7 +199,7 @@ describe('TeamsClient', () => {
|
|
|
199
199
|
})
|
|
200
200
|
|
|
201
201
|
describe('getChannel', () => {
|
|
202
|
-
|
|
202
|
+
it('returns channel info', async () => {
|
|
203
203
|
mockResponse({ id: 'ch1', team_id: '111', name: 'General', type: 'standard' })
|
|
204
204
|
|
|
205
205
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
@@ -212,7 +212,7 @@ describe('TeamsClient', () => {
|
|
|
212
212
|
})
|
|
213
213
|
|
|
214
214
|
describe('sendMessage', () => {
|
|
215
|
-
|
|
215
|
+
it('sends message to channel', async () => {
|
|
216
216
|
mockResponse({
|
|
217
217
|
id: 'msg1',
|
|
218
218
|
channel_id: 'ch1',
|
|
@@ -232,7 +232,7 @@ describe('TeamsClient', () => {
|
|
|
232
232
|
})
|
|
233
233
|
|
|
234
234
|
describe('getMessages', () => {
|
|
235
|
-
|
|
235
|
+
it('returns messages from channel', async () => {
|
|
236
236
|
mockResponse([
|
|
237
237
|
{
|
|
238
238
|
id: 'msg1',
|
|
@@ -253,7 +253,7 @@ describe('TeamsClient', () => {
|
|
|
253
253
|
)
|
|
254
254
|
})
|
|
255
255
|
|
|
256
|
-
|
|
256
|
+
it('uses default limit of 50', async () => {
|
|
257
257
|
mockResponse([])
|
|
258
258
|
|
|
259
259
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
@@ -266,7 +266,7 @@ describe('TeamsClient', () => {
|
|
|
266
266
|
})
|
|
267
267
|
|
|
268
268
|
describe('getMessage', () => {
|
|
269
|
-
|
|
269
|
+
it('returns single message', async () => {
|
|
270
270
|
mockResponse({
|
|
271
271
|
id: 'msg1',
|
|
272
272
|
channel_id: 'ch1',
|
|
@@ -286,7 +286,7 @@ describe('TeamsClient', () => {
|
|
|
286
286
|
})
|
|
287
287
|
|
|
288
288
|
describe('deleteMessage', () => {
|
|
289
|
-
|
|
289
|
+
it('deletes message', async () => {
|
|
290
290
|
mockResponse(null, 204)
|
|
291
291
|
|
|
292
292
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
@@ -300,7 +300,7 @@ describe('TeamsClient', () => {
|
|
|
300
300
|
})
|
|
301
301
|
|
|
302
302
|
describe('addReaction', () => {
|
|
303
|
-
|
|
303
|
+
it('adds reaction to message', async () => {
|
|
304
304
|
mockResponse(null, 204)
|
|
305
305
|
|
|
306
306
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
@@ -315,7 +315,7 @@ describe('TeamsClient', () => {
|
|
|
315
315
|
})
|
|
316
316
|
|
|
317
317
|
describe('removeReaction', () => {
|
|
318
|
-
|
|
318
|
+
it('removes reaction from message', async () => {
|
|
319
319
|
mockResponse(null, 204)
|
|
320
320
|
|
|
321
321
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
@@ -329,7 +329,7 @@ describe('TeamsClient', () => {
|
|
|
329
329
|
})
|
|
330
330
|
|
|
331
331
|
describe('listUsers', () => {
|
|
332
|
-
|
|
332
|
+
it('returns list of team members', async () => {
|
|
333
333
|
mockResponse([
|
|
334
334
|
{ id: 'u1', displayName: 'User 1', email: 'user1@example.com' },
|
|
335
335
|
{ id: 'u2', displayName: 'User 2', email: 'user2@example.com' },
|
|
@@ -345,7 +345,7 @@ describe('TeamsClient', () => {
|
|
|
345
345
|
})
|
|
346
346
|
|
|
347
347
|
describe('getUser', () => {
|
|
348
|
-
|
|
348
|
+
it('returns user info', async () => {
|
|
349
349
|
mockResponse({ id: 'u1', displayName: 'Test User', email: 'test@example.com' })
|
|
350
350
|
|
|
351
351
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
@@ -358,7 +358,7 @@ describe('TeamsClient', () => {
|
|
|
358
358
|
})
|
|
359
359
|
|
|
360
360
|
describe('uploadFile', () => {
|
|
361
|
-
|
|
361
|
+
it('uploads file to channel', async () => {
|
|
362
362
|
const tempFile = '/tmp/test-teams-upload.txt'
|
|
363
363
|
await Bun.write(tempFile, 'test content')
|
|
364
364
|
|
|
@@ -379,7 +379,7 @@ describe('TeamsClient', () => {
|
|
|
379
379
|
})
|
|
380
380
|
|
|
381
381
|
describe('listFiles', () => {
|
|
382
|
-
|
|
382
|
+
it('returns files from channel', async () => {
|
|
383
383
|
mockResponse([
|
|
384
384
|
{ id: 'file1', name: 'doc.pdf', size: 1024, url: 'https://example.com/doc.pdf' },
|
|
385
385
|
{ id: 'file2', name: 'image.png', size: 2048, url: 'https://example.com/image.png' },
|
|
@@ -395,7 +395,7 @@ describe('TeamsClient', () => {
|
|
|
395
395
|
})
|
|
396
396
|
|
|
397
397
|
describe('rate limiting', () => {
|
|
398
|
-
|
|
398
|
+
it('waits when bucket is exhausted before making request', async () => {
|
|
399
399
|
mockResponse({ userDetails: JSON.stringify({ name: 'User 1' }), locale: 'en-us' }, 200, {
|
|
400
400
|
'X-RateLimit-Remaining': '0',
|
|
401
401
|
'X-RateLimit-Reset': String(Date.now() / 1000 + 0.1),
|
|
@@ -416,7 +416,7 @@ describe('TeamsClient', () => {
|
|
|
416
416
|
expect(fetchCalls.length).toBe(2)
|
|
417
417
|
})
|
|
418
418
|
|
|
419
|
-
|
|
419
|
+
it('retries on 429 with Retry-After header', async () => {
|
|
420
420
|
mockResponse({ message: 'Rate limited' }, 429, { 'Retry-After': '0.1' })
|
|
421
421
|
mockResponse({ userDetails: JSON.stringify({ name: 'User' }), locale: 'en-us' })
|
|
422
422
|
|
|
@@ -427,7 +427,7 @@ describe('TeamsClient', () => {
|
|
|
427
427
|
expect(fetchCalls.length).toBe(2)
|
|
428
428
|
})
|
|
429
429
|
|
|
430
|
-
|
|
430
|
+
it('throws after max retries exceeded', async () => {
|
|
431
431
|
for (let i = 0; i <= 3; i++) {
|
|
432
432
|
mockResponse({ message: 'Rate limited' }, 429, { 'Retry-After': '0.01' })
|
|
433
433
|
}
|
|
@@ -439,7 +439,7 @@ describe('TeamsClient', () => {
|
|
|
439
439
|
})
|
|
440
440
|
|
|
441
441
|
describe('retry logic', () => {
|
|
442
|
-
|
|
442
|
+
it('retries on 500 server error', async () => {
|
|
443
443
|
mockResponse({ message: 'Internal Server Error' }, 500)
|
|
444
444
|
mockResponse({ userDetails: JSON.stringify({ name: 'User' }), locale: 'en-us' })
|
|
445
445
|
|
|
@@ -450,7 +450,7 @@ describe('TeamsClient', () => {
|
|
|
450
450
|
expect(fetchCalls.length).toBe(2)
|
|
451
451
|
})
|
|
452
452
|
|
|
453
|
-
|
|
453
|
+
it('does not retry on 4xx client errors (except 429)', async () => {
|
|
454
454
|
mockResponse({ message: 'Not Found' }, 404)
|
|
455
455
|
|
|
456
456
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
@@ -458,7 +458,7 @@ describe('TeamsClient', () => {
|
|
|
458
458
|
expect(fetchCalls.length).toBe(1)
|
|
459
459
|
})
|
|
460
460
|
|
|
461
|
-
|
|
461
|
+
it('exponential backoff increases delay', async () => {
|
|
462
462
|
mockResponse({ message: 'Error' }, 500)
|
|
463
463
|
mockResponse({ message: 'Error' }, 500)
|
|
464
464
|
mockResponse({ userDetails: JSON.stringify({ name: 'User' }), locale: 'en-us' })
|
|
@@ -474,7 +474,7 @@ describe('TeamsClient', () => {
|
|
|
474
474
|
})
|
|
475
475
|
|
|
476
476
|
describe('bucket key normalization', () => {
|
|
477
|
-
|
|
477
|
+
it('normalizes team and channel IDs in routes', async () => {
|
|
478
478
|
mockResponse([])
|
|
479
479
|
mockResponse([])
|
|
480
480
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, expect, spyOn,
|
|
1
|
+
import { afterEach, beforeEach, expect, spyOn, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import { TeamsClient } from '../client'
|
|
4
4
|
import { TeamsCredentialManager } from '../credential-manager'
|
|
@@ -54,7 +54,7 @@ afterEach(() => {
|
|
|
54
54
|
clientGetRegionSpy?.mockRestore()
|
|
55
55
|
})
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
it('extract: calls TeamsTokenExtractor', async () => {
|
|
58
58
|
const extractor = new TeamsTokenExtractor()
|
|
59
59
|
const result = await extractor.extract()
|
|
60
60
|
expect(result).toHaveLength(1)
|
|
@@ -62,7 +62,7 @@ test('extract: calls TeamsTokenExtractor', async () => {
|
|
|
62
62
|
expect(result[0].accountType).toBe('work')
|
|
63
63
|
})
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
it('extract: validates token with TeamsClient', async () => {
|
|
66
66
|
const client = await new TeamsClient().login({ token: 'test-skype-token-123', region: 'emea' })
|
|
67
67
|
const authInfo = await client.testAuth()
|
|
68
68
|
expect(authInfo).toBeDefined()
|
|
@@ -70,31 +70,31 @@ test('extract: validates token with TeamsClient', async () => {
|
|
|
70
70
|
expect(authInfo.displayName).toBe('Test User')
|
|
71
71
|
})
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
it('extract: discovers teams', async () => {
|
|
74
74
|
const client = await new TeamsClient().login({ token: 'test-skype-token-123', region: 'emea' })
|
|
75
75
|
const teams = await client.listTeams()
|
|
76
76
|
expect(teams).toHaveLength(2)
|
|
77
77
|
expect(teams[0].id).toBe('team-1')
|
|
78
78
|
})
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
it('logout: clears credentials', async () => {
|
|
81
81
|
const credManager = new TeamsCredentialManager()
|
|
82
82
|
await credManager.clearCredentials()
|
|
83
83
|
expect(credManager.clearCredentials).toHaveBeenCalled()
|
|
84
84
|
})
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
it('status: returns auth state when not authenticated', async () => {
|
|
87
87
|
const credManager = new TeamsCredentialManager()
|
|
88
88
|
const config = await credManager.loadConfig()
|
|
89
89
|
expect(config).toBeNull()
|
|
90
90
|
})
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
it('status: checks token expiry', async () => {
|
|
93
93
|
const credManager = new TeamsCredentialManager()
|
|
94
94
|
const isExpired = await credManager.isTokenExpired()
|
|
95
95
|
expect(isExpired).toBe(false)
|
|
96
96
|
})
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
it('no-token message mentions desktop app and browser fallback', () => {
|
|
99
99
|
expect(getNoTeamsTokenFoundMessage()).toContain('desktop app or a supported Chromium browser')
|
|
100
100
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, expect, spyOn,
|
|
1
|
+
import { afterEach, beforeEach, expect, spyOn, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import { TeamsClient } from '../client'
|
|
4
4
|
import { TeamsCredentialManager } from '../credential-manager'
|
|
@@ -65,7 +65,7 @@ afterEach(() => {
|
|
|
65
65
|
credManagerLoadConfigSpy?.mockRestore()
|
|
66
66
|
})
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
it('list: returns channels from team', async () => {
|
|
69
69
|
// given
|
|
70
70
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
71
71
|
|
|
@@ -78,7 +78,7 @@ test('list: returns channels from team', async () => {
|
|
|
78
78
|
expect(channels[1].name).toBe('Announcements')
|
|
79
79
|
})
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
it('list: includes channel metadata', async () => {
|
|
82
82
|
// given
|
|
83
83
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
84
84
|
const channels = await client.listChannels('team-1')
|
|
@@ -93,7 +93,7 @@ test('list: includes channel metadata', async () => {
|
|
|
93
93
|
expect(channel.team_id).toBe('team-1')
|
|
94
94
|
})
|
|
95
95
|
|
|
96
|
-
|
|
96
|
+
it('info: returns channel details', async () => {
|
|
97
97
|
// given
|
|
98
98
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
99
99
|
|
|
@@ -106,7 +106,7 @@ test('info: returns channel details', async () => {
|
|
|
106
106
|
expect(channel.type).toBe('standard')
|
|
107
107
|
})
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
it('info: throws error for non-existent channel', async () => {
|
|
110
110
|
// given
|
|
111
111
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
112
112
|
|
|
@@ -119,7 +119,7 @@ test('info: throws error for non-existent channel', async () => {
|
|
|
119
119
|
}
|
|
120
120
|
})
|
|
121
121
|
|
|
122
|
-
|
|
122
|
+
it('history: returns messages', async () => {
|
|
123
123
|
// given
|
|
124
124
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
125
125
|
|
|
@@ -134,7 +134,7 @@ test('history: returns messages', async () => {
|
|
|
134
134
|
expect(messages[1].author.displayName).toBe('Bob')
|
|
135
135
|
})
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
it('history: includes message metadata', async () => {
|
|
138
138
|
// given
|
|
139
139
|
const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
|
|
140
140
|
const messages = await client.getMessages('team-1', 'ch-1', 50)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, expect, mock, spyOn,
|
|
1
|
+
import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import { TeamsClient } from '../client'
|
|
4
4
|
import { TeamsCredentialManager } from '../credential-manager'
|
|
@@ -55,7 +55,7 @@ afterEach(() => {
|
|
|
55
55
|
console.log = originalConsoleLog
|
|
56
56
|
})
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
it('upload: sends multipart request and returns file info', async () => {
|
|
59
59
|
const consoleSpy = mock((_msg: string) => {})
|
|
60
60
|
console.log = consoleSpy
|
|
61
61
|
|
|
@@ -67,7 +67,7 @@ test('upload: sends multipart request and returns file info', async () => {
|
|
|
67
67
|
expect(output).toContain('test.pdf')
|
|
68
68
|
})
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
it('list: returns files in channel', async () => {
|
|
71
71
|
const consoleSpy = mock((_msg: string) => {})
|
|
72
72
|
console.log = consoleSpy
|
|
73
73
|
|
|
@@ -79,7 +79,7 @@ test('list: returns files in channel', async () => {
|
|
|
79
79
|
expect(output).toContain('file_124')
|
|
80
80
|
})
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
it('info: returns single file details', async () => {
|
|
83
83
|
const consoleSpy = mock((_msg: string) => {})
|
|
84
84
|
console.log = consoleSpy
|
|
85
85
|
|