agent-messenger 2.10.1 → 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 +9 -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 +109 -49
- package/src/platforms/teams/token-extractor.ts +7 -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 { afterAll, describe, expect, mock,
|
|
1
|
+
import { afterAll, describe, expect, mock, it } from 'bun:test'
|
|
2
2
|
import { rmSync } from 'node:fs'
|
|
3
3
|
import { join } from 'node:path'
|
|
4
4
|
|
|
@@ -49,7 +49,7 @@ afterAll(() => {
|
|
|
49
49
|
})
|
|
50
50
|
|
|
51
51
|
describe('listAction', () => {
|
|
52
|
-
|
|
52
|
+
it('returns templates list', async () => {
|
|
53
53
|
const credManager = await makeCredManagerWithCreds()
|
|
54
54
|
const result = await listAction({ _credManager: credManager })
|
|
55
55
|
|
|
@@ -58,7 +58,7 @@ describe('listAction', () => {
|
|
|
58
58
|
expect(result.templates?.[0].title).toBe('Order Notification')
|
|
59
59
|
})
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
it('returns error when client throws', async () => {
|
|
62
62
|
mock.module('../client', () => ({
|
|
63
63
|
WeChatBotClient: class MockWeChatBotClient {
|
|
64
64
|
async login() {
|
|
@@ -78,7 +78,7 @@ describe('listAction', () => {
|
|
|
78
78
|
})
|
|
79
79
|
|
|
80
80
|
describe('sendAction (template)', () => {
|
|
81
|
-
|
|
81
|
+
it('sends template message and returns msgid', async () => {
|
|
82
82
|
mock.module('../client', () => ({
|
|
83
83
|
WeChatBotClient: class MockWeChatBotClient {
|
|
84
84
|
async login() {
|
|
@@ -100,7 +100,7 @@ describe('sendAction (template)', () => {
|
|
|
100
100
|
expect(result.error).toBeUndefined()
|
|
101
101
|
})
|
|
102
102
|
|
|
103
|
-
|
|
103
|
+
it('returns error when data is invalid JSON', async () => {
|
|
104
104
|
mock.module('../client', () => ({
|
|
105
105
|
WeChatBotClient: class MockWeChatBotClient {
|
|
106
106
|
async login() {
|
|
@@ -121,7 +121,7 @@ describe('sendAction (template)', () => {
|
|
|
121
121
|
expect(result.msgid).toBeUndefined()
|
|
122
122
|
})
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
it('sends without data when not provided', async () => {
|
|
125
125
|
const sendTemplateMsg = mock(() => Promise.resolve({ msgid: 777 }))
|
|
126
126
|
mock.module('../client', () => ({
|
|
127
127
|
WeChatBotClient: class MockWeChatBotClient {
|
|
@@ -139,7 +139,7 @@ describe('sendAction (template)', () => {
|
|
|
139
139
|
expect(result.msgid).toBe(777)
|
|
140
140
|
})
|
|
141
141
|
|
|
142
|
-
|
|
142
|
+
it('returns error when client throws', async () => {
|
|
143
143
|
mock.module('../client', () => ({
|
|
144
144
|
WeChatBotClient: class MockWeChatBotClient {
|
|
145
145
|
async login() {
|
|
@@ -158,7 +158,7 @@ describe('sendAction (template)', () => {
|
|
|
158
158
|
})
|
|
159
159
|
|
|
160
160
|
describe('deleteAction', () => {
|
|
161
|
-
|
|
161
|
+
it('deletes template and returns success', async () => {
|
|
162
162
|
mock.module('../client', () => ({
|
|
163
163
|
WeChatBotClient: class MockWeChatBotClient {
|
|
164
164
|
async login() {
|
|
@@ -176,7 +176,7 @@ describe('deleteAction', () => {
|
|
|
176
176
|
expect(result.error).toBeUndefined()
|
|
177
177
|
})
|
|
178
178
|
|
|
179
|
-
|
|
179
|
+
it('returns error when client throws', async () => {
|
|
180
180
|
mock.module('../client', () => ({
|
|
181
181
|
WeChatBotClient: class MockWeChatBotClient {
|
|
182
182
|
async login() {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterAll, describe, expect, mock,
|
|
1
|
+
import { afterAll, describe, expect, mock, it } from 'bun:test'
|
|
2
2
|
import { rmSync } from 'node:fs'
|
|
3
3
|
import { join } from 'node:path'
|
|
4
4
|
|
|
@@ -56,7 +56,7 @@ afterAll(() => {
|
|
|
56
56
|
})
|
|
57
57
|
|
|
58
58
|
describe('listAction (user)', () => {
|
|
59
|
-
|
|
59
|
+
it('returns followers list with total, count, openids, next_openid', async () => {
|
|
60
60
|
const credManager = await makeCredManagerWithCreds()
|
|
61
61
|
const result = await listAction({ _credManager: credManager })
|
|
62
62
|
|
|
@@ -66,7 +66,7 @@ describe('listAction (user)', () => {
|
|
|
66
66
|
expect(result.next_openid).toBe('')
|
|
67
67
|
})
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
it('returns error when client throws', async () => {
|
|
70
70
|
mock.module('../client', () => ({
|
|
71
71
|
WeChatBotClient: class MockWeChatBotClient {
|
|
72
72
|
async login() {
|
|
@@ -84,7 +84,7 @@ describe('listAction (user)', () => {
|
|
|
84
84
|
expect(result.openids).toBeUndefined()
|
|
85
85
|
})
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
it('passes nextOpenid option to client', async () => {
|
|
88
88
|
const getFollowersMock = mock(() => Promise.resolve({ total: 1, count: 1, openids: ['openid-3'], next_openid: '' }))
|
|
89
89
|
mock.module('../client', () => ({
|
|
90
90
|
WeChatBotClient: class MockWeChatBotClient {
|
|
@@ -104,7 +104,7 @@ describe('listAction (user)', () => {
|
|
|
104
104
|
})
|
|
105
105
|
|
|
106
106
|
describe('getAction', () => {
|
|
107
|
-
|
|
107
|
+
it('returns user info for given openId', async () => {
|
|
108
108
|
mock.module('../client', () => ({
|
|
109
109
|
WeChatBotClient: class MockWeChatBotClient {
|
|
110
110
|
async login() {
|
|
@@ -122,7 +122,7 @@ describe('getAction', () => {
|
|
|
122
122
|
expect(result.user?.openid).toBe('openid-123')
|
|
123
123
|
})
|
|
124
124
|
|
|
125
|
-
|
|
125
|
+
it('returns error when client throws', async () => {
|
|
126
126
|
mock.module('../client', () => ({
|
|
127
127
|
WeChatBotClient: class MockWeChatBotClient {
|
|
128
128
|
async login() {
|
|
@@ -140,7 +140,7 @@ describe('getAction', () => {
|
|
|
140
140
|
expect(result.user).toBeUndefined()
|
|
141
141
|
})
|
|
142
142
|
|
|
143
|
-
|
|
143
|
+
it('passes lang option to client', async () => {
|
|
144
144
|
const getUserInfoMock = mock(() => Promise.resolve({ ...mockUserInfo, language: 'en' }))
|
|
145
145
|
mock.module('../client', () => ({
|
|
146
146
|
WeChatBotClient: class MockWeChatBotClient {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, mock,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, mock, it } from 'bun:test'
|
|
2
2
|
import { existsSync, rmSync } from 'node:fs'
|
|
3
3
|
import { mkdir } from 'node:fs/promises'
|
|
4
4
|
import { tmpdir } from 'node:os'
|
|
@@ -38,7 +38,7 @@ describe('whoami command', () => {
|
|
|
38
38
|
process.env = originalEnv
|
|
39
39
|
})
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
it('returns app_id, account_name, and verified status', async () => {
|
|
42
42
|
const manager = new WeChatBotCredentialManager(tempDir)
|
|
43
43
|
await manager.setCredentials({
|
|
44
44
|
app_id: 'wx1234567890',
|
|
@@ -54,7 +54,7 @@ describe('whoami command', () => {
|
|
|
54
54
|
expect(result.error).toBeUndefined()
|
|
55
55
|
})
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
it('returns info for specific --account', async () => {
|
|
58
58
|
const manager = new WeChatBotCredentialManager(tempDir)
|
|
59
59
|
await manager.setCredentials({
|
|
60
60
|
app_id: 'wxAAA',
|
|
@@ -74,7 +74,7 @@ describe('whoami command', () => {
|
|
|
74
74
|
expect(result.verified).toBe(true)
|
|
75
75
|
})
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
it('returns verified false when credentials are invalid', async () => {
|
|
78
78
|
mockVerifyCredentials.mockImplementationOnce(() => Promise.resolve(false))
|
|
79
79
|
|
|
80
80
|
const manager = new WeChatBotCredentialManager(tempDir)
|
|
@@ -91,7 +91,7 @@ describe('whoami command', () => {
|
|
|
91
91
|
expect(result.error).toBeUndefined()
|
|
92
92
|
})
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
it('returns error when client throws', async () => {
|
|
95
95
|
mockVerifyCredentials.mockImplementationOnce(() => Promise.reject(new Error('Network error')))
|
|
96
96
|
|
|
97
97
|
const manager = new WeChatBotCredentialManager(tempDir)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterAll, describe, expect,
|
|
1
|
+
import { afterAll, describe, expect, it } from 'bun:test'
|
|
2
2
|
import { existsSync, rmSync } from 'node:fs'
|
|
3
3
|
import { join } from 'node:path'
|
|
4
4
|
|
|
@@ -22,7 +22,7 @@ afterAll(() => {
|
|
|
22
22
|
})
|
|
23
23
|
|
|
24
24
|
describe('WeChatBotCredentialManager', () => {
|
|
25
|
-
|
|
25
|
+
it('load returns default config when file does not exist', async () => {
|
|
26
26
|
const manager = setup()
|
|
27
27
|
const config = await manager.load()
|
|
28
28
|
|
|
@@ -32,7 +32,7 @@ describe('WeChatBotCredentialManager', () => {
|
|
|
32
32
|
})
|
|
33
33
|
})
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
it('save creates file with correct content', async () => {
|
|
36
36
|
const testConfigDir = join(
|
|
37
37
|
import.meta.dir,
|
|
38
38
|
`.test-wechatbot-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
@@ -61,13 +61,13 @@ describe('WeChatBotCredentialManager', () => {
|
|
|
61
61
|
expect(loaded).toEqual(config)
|
|
62
62
|
})
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
it('getCredentials returns null when not configured', async () => {
|
|
65
65
|
const manager = setup()
|
|
66
66
|
const creds = await manager.getCredentials()
|
|
67
67
|
expect(creds).toBeNull()
|
|
68
68
|
})
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
it('getCredentials returns credentials from env vars when E2E env vars are set', async () => {
|
|
71
71
|
const originalAppId = process.env.E2E_WECHATBOT_APP_ID
|
|
72
72
|
const originalAppSecret = process.env.E2E_WECHATBOT_APP_SECRET
|
|
73
73
|
|
|
@@ -96,7 +96,7 @@ describe('WeChatBotCredentialManager', () => {
|
|
|
96
96
|
}
|
|
97
97
|
})
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
it('getCredentials ignores env vars when accountId is provided', async () => {
|
|
100
100
|
const originalAppId = process.env.E2E_WECHATBOT_APP_ID
|
|
101
101
|
const originalAppSecret = process.env.E2E_WECHATBOT_APP_SECRET
|
|
102
102
|
|
|
@@ -121,7 +121,7 @@ describe('WeChatBotCredentialManager', () => {
|
|
|
121
121
|
}
|
|
122
122
|
})
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
it('getCredentials returns specific account by accountId', async () => {
|
|
125
125
|
const manager = setup()
|
|
126
126
|
await manager.setCredentials({ app_id: 'wx-a', app_secret: 'secret-a', account_name: 'Account A' })
|
|
127
127
|
await manager.setCredentials({ app_id: 'wx-b', app_secret: 'secret-b', account_name: 'Account B' })
|
|
@@ -134,13 +134,13 @@ describe('WeChatBotCredentialManager', () => {
|
|
|
134
134
|
})
|
|
135
135
|
})
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
it('getCredentials returns null for nonexistent accountId', async () => {
|
|
138
138
|
const manager = setup()
|
|
139
139
|
const creds = await manager.getCredentials('nonexistent')
|
|
140
140
|
expect(creds).toBeNull()
|
|
141
141
|
})
|
|
142
142
|
|
|
143
|
-
|
|
143
|
+
it('setCredentials saves and sets as current', async () => {
|
|
144
144
|
const manager = setup()
|
|
145
145
|
await manager.setCredentials({ app_id: 'wx123', app_secret: 'secret123', account_name: 'My Account' })
|
|
146
146
|
|
|
@@ -155,7 +155,7 @@ describe('WeChatBotCredentialManager', () => {
|
|
|
155
155
|
expect(config.current).toEqual({ account_id: 'wx123' })
|
|
156
156
|
})
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
it('removeAccount deletes account and adjusts current', async () => {
|
|
159
159
|
const manager = setup()
|
|
160
160
|
await manager.setCredentials({ app_id: 'wx123', app_secret: 'secret123', account_name: 'My Account' })
|
|
161
161
|
|
|
@@ -170,13 +170,13 @@ describe('WeChatBotCredentialManager', () => {
|
|
|
170
170
|
expect(config.accounts['wx123']).toBeUndefined()
|
|
171
171
|
})
|
|
172
172
|
|
|
173
|
-
|
|
173
|
+
it('removeAccount returns false for non-existent account', async () => {
|
|
174
174
|
const manager = setup()
|
|
175
175
|
const removed = await manager.removeAccount('nonexistent')
|
|
176
176
|
expect(removed).toBe(false)
|
|
177
177
|
})
|
|
178
178
|
|
|
179
|
-
|
|
179
|
+
it('removeAccount does not clear current when a different account is removed', async () => {
|
|
180
180
|
const manager = setup()
|
|
181
181
|
await manager.setCredentials({ app_id: 'wx-a', app_secret: 'secret-a', account_name: 'Account A' })
|
|
182
182
|
await manager.setCredentials({ app_id: 'wx-b', app_secret: 'secret-b', account_name: 'Account B' })
|
|
@@ -188,7 +188,7 @@ describe('WeChatBotCredentialManager', () => {
|
|
|
188
188
|
expect(config.current).toEqual({ account_id: 'wx-b' })
|
|
189
189
|
})
|
|
190
190
|
|
|
191
|
-
|
|
191
|
+
it('setCurrent switches active account', async () => {
|
|
192
192
|
const manager = setup()
|
|
193
193
|
await manager.setCredentials({ app_id: 'wx-a', app_secret: 'secret-a', account_name: 'Account A' })
|
|
194
194
|
await manager.setCredentials({ app_id: 'wx-b', app_secret: 'secret-b', account_name: 'Account B' })
|
|
@@ -200,13 +200,13 @@ describe('WeChatBotCredentialManager', () => {
|
|
|
200
200
|
expect(config.current).toEqual({ account_id: 'wx-a' })
|
|
201
201
|
})
|
|
202
202
|
|
|
203
|
-
|
|
203
|
+
it('setCurrent returns false for non-existent account', async () => {
|
|
204
204
|
const manager = setup()
|
|
205
205
|
const result = await manager.setCurrent('nonexistent')
|
|
206
206
|
expect(result).toBe(false)
|
|
207
207
|
})
|
|
208
208
|
|
|
209
|
-
|
|
209
|
+
it('listAll returns all accounts with is_current flag', async () => {
|
|
210
210
|
const manager = setup()
|
|
211
211
|
await manager.setCredentials({ app_id: 'wx-a', app_secret: 'secret-a', account_name: 'Account A' })
|
|
212
212
|
await manager.setCredentials({ app_id: 'wx-b', app_secret: 'secret-b', account_name: 'Account B' })
|
|
@@ -221,13 +221,13 @@ describe('WeChatBotCredentialManager', () => {
|
|
|
221
221
|
expect(acctB?.is_current).toBe(true)
|
|
222
222
|
})
|
|
223
223
|
|
|
224
|
-
|
|
224
|
+
it('listAll returns empty array when no accounts', async () => {
|
|
225
225
|
const manager = setup()
|
|
226
226
|
const accounts = await manager.listAll()
|
|
227
227
|
expect(accounts).toHaveLength(0)
|
|
228
228
|
})
|
|
229
229
|
|
|
230
|
-
|
|
230
|
+
it('clearCredentials resets everything', async () => {
|
|
231
231
|
const manager = setup()
|
|
232
232
|
await manager.setCredentials({ app_id: 'wx123', app_secret: 'secret123', account_name: 'My Account' })
|
|
233
233
|
|
|
@@ -238,7 +238,7 @@ describe('WeChatBotCredentialManager', () => {
|
|
|
238
238
|
expect(config.accounts).toEqual({})
|
|
239
239
|
})
|
|
240
240
|
|
|
241
|
-
|
|
241
|
+
it('supports round-trip: set, get, remove, then returns null', async () => {
|
|
242
242
|
const manager = setup()
|
|
243
243
|
|
|
244
244
|
await manager.setCredentials({ app_id: 'wx123', app_secret: 'secret123', account_name: 'My Account' })
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { expect,
|
|
1
|
+
import { expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
WeChatBotAccountEntrySchema,
|
|
@@ -12,38 +12,38 @@ import {
|
|
|
12
12
|
WeChatBotUserInfoSchema,
|
|
13
13
|
} from '@/platforms/wechatbot/index'
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
it('WeChatBotClient is exported from barrel', () => {
|
|
16
16
|
expect(typeof WeChatBotClient).toBe('function')
|
|
17
17
|
})
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
it('WeChatBotCredentialManager is exported from barrel', () => {
|
|
20
20
|
expect(typeof WeChatBotCredentialManager).toBe('function')
|
|
21
21
|
})
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
it('WeChatBotError is exported from barrel', () => {
|
|
24
24
|
expect(typeof WeChatBotError).toBe('function')
|
|
25
25
|
})
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
it('WeChatBotAccountEntrySchema is exported from barrel', () => {
|
|
28
28
|
expect(typeof WeChatBotAccountEntrySchema.parse).toBe('function')
|
|
29
29
|
})
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
it('WeChatBotConfigSchema is exported from barrel', () => {
|
|
32
32
|
expect(typeof WeChatBotConfigSchema.parse).toBe('function')
|
|
33
33
|
})
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
it('WeChatBotCredentialsSchema is exported from barrel', () => {
|
|
36
36
|
expect(typeof WeChatBotCredentialsSchema.parse).toBe('function')
|
|
37
37
|
})
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
it('WeChatBotNewsArticleSchema is exported from barrel', () => {
|
|
40
40
|
expect(typeof WeChatBotNewsArticleSchema.parse).toBe('function')
|
|
41
41
|
})
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
it('WeChatBotTemplateSchema is exported from barrel', () => {
|
|
44
44
|
expect(typeof WeChatBotTemplateSchema.parse).toBe('function')
|
|
45
45
|
})
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
it('WeChatBotUserInfoSchema is exported from barrel', () => {
|
|
48
48
|
expect(typeof WeChatBotUserInfoSchema.parse).toBe('function')
|
|
49
49
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { expect,
|
|
1
|
+
import { expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
WeChatBotAccountEntrySchema,
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
WeChatBotUserInfoSchema,
|
|
11
11
|
} from '@/platforms/wechatbot/types'
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
it('WeChatBotAccountEntrySchema validates correct data', () => {
|
|
14
14
|
const result = WeChatBotAccountEntrySchema.safeParse({
|
|
15
15
|
app_id: 'wx123',
|
|
16
16
|
app_secret: 'secret123',
|
|
@@ -19,7 +19,7 @@ test('WeChatBotAccountEntrySchema validates correct data', () => {
|
|
|
19
19
|
expect(result.success).toBe(true)
|
|
20
20
|
})
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
it('WeChatBotAccountEntrySchema rejects missing app_id', () => {
|
|
23
23
|
const result = WeChatBotAccountEntrySchema.safeParse({
|
|
24
24
|
app_secret: 'secret123',
|
|
25
25
|
account_name: 'My Account',
|
|
@@ -27,7 +27,7 @@ test('WeChatBotAccountEntrySchema rejects missing app_id', () => {
|
|
|
27
27
|
expect(result.success).toBe(false)
|
|
28
28
|
})
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
it('WeChatBotAccountEntrySchema rejects missing app_secret', () => {
|
|
31
31
|
const result = WeChatBotAccountEntrySchema.safeParse({
|
|
32
32
|
app_id: 'wx123',
|
|
33
33
|
account_name: 'My Account',
|
|
@@ -35,7 +35,7 @@ test('WeChatBotAccountEntrySchema rejects missing app_secret', () => {
|
|
|
35
35
|
expect(result.success).toBe(false)
|
|
36
36
|
})
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
it('WeChatBotAccountEntrySchema rejects missing account_name', () => {
|
|
39
39
|
const result = WeChatBotAccountEntrySchema.safeParse({
|
|
40
40
|
app_id: 'wx123',
|
|
41
41
|
app_secret: 'secret123',
|
|
@@ -43,7 +43,7 @@ test('WeChatBotAccountEntrySchema rejects missing account_name', () => {
|
|
|
43
43
|
expect(result.success).toBe(false)
|
|
44
44
|
})
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
it('WeChatBotConfigSchema validates with current account', () => {
|
|
47
47
|
const result = WeChatBotConfigSchema.safeParse({
|
|
48
48
|
current: { account_id: 'wx123' },
|
|
49
49
|
accounts: {
|
|
@@ -53,7 +53,7 @@ test('WeChatBotConfigSchema validates with current account', () => {
|
|
|
53
53
|
expect(result.success).toBe(true)
|
|
54
54
|
})
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
it('WeChatBotConfigSchema validates with current null and empty accounts', () => {
|
|
57
57
|
const result = WeChatBotConfigSchema.safeParse({
|
|
58
58
|
current: null,
|
|
59
59
|
accounts: {},
|
|
@@ -61,7 +61,7 @@ test('WeChatBotConfigSchema validates with current null and empty accounts', ()
|
|
|
61
61
|
expect(result.success).toBe(true)
|
|
62
62
|
})
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
it('WeChatBotConfigSchema validates with multiple accounts', () => {
|
|
65
65
|
const result = WeChatBotConfigSchema.safeParse({
|
|
66
66
|
current: { account_id: 'wx-a' },
|
|
67
67
|
accounts: {
|
|
@@ -72,17 +72,17 @@ test('WeChatBotConfigSchema validates with multiple accounts', () => {
|
|
|
72
72
|
expect(result.success).toBe(true)
|
|
73
73
|
})
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
it('WeChatBotConfigSchema rejects missing accounts field', () => {
|
|
76
76
|
const result = WeChatBotConfigSchema.safeParse({ current: null })
|
|
77
77
|
expect(result.success).toBe(false)
|
|
78
78
|
})
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
it('WeChatBotConfigSchema rejects missing current field', () => {
|
|
81
81
|
const result = WeChatBotConfigSchema.safeParse({ accounts: {} })
|
|
82
82
|
expect(result.success).toBe(false)
|
|
83
83
|
})
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
it('WeChatBotCredentialsSchema validates correct data', () => {
|
|
86
86
|
const result = WeChatBotCredentialsSchema.safeParse({
|
|
87
87
|
app_id: 'wx123',
|
|
88
88
|
app_secret: 'secret123',
|
|
@@ -91,7 +91,7 @@ test('WeChatBotCredentialsSchema validates correct data', () => {
|
|
|
91
91
|
expect(result.success).toBe(true)
|
|
92
92
|
})
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
it('WeChatBotCredentialsSchema rejects missing app_id', () => {
|
|
95
95
|
const result = WeChatBotCredentialsSchema.safeParse({
|
|
96
96
|
app_secret: 'secret123',
|
|
97
97
|
account_name: 'My Account',
|
|
@@ -99,7 +99,7 @@ test('WeChatBotCredentialsSchema rejects missing app_id', () => {
|
|
|
99
99
|
expect(result.success).toBe(false)
|
|
100
100
|
})
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
it('WeChatBotCredentialsSchema rejects missing app_secret', () => {
|
|
103
103
|
const result = WeChatBotCredentialsSchema.safeParse({
|
|
104
104
|
app_id: 'wx123',
|
|
105
105
|
account_name: 'My Account',
|
|
@@ -107,7 +107,7 @@ test('WeChatBotCredentialsSchema rejects missing app_secret', () => {
|
|
|
107
107
|
expect(result.success).toBe(false)
|
|
108
108
|
})
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
it('WeChatBotCredentialsSchema rejects missing account_name', () => {
|
|
111
111
|
const result = WeChatBotCredentialsSchema.safeParse({
|
|
112
112
|
app_id: 'wx123',
|
|
113
113
|
app_secret: 'secret123',
|
|
@@ -115,7 +115,7 @@ test('WeChatBotCredentialsSchema rejects missing account_name', () => {
|
|
|
115
115
|
expect(result.success).toBe(false)
|
|
116
116
|
})
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
it('WeChatBotNewsArticleSchema validates correct data', () => {
|
|
119
119
|
const result = WeChatBotNewsArticleSchema.safeParse({
|
|
120
120
|
title: 'Test Article',
|
|
121
121
|
description: 'Test description',
|
|
@@ -125,7 +125,7 @@ test('WeChatBotNewsArticleSchema validates correct data', () => {
|
|
|
125
125
|
expect(result.success).toBe(true)
|
|
126
126
|
})
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
it('WeChatBotNewsArticleSchema rejects missing title', () => {
|
|
129
129
|
const result = WeChatBotNewsArticleSchema.safeParse({
|
|
130
130
|
description: 'Test description',
|
|
131
131
|
url: 'https://example.com',
|
|
@@ -134,7 +134,7 @@ test('WeChatBotNewsArticleSchema rejects missing title', () => {
|
|
|
134
134
|
expect(result.success).toBe(false)
|
|
135
135
|
})
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
it('WeChatBotTemplateSchema validates correct data', () => {
|
|
138
138
|
const result = WeChatBotTemplateSchema.safeParse({
|
|
139
139
|
template_id: 'tmpl-001',
|
|
140
140
|
title: 'Order Notification',
|
|
@@ -146,7 +146,7 @@ test('WeChatBotTemplateSchema validates correct data', () => {
|
|
|
146
146
|
expect(result.success).toBe(true)
|
|
147
147
|
})
|
|
148
148
|
|
|
149
|
-
|
|
149
|
+
it('WeChatBotTemplateSchema rejects missing template_id', () => {
|
|
150
150
|
const result = WeChatBotTemplateSchema.safeParse({
|
|
151
151
|
title: 'Order Notification',
|
|
152
152
|
primary_industry: 'IT科技',
|
|
@@ -157,7 +157,7 @@ test('WeChatBotTemplateSchema rejects missing template_id', () => {
|
|
|
157
157
|
expect(result.success).toBe(false)
|
|
158
158
|
})
|
|
159
159
|
|
|
160
|
-
|
|
160
|
+
it('WeChatBotUserInfoSchema validates correct data', () => {
|
|
161
161
|
const result = WeChatBotUserInfoSchema.safeParse({
|
|
162
162
|
subscribe: 1,
|
|
163
163
|
openid: 'openid-123',
|
|
@@ -172,7 +172,7 @@ test('WeChatBotUserInfoSchema validates correct data', () => {
|
|
|
172
172
|
expect(result.success).toBe(true)
|
|
173
173
|
})
|
|
174
174
|
|
|
175
|
-
|
|
175
|
+
it('WeChatBotUserInfoSchema validates with optional unionid', () => {
|
|
176
176
|
const result = WeChatBotUserInfoSchema.safeParse({
|
|
177
177
|
subscribe: 1,
|
|
178
178
|
openid: 'openid-123',
|
|
@@ -188,7 +188,7 @@ test('WeChatBotUserInfoSchema validates with optional unionid', () => {
|
|
|
188
188
|
expect(result.success).toBe(true)
|
|
189
189
|
})
|
|
190
190
|
|
|
191
|
-
|
|
191
|
+
it('WeChatBotUserInfoSchema rejects missing openid', () => {
|
|
192
192
|
const result = WeChatBotUserInfoSchema.safeParse({
|
|
193
193
|
subscribe: 1,
|
|
194
194
|
language: 'zh_CN',
|
|
@@ -202,22 +202,22 @@ test('WeChatBotUserInfoSchema rejects missing openid', () => {
|
|
|
202
202
|
expect(result.success).toBe(false)
|
|
203
203
|
})
|
|
204
204
|
|
|
205
|
-
|
|
205
|
+
it('WeChatBotError has correct name', () => {
|
|
206
206
|
const error = new WeChatBotError('Test error', 'TEST_CODE')
|
|
207
207
|
expect(error.name).toBe('WeChatBotError')
|
|
208
208
|
})
|
|
209
209
|
|
|
210
|
-
|
|
210
|
+
it('WeChatBotError has correct message', () => {
|
|
211
211
|
const error = new WeChatBotError('Test error', 'TEST_CODE')
|
|
212
212
|
expect(error.message).toBe('Test error')
|
|
213
213
|
})
|
|
214
214
|
|
|
215
|
-
|
|
215
|
+
it('WeChatBotError has correct code', () => {
|
|
216
216
|
const error = new WeChatBotError('Test error', 'TEST_CODE')
|
|
217
217
|
expect(error.code).toBe('TEST_CODE')
|
|
218
218
|
})
|
|
219
219
|
|
|
220
|
-
|
|
220
|
+
it('WeChatBotError is instance of Error', () => {
|
|
221
221
|
const error = new WeChatBotError('Test error', 'TEST_CODE')
|
|
222
222
|
expect(error instanceof Error).toBe(true)
|
|
223
223
|
})
|