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 { afterEach, beforeEach, expect, mock, spyOn,
|
|
1
|
+
import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
const originalConsoleLog = console.log
|
|
4
4
|
|
|
@@ -55,7 +55,7 @@ afterEach(() => {
|
|
|
55
55
|
console.log = originalConsoleLog
|
|
56
56
|
})
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
it('status: outputs account info when account exists', async () => {
|
|
59
59
|
// when
|
|
60
60
|
await authCommand.parseAsync(['node', 'auth', 'status'])
|
|
61
61
|
|
|
@@ -68,7 +68,7 @@ test('status: outputs account info when account exists', async () => {
|
|
|
68
68
|
expect(output.device).toBe('ANDROIDSECONDARY')
|
|
69
69
|
})
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
it('status: outputs error when no account configured', async () => {
|
|
72
72
|
// given
|
|
73
73
|
getAccountSpy.mockResolvedValue(null)
|
|
74
74
|
|
|
@@ -81,7 +81,7 @@ test('status: outputs error when no account configured', async () => {
|
|
|
81
81
|
expect(output.error).toBe('No LINE account configured')
|
|
82
82
|
})
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
it('list: outputs all accounts', async () => {
|
|
85
85
|
// when
|
|
86
86
|
await authCommand.parseAsync(['node', 'auth', 'list'])
|
|
87
87
|
|
|
@@ -94,7 +94,7 @@ test('list: outputs all accounts', async () => {
|
|
|
94
94
|
expect(output[1].account_id).toBe('u456')
|
|
95
95
|
})
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
it('list: outputs empty array when no accounts', async () => {
|
|
98
98
|
// given
|
|
99
99
|
listAccountsSpy.mockResolvedValue([])
|
|
100
100
|
|
|
@@ -106,7 +106,7 @@ test('list: outputs empty array when no accounts', async () => {
|
|
|
106
106
|
expect(output).toHaveLength(0)
|
|
107
107
|
})
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
it('use: sets current account and outputs result', async () => {
|
|
110
110
|
// when
|
|
111
111
|
await authCommand.parseAsync(['node', 'auth', 'use', 'u456'])
|
|
112
112
|
|
|
@@ -117,7 +117,7 @@ test('use: sets current account and outputs result', async () => {
|
|
|
117
117
|
expect(output.current_account).toBe('u456')
|
|
118
118
|
})
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
it('logout: removes specific account when account-id provided', async () => {
|
|
121
121
|
// when
|
|
122
122
|
await authCommand.parseAsync(['node', 'auth', 'logout', 'u123'])
|
|
123
123
|
|
|
@@ -129,7 +129,7 @@ test('logout: removes specific account when account-id provided', async () => {
|
|
|
129
129
|
expect(output.message).toContain('u123')
|
|
130
130
|
})
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
it('logout: clears all accounts when no account-id provided', async () => {
|
|
133
133
|
// when
|
|
134
134
|
await authCommand.parseAsync(['node', 'auth', 'logout'])
|
|
135
135
|
|
|
@@ -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
|
const originalConsoleLog = console.log
|
|
4
4
|
|
|
@@ -48,7 +48,7 @@ afterEach(() => {
|
|
|
48
48
|
console.log = originalConsoleLog
|
|
49
49
|
})
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
it('list: fetches and outputs chats', async () => {
|
|
52
52
|
// when
|
|
53
53
|
await chatCommand.parseAsync(['node', 'chat', 'list'])
|
|
54
54
|
|
|
@@ -62,7 +62,7 @@ test('list: fetches and outputs chats', async () => {
|
|
|
62
62
|
expect(output[1].chat_id).toBe('c222')
|
|
63
63
|
})
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
it('list: uses default limit of 50 when no limit provided', async () => {
|
|
66
66
|
// when
|
|
67
67
|
await chatCommand.parseAsync(['node', 'chat', 'list'])
|
|
68
68
|
|
|
@@ -70,7 +70,7 @@ test('list: uses default limit of 50 when no limit provided', async () => {
|
|
|
70
70
|
expect(getChatsSpy).toHaveBeenCalledWith({ limit: 50 })
|
|
71
71
|
})
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
it('list: uses custom limit when --limit option provided', async () => {
|
|
74
74
|
// when
|
|
75
75
|
await chatCommand.parseAsync(['node', 'chat', 'list', '--limit', '10'])
|
|
76
76
|
|
|
@@ -78,7 +78,7 @@ test('list: uses custom limit when --limit option provided', async () => {
|
|
|
78
78
|
expect(getChatsSpy).toHaveBeenCalledWith({ limit: 10 })
|
|
79
79
|
})
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
it('list: closes client after fetching chats', async () => {
|
|
82
82
|
// when
|
|
83
83
|
await chatCommand.parseAsync(['node', 'chat', 'list'])
|
|
84
84
|
|
|
@@ -86,7 +86,7 @@ test('list: closes client after fetching chats', async () => {
|
|
|
86
86
|
expect(closeSpy).toHaveBeenCalledTimes(1)
|
|
87
87
|
})
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
it('list: outputs chat metadata', async () => {
|
|
90
90
|
// when
|
|
91
91
|
await chatCommand.parseAsync(['node', 'chat', 'list'])
|
|
92
92
|
|
|
@@ -98,7 +98,7 @@ test('list: outputs chat metadata', async () => {
|
|
|
98
98
|
expect(chat.display_name).toBeDefined()
|
|
99
99
|
})
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
it('list: includes different chat types', async () => {
|
|
102
102
|
// when
|
|
103
103
|
await chatCommand.parseAsync(['node', 'chat', 'list'])
|
|
104
104
|
|
|
@@ -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
|
const originalConsoleLog = console.log
|
|
4
4
|
|
|
@@ -42,7 +42,7 @@ afterEach(() => {
|
|
|
42
42
|
console.log = originalConsoleLog
|
|
43
43
|
})
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
it('list: fetches and outputs friends', async () => {
|
|
46
46
|
// when
|
|
47
47
|
await friendCommand.parseAsync(['node', 'friend', 'list'])
|
|
48
48
|
|
|
@@ -56,7 +56,7 @@ test('list: fetches and outputs friends', async () => {
|
|
|
56
56
|
expect(output[0].display_name).toBe('Alice')
|
|
57
57
|
})
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
it('list: outputs friends with metadata', async () => {
|
|
60
60
|
// when
|
|
61
61
|
await friendCommand.parseAsync(['node', 'friend', 'list'])
|
|
62
62
|
|
|
@@ -67,7 +67,7 @@ test('list: outputs friends with metadata', async () => {
|
|
|
67
67
|
expect(friend.display_name).toBeDefined()
|
|
68
68
|
})
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
it('list: closes client after fetching friends', async () => {
|
|
71
71
|
// when
|
|
72
72
|
await friendCommand.parseAsync(['node', 'friend', 'list'])
|
|
73
73
|
|
|
@@ -75,7 +75,7 @@ test('list: closes client after fetching friends', async () => {
|
|
|
75
75
|
expect(closeSpy).toHaveBeenCalledTimes(1)
|
|
76
76
|
})
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
it('list: outputs empty array when no friends', async () => {
|
|
79
79
|
// given
|
|
80
80
|
getFriendsSpy.mockResolvedValue([])
|
|
81
81
|
|
|
@@ -87,7 +87,7 @@ test('list: outputs empty array when no friends', async () => {
|
|
|
87
87
|
expect(output).toHaveLength(0)
|
|
88
88
|
})
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
it('list: includes all friend fields', async () => {
|
|
91
91
|
// when
|
|
92
92
|
await friendCommand.parseAsync(['node', 'friend', 'list'])
|
|
93
93
|
|
|
@@ -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
|
const originalConsoleLog = console.log
|
|
4
4
|
|
|
@@ -55,7 +55,7 @@ afterEach(() => {
|
|
|
55
55
|
console.log = originalConsoleLog
|
|
56
56
|
})
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
it('list: fetches and outputs messages for a chat', async () => {
|
|
59
59
|
// when
|
|
60
60
|
await messageCommand.parseAsync(['node', 'message', 'list', 'chat-1'])
|
|
61
61
|
|
|
@@ -69,7 +69,7 @@ test('list: fetches and outputs messages for a chat', async () => {
|
|
|
69
69
|
expect(output[0].text).toBe('Hello world')
|
|
70
70
|
})
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
it('list: uses custom count when --count option provided', async () => {
|
|
73
73
|
// when
|
|
74
74
|
await messageCommand.parseAsync(['node', 'message', 'list', 'chat-1', '--count', '5'])
|
|
75
75
|
|
|
@@ -77,7 +77,7 @@ test('list: uses custom count when --count option provided', async () => {
|
|
|
77
77
|
expect(getMessagesSpy).toHaveBeenCalledWith('chat-1', { count: 5 })
|
|
78
78
|
})
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
it('list: closes client after fetching messages', async () => {
|
|
81
81
|
// when
|
|
82
82
|
await messageCommand.parseAsync(['node', 'message', 'list', 'chat-1'])
|
|
83
83
|
|
|
@@ -85,7 +85,7 @@ test('list: closes client after fetching messages', async () => {
|
|
|
85
85
|
expect(closeSpy).toHaveBeenCalledTimes(1)
|
|
86
86
|
})
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
it('send: sends message and outputs result', async () => {
|
|
89
89
|
// when
|
|
90
90
|
await messageCommand.parseAsync(['node', 'message', 'send', 'chat-1', 'Hello!'])
|
|
91
91
|
|
|
@@ -98,7 +98,7 @@ test('send: sends message and outputs result', async () => {
|
|
|
98
98
|
expect(output.message_id).toBe('msg-new')
|
|
99
99
|
})
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
it('send: closes client after sending message', async () => {
|
|
102
102
|
// when
|
|
103
103
|
await messageCommand.parseAsync(['node', 'message', 'send', 'chat-1', 'Hello!'])
|
|
104
104
|
|
|
@@ -106,7 +106,7 @@ test('send: closes client after sending message', async () => {
|
|
|
106
106
|
expect(closeSpy).toHaveBeenCalledTimes(1)
|
|
107
107
|
})
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
it('list: outputs messages with metadata', async () => {
|
|
110
110
|
// when
|
|
111
111
|
await messageCommand.parseAsync(['node', 'message', 'list', 'chat-1'])
|
|
112
112
|
|
|
@@ -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
|
const originalConsoleLog = console.log
|
|
4
4
|
|
|
@@ -34,7 +34,7 @@ afterEach(() => {
|
|
|
34
34
|
console.log = originalConsoleLog
|
|
35
35
|
})
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
it('whoami: fetches and outputs profile', async () => {
|
|
38
38
|
// when
|
|
39
39
|
await whoamiCommand.parseAsync(['node', 'whoami'])
|
|
40
40
|
|
|
@@ -47,7 +47,7 @@ test('whoami: fetches and outputs profile', async () => {
|
|
|
47
47
|
expect(output.display_name).toBe('Test User')
|
|
48
48
|
})
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
it('whoami: outputs profile with all fields', async () => {
|
|
51
51
|
// when
|
|
52
52
|
await whoamiCommand.parseAsync(['node', 'whoami'])
|
|
53
53
|
|
|
@@ -59,7 +59,7 @@ test('whoami: outputs profile with all fields', async () => {
|
|
|
59
59
|
expect(output.status_message).toBeDefined()
|
|
60
60
|
})
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
it('whoami: closes client after fetching profile', async () => {
|
|
63
63
|
// when
|
|
64
64
|
await whoamiCommand.parseAsync(['node', 'whoami'])
|
|
65
65
|
|
|
@@ -67,7 +67,7 @@ test('whoami: closes client after fetching profile', async () => {
|
|
|
67
67
|
expect(closeSpy).toHaveBeenCalledTimes(1)
|
|
68
68
|
})
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
it('whoami: outputs profile with picture_url', async () => {
|
|
71
71
|
// when
|
|
72
72
|
await whoamiCommand.parseAsync(['node', 'whoami'])
|
|
73
73
|
|
|
@@ -76,7 +76,7 @@ test('whoami: outputs profile with picture_url', async () => {
|
|
|
76
76
|
expect(output.picture_url).toBe('https://example.com/pic.jpg')
|
|
77
77
|
})
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
it('whoami: outputs profile with status_message', async () => {
|
|
80
80
|
// when
|
|
81
81
|
await whoamiCommand.parseAsync(['node', 'whoami'])
|
|
82
82
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
|
|
2
2
|
import { mkdir, rm, stat } from 'node:fs/promises'
|
|
3
3
|
import { tmpdir } from 'node:os'
|
|
4
4
|
import { join } from 'node:path'
|
|
@@ -29,12 +29,12 @@ afterEach(async () => {
|
|
|
29
29
|
})
|
|
30
30
|
|
|
31
31
|
describe('LineCredentialManager', () => {
|
|
32
|
-
|
|
32
|
+
it('load returns default config when file does not exist', async () => {
|
|
33
33
|
const config = await manager.load()
|
|
34
34
|
expect(config).toEqual({ current_account: null, accounts: {} })
|
|
35
35
|
})
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
it('saves and loads in a round trip', async () => {
|
|
38
38
|
const account = makeAccount('alice')
|
|
39
39
|
const config = { current_account: 'alice', accounts: { alice: account } }
|
|
40
40
|
|
|
@@ -44,14 +44,14 @@ describe('LineCredentialManager', () => {
|
|
|
44
44
|
expect(loaded).toEqual(config)
|
|
45
45
|
})
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
it('file is created with 0o600 permissions', async () => {
|
|
48
48
|
await manager.save({ current_account: null, accounts: {} })
|
|
49
49
|
const fileStat = await stat(join(tempDir, 'line-credentials.json'))
|
|
50
50
|
// Check owner read/write only (0o600)
|
|
51
51
|
expect(fileStat.mode & 0o777).toBe(0o600)
|
|
52
52
|
})
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
it('setAccount adds account and sets as current if first', async () => {
|
|
55
55
|
const account = makeAccount('alice')
|
|
56
56
|
await manager.setAccount(account)
|
|
57
57
|
|
|
@@ -60,7 +60,7 @@ describe('LineCredentialManager', () => {
|
|
|
60
60
|
expect(loaded.current_account).toBe('alice')
|
|
61
61
|
})
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
it('setAccount does not change current if already set', async () => {
|
|
64
64
|
await manager.setAccount(makeAccount('alice'))
|
|
65
65
|
await manager.setAccount(makeAccount('bob'))
|
|
66
66
|
|
|
@@ -68,12 +68,12 @@ describe('LineCredentialManager', () => {
|
|
|
68
68
|
expect(loaded.current_account).toBe('alice')
|
|
69
69
|
})
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
it('getAccount returns null when no accounts', async () => {
|
|
72
72
|
const result = await manager.getAccount()
|
|
73
73
|
expect(result).toBeNull()
|
|
74
74
|
})
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
it('getAccount returns current account when no id given', async () => {
|
|
77
77
|
const account = makeAccount('alice')
|
|
78
78
|
await manager.setAccount(account)
|
|
79
79
|
|
|
@@ -81,7 +81,7 @@ describe('LineCredentialManager', () => {
|
|
|
81
81
|
expect(result).toEqual(account)
|
|
82
82
|
})
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
it('getAccount returns account by id', async () => {
|
|
85
85
|
await manager.setAccount(makeAccount('alice'))
|
|
86
86
|
const bob = makeAccount('bob')
|
|
87
87
|
await manager.setAccount(bob)
|
|
@@ -90,13 +90,13 @@ describe('LineCredentialManager', () => {
|
|
|
90
90
|
expect(result).toEqual(bob)
|
|
91
91
|
})
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
it('getAccount returns null for unknown id', async () => {
|
|
94
94
|
await manager.setAccount(makeAccount('alice'))
|
|
95
95
|
const result = await manager.getAccount('unknown')
|
|
96
96
|
expect(result).toBeNull()
|
|
97
97
|
})
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
it('removeAccount removes the account', async () => {
|
|
100
100
|
await manager.setAccount(makeAccount('alice'))
|
|
101
101
|
await manager.removeAccount('alice')
|
|
102
102
|
|
|
@@ -104,7 +104,7 @@ describe('LineCredentialManager', () => {
|
|
|
104
104
|
expect(loaded.accounts['alice']).toBeUndefined()
|
|
105
105
|
})
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
it('removeAccount clears current if it was active', async () => {
|
|
108
108
|
await manager.setAccount(makeAccount('alice'))
|
|
109
109
|
await manager.removeAccount('alice')
|
|
110
110
|
|
|
@@ -112,7 +112,7 @@ describe('LineCredentialManager', () => {
|
|
|
112
112
|
expect(loaded.current_account).toBeNull()
|
|
113
113
|
})
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
it('removeAccount sets next account as current when active is removed', async () => {
|
|
116
116
|
await manager.setAccount(makeAccount('alice'))
|
|
117
117
|
await manager.setAccount(makeAccount('bob'))
|
|
118
118
|
await manager.removeAccount('alice')
|
|
@@ -121,7 +121,7 @@ describe('LineCredentialManager', () => {
|
|
|
121
121
|
expect(loaded.current_account).toBe('bob')
|
|
122
122
|
})
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
it('setCurrentAccount updates current account', async () => {
|
|
125
125
|
await manager.setAccount(makeAccount('alice'))
|
|
126
126
|
await manager.setAccount(makeAccount('bob'))
|
|
127
127
|
await manager.setCurrentAccount('bob')
|
|
@@ -130,7 +130,7 @@ describe('LineCredentialManager', () => {
|
|
|
130
130
|
expect(loaded.current_account).toBe('bob')
|
|
131
131
|
})
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
it('listAccounts returns correct format', async () => {
|
|
134
134
|
await manager.setAccount(makeAccount('alice'))
|
|
135
135
|
await manager.setAccount(makeAccount('bob'))
|
|
136
136
|
|
|
@@ -148,7 +148,7 @@ describe('LineCredentialManager', () => {
|
|
|
148
148
|
expect(bob?.is_current).toBe(false)
|
|
149
149
|
})
|
|
150
150
|
|
|
151
|
-
|
|
151
|
+
it('clearAll removes the credentials file', async () => {
|
|
152
152
|
await manager.setAccount(makeAccount('alice'))
|
|
153
153
|
await manager.clearAll()
|
|
154
154
|
|
|
@@ -156,7 +156,7 @@ describe('LineCredentialManager', () => {
|
|
|
156
156
|
expect(config).toEqual({ current_account: null, accounts: {} })
|
|
157
157
|
})
|
|
158
158
|
|
|
159
|
-
|
|
159
|
+
it('clearAll does not throw if file does not exist', async () => {
|
|
160
160
|
await expect(manager.clearAll()).resolves.toBeUndefined()
|
|
161
161
|
})
|
|
162
162
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { expect,
|
|
1
|
+
import { expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
CredentialManager,
|
|
@@ -12,38 +12,38 @@ import {
|
|
|
12
12
|
LineSendResultSchema,
|
|
13
13
|
} from '@/platforms/line/index'
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
it('LineClient is exported from barrel', () => {
|
|
16
16
|
expect(typeof LineClient).toBe('function')
|
|
17
17
|
})
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
it('LineError is exported from barrel', () => {
|
|
20
20
|
expect(typeof LineError).toBe('function')
|
|
21
21
|
})
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
it('CredentialManager is exported from barrel', () => {
|
|
24
24
|
expect(typeof CredentialManager).toBe('function')
|
|
25
25
|
})
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
it('LineCredentialManager is exported from barrel', () => {
|
|
28
28
|
expect(typeof LineCredentialManager).toBe('function')
|
|
29
29
|
})
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
it('LineChatSchema is exported from barrel', () => {
|
|
32
32
|
expect(typeof LineChatSchema.parse).toBe('function')
|
|
33
33
|
})
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
it('LineMessageSchema is exported from barrel', () => {
|
|
36
36
|
expect(typeof LineMessageSchema.parse).toBe('function')
|
|
37
37
|
})
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
it('LineSendResultSchema is exported from barrel', () => {
|
|
40
40
|
expect(typeof LineSendResultSchema.parse).toBe('function')
|
|
41
41
|
})
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
it('LineAccountCredentialsSchema is exported from barrel', () => {
|
|
44
44
|
expect(typeof LineAccountCredentialsSchema.parse).toBe('function')
|
|
45
45
|
})
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
it('LineConfigSchema is exported from barrel', () => {
|
|
48
48
|
expect(typeof LineConfigSchema.parse).toBe('function')
|
|
49
49
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, describe, expect, mock,
|
|
1
|
+
import { afterEach, describe, expect, mock, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import { LineListener } from '@/platforms/line/listener'
|
|
4
4
|
import type { LinePushGenericEvent, LinePushMessageEvent } from '@/platforms/line/types'
|
|
@@ -73,7 +73,7 @@ describe('LineListener', () => {
|
|
|
73
73
|
})
|
|
74
74
|
|
|
75
75
|
describe('start', () => {
|
|
76
|
-
|
|
76
|
+
it('calls login on LineClient', async () => {
|
|
77
77
|
const client = createMockLineClient()
|
|
78
78
|
listener = new LineListener(client)
|
|
79
79
|
|
|
@@ -82,7 +82,7 @@ describe('LineListener', () => {
|
|
|
82
82
|
expect(mockLogin).toHaveBeenCalledTimes(1)
|
|
83
83
|
})
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
it('is idempotent', async () => {
|
|
86
86
|
const client = createMockLineClient()
|
|
87
87
|
listener = new LineListener(client)
|
|
88
88
|
|
|
@@ -94,7 +94,7 @@ describe('LineListener', () => {
|
|
|
94
94
|
})
|
|
95
95
|
|
|
96
96
|
describe('connected event', () => {
|
|
97
|
-
|
|
97
|
+
it('emits connected with account_id after successful login', async () => {
|
|
98
98
|
const client = createMockLineClient()
|
|
99
99
|
listener = new LineListener(client)
|
|
100
100
|
|
|
@@ -109,7 +109,7 @@ describe('LineListener', () => {
|
|
|
109
109
|
})
|
|
110
110
|
|
|
111
111
|
describe('message events', () => {
|
|
112
|
-
|
|
112
|
+
it('emits message with parsed fields on incoming message', async () => {
|
|
113
113
|
const client = createMockLineClient()
|
|
114
114
|
listener = new LineListener(client)
|
|
115
115
|
|
|
@@ -138,7 +138,7 @@ describe('LineListener', () => {
|
|
|
138
138
|
expect(messages[0].content_type).toBe('NONE')
|
|
139
139
|
})
|
|
140
140
|
|
|
141
|
-
|
|
141
|
+
it('uses to.id as chat_id for own messages', async () => {
|
|
142
142
|
const client = createMockLineClient()
|
|
143
143
|
listener = new LineListener(client)
|
|
144
144
|
|
|
@@ -160,7 +160,7 @@ describe('LineListener', () => {
|
|
|
160
160
|
})
|
|
161
161
|
|
|
162
162
|
describe('line_event catch-all', () => {
|
|
163
|
-
|
|
163
|
+
it('emits line_event for every message', async () => {
|
|
164
164
|
const client = createMockLineClient()
|
|
165
165
|
listener = new LineListener(client)
|
|
166
166
|
|
|
@@ -180,7 +180,7 @@ describe('LineListener', () => {
|
|
|
180
180
|
expect(events[0].type).toBe('message')
|
|
181
181
|
})
|
|
182
182
|
|
|
183
|
-
|
|
183
|
+
it('emits line_event for raw operation events', async () => {
|
|
184
184
|
const client = createMockLineClient()
|
|
185
185
|
listener = new LineListener(client)
|
|
186
186
|
|
|
@@ -197,7 +197,7 @@ describe('LineListener', () => {
|
|
|
197
197
|
})
|
|
198
198
|
|
|
199
199
|
describe('stop', () => {
|
|
200
|
-
|
|
200
|
+
it('aborts and prevents reconnection', async () => {
|
|
201
201
|
const client = createMockLineClient()
|
|
202
202
|
listener = new LineListener(client)
|
|
203
203
|
|
|
@@ -210,7 +210,7 @@ describe('LineListener', () => {
|
|
|
210
210
|
})
|
|
211
211
|
|
|
212
212
|
describe('reconnection', () => {
|
|
213
|
-
|
|
213
|
+
it('reconnects on listen error when still running', async () => {
|
|
214
214
|
const client = createMockLineClient()
|
|
215
215
|
listener = new LineListener(client)
|
|
216
216
|
|
|
@@ -228,7 +228,7 @@ describe('LineListener', () => {
|
|
|
228
228
|
expect(mockLogin.mock.calls.length).toBeGreaterThanOrEqual(2)
|
|
229
229
|
})
|
|
230
230
|
|
|
231
|
-
|
|
231
|
+
it('emits error and reconnects on login failure', async () => {
|
|
232
232
|
let callCount = 0
|
|
233
233
|
mockLogin.mockImplementation((): Promise<void> => {
|
|
234
234
|
callCount++
|
|
@@ -252,7 +252,7 @@ describe('LineListener', () => {
|
|
|
252
252
|
expect(mockLogin.mock.calls.length).toBeGreaterThanOrEqual(2)
|
|
253
253
|
})
|
|
254
254
|
|
|
255
|
-
|
|
255
|
+
it('does not reconnect after stop', async () => {
|
|
256
256
|
const client = createMockLineClient()
|
|
257
257
|
listener = new LineListener(client)
|
|
258
258
|
|
|
@@ -267,7 +267,7 @@ describe('LineListener', () => {
|
|
|
267
267
|
})
|
|
268
268
|
|
|
269
269
|
describe('on/off/once', () => {
|
|
270
|
-
|
|
270
|
+
it('off removes listener', async () => {
|
|
271
271
|
const client = createMockLineClient()
|
|
272
272
|
listener = new LineListener(client)
|
|
273
273
|
|
|
@@ -297,7 +297,7 @@ describe('LineListener', () => {
|
|
|
297
297
|
expect(messages[0].text).toBe('first')
|
|
298
298
|
})
|
|
299
299
|
|
|
300
|
-
|
|
300
|
+
it('once fires only once', async () => {
|
|
301
301
|
const client = createMockLineClient()
|
|
302
302
|
listener = new LineListener(client)
|
|
303
303
|
|
|
@@ -326,7 +326,7 @@ describe('LineListener', () => {
|
|
|
326
326
|
})
|
|
327
327
|
|
|
328
328
|
describe('start after stop', () => {
|
|
329
|
-
|
|
329
|
+
it('resets reconnect attempts on fresh start', async () => {
|
|
330
330
|
const client = createMockLineClient()
|
|
331
331
|
listener = new LineListener(client)
|
|
332
332
|
|