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,51 +1,51 @@
|
|
|
1
|
-
import { describe, expect,
|
|
1
|
+
import { describe, expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import { parseLimitOption } from '@/platforms/instagram/commands/shared'
|
|
4
4
|
import { InstagramError } from '@/platforms/instagram/types'
|
|
5
5
|
|
|
6
6
|
describe('parseLimitOption', () => {
|
|
7
|
-
|
|
7
|
+
it('returns parsed integer for valid input', () => {
|
|
8
8
|
expect(parseLimitOption('10', 20)).toBe(10)
|
|
9
9
|
})
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
it('returns default when undefined', () => {
|
|
12
12
|
expect(parseLimitOption(undefined, 20)).toBe(20)
|
|
13
13
|
})
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
it('trims whitespace', () => {
|
|
16
16
|
expect(parseLimitOption(' 15 ', 20)).toBe(15)
|
|
17
17
|
})
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
it('throws InstagramError for non-numeric input', () => {
|
|
20
20
|
expect(() => parseLimitOption('abc', 20)).toThrow(InstagramError)
|
|
21
21
|
})
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
it('throws for zero', () => {
|
|
24
24
|
expect(() => parseLimitOption('0', 20)).toThrow(InstagramError)
|
|
25
25
|
})
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
it('throws for negative numbers', () => {
|
|
28
28
|
expect(() => parseLimitOption('-5', 20)).toThrow(InstagramError)
|
|
29
29
|
})
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
it('throws for values exceeding default maxValue', () => {
|
|
32
32
|
expect(() => parseLimitOption('101', 20)).toThrow(InstagramError)
|
|
33
33
|
})
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
it('respects custom maxValue', () => {
|
|
36
36
|
expect(parseLimitOption('50', 20, 50)).toBe(50)
|
|
37
37
|
expect(() => parseLimitOption('51', 20, 50)).toThrow(InstagramError)
|
|
38
38
|
})
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
it('throws for decimal numbers', () => {
|
|
41
41
|
expect(() => parseLimitOption('10.5', 20)).toThrow(InstagramError)
|
|
42
42
|
})
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
it('accepts boundary value 1', () => {
|
|
45
45
|
expect(parseLimitOption('1', 20)).toBe(1)
|
|
46
46
|
})
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
it('accepts boundary value 100', () => {
|
|
49
49
|
expect(parseLimitOption('100', 20)).toBe(100)
|
|
50
50
|
})
|
|
51
51
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, spyOn,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, spyOn, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import { InstagramClient } from '../client'
|
|
4
4
|
import * as sharedModule from './shared'
|
|
@@ -29,7 +29,7 @@ describe('whoami command', () => {
|
|
|
29
29
|
consoleLogSpy?.mockRestore()
|
|
30
30
|
})
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
it('outputs profile information', async () => {
|
|
33
33
|
await whoamiAction({})
|
|
34
34
|
|
|
35
35
|
expect(consoleLogSpy).toHaveBeenCalledTimes(1)
|
|
@@ -40,7 +40,7 @@ describe('whoami command', () => {
|
|
|
40
40
|
expect(output.profile_pic_url).toBe('https://example.com/pic.jpg')
|
|
41
41
|
})
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
it('outputs profile with null optional fields', async () => {
|
|
44
44
|
getProfileSpy.mockResolvedValue({
|
|
45
45
|
user_id: '987654321',
|
|
46
46
|
username: 'testuser',
|
|
@@ -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
|
|
|
@@ -34,7 +34,7 @@ afterAll(() => {
|
|
|
34
34
|
|
|
35
35
|
describe('InstagramCredentialManager', () => {
|
|
36
36
|
describe('loadConfig', () => {
|
|
37
|
-
|
|
37
|
+
it('returns default config when file does not exist', async () => {
|
|
38
38
|
const manager = setup()
|
|
39
39
|
const config = await manager.loadConfig()
|
|
40
40
|
|
|
@@ -43,7 +43,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
43
43
|
})
|
|
44
44
|
|
|
45
45
|
describe('saveConfig', () => {
|
|
46
|
-
|
|
46
|
+
it('creates file and can be re-read via loadConfig', async () => {
|
|
47
47
|
const manager = setup()
|
|
48
48
|
const config = {
|
|
49
49
|
current: 'test-account',
|
|
@@ -60,14 +60,14 @@ describe('InstagramCredentialManager', () => {
|
|
|
60
60
|
})
|
|
61
61
|
|
|
62
62
|
describe('getAccount', () => {
|
|
63
|
-
|
|
63
|
+
it('returns null when no accounts exist', async () => {
|
|
64
64
|
const manager = setup()
|
|
65
65
|
const account = await manager.getAccount()
|
|
66
66
|
|
|
67
67
|
expect(account).toBeNull()
|
|
68
68
|
})
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
it('returns null for specific accountId when no accounts exist', async () => {
|
|
71
71
|
const manager = setup()
|
|
72
72
|
const account = await manager.getAccount('nonexistent')
|
|
73
73
|
|
|
@@ -76,7 +76,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
76
76
|
})
|
|
77
77
|
|
|
78
78
|
describe('setAccount', () => {
|
|
79
|
-
|
|
79
|
+
it('round-trips: set then get returns same account', async () => {
|
|
80
80
|
const manager = setup()
|
|
81
81
|
const account = makeAccount()
|
|
82
82
|
|
|
@@ -86,7 +86,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
86
86
|
expect(retrieved).toEqual(account)
|
|
87
87
|
})
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
it('sets first account as current automatically', async () => {
|
|
90
90
|
const manager = setup()
|
|
91
91
|
const account = makeAccount()
|
|
92
92
|
|
|
@@ -96,7 +96,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
96
96
|
expect(current).toEqual(account)
|
|
97
97
|
})
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
it('does not override current when it is already set', async () => {
|
|
100
100
|
const manager = setup()
|
|
101
101
|
const first = makeAccount({ account_id: 'first-account' })
|
|
102
102
|
const second = makeAccount({ account_id: 'second-account' })
|
|
@@ -108,7 +108,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
108
108
|
expect(current?.account_id).toBe('first-account')
|
|
109
109
|
})
|
|
110
110
|
|
|
111
|
-
|
|
111
|
+
it('getAccount looks up account by normalized ID via createAccountId', async () => {
|
|
112
112
|
const manager = setup()
|
|
113
113
|
const account = makeAccount({ account_id: 'my-username' })
|
|
114
114
|
|
|
@@ -120,14 +120,14 @@ describe('InstagramCredentialManager', () => {
|
|
|
120
120
|
})
|
|
121
121
|
|
|
122
122
|
describe('listAccounts', () => {
|
|
123
|
-
|
|
123
|
+
it('returns empty array when no accounts', async () => {
|
|
124
124
|
const manager = setup()
|
|
125
125
|
const accounts = await manager.listAccounts()
|
|
126
126
|
|
|
127
127
|
expect(accounts).toEqual([])
|
|
128
128
|
})
|
|
129
129
|
|
|
130
|
-
|
|
130
|
+
it('returns all accounts with is_current flag', async () => {
|
|
131
131
|
const manager = setup()
|
|
132
132
|
const first = makeAccount({ account_id: 'first-account' })
|
|
133
133
|
const second = makeAccount({ account_id: 'second-account' })
|
|
@@ -146,7 +146,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
146
146
|
})
|
|
147
147
|
|
|
148
148
|
describe('setCurrent', () => {
|
|
149
|
-
|
|
149
|
+
it('switches active account and returns true', async () => {
|
|
150
150
|
const manager = setup()
|
|
151
151
|
const first = makeAccount({ account_id: 'first-account' })
|
|
152
152
|
const second = makeAccount({ account_id: 'second-account' })
|
|
@@ -161,7 +161,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
161
161
|
expect(current?.account_id).toBe('second-account')
|
|
162
162
|
})
|
|
163
163
|
|
|
164
|
-
|
|
164
|
+
it('returns false for non-existent account', async () => {
|
|
165
165
|
const manager = setup()
|
|
166
166
|
|
|
167
167
|
const result = await manager.setCurrent('nonexistent')
|
|
@@ -171,7 +171,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
171
171
|
})
|
|
172
172
|
|
|
173
173
|
describe('removeAccount', () => {
|
|
174
|
-
|
|
174
|
+
it('removes account and adjusts current to next available', async () => {
|
|
175
175
|
const manager = setup()
|
|
176
176
|
const first = makeAccount({ account_id: 'first-account' })
|
|
177
177
|
const second = makeAccount({ account_id: 'second-account' })
|
|
@@ -190,7 +190,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
190
190
|
expect(current?.account_id).toBe('second-account')
|
|
191
191
|
})
|
|
192
192
|
|
|
193
|
-
|
|
193
|
+
it('returns false for non-existent account', async () => {
|
|
194
194
|
const manager = setup()
|
|
195
195
|
|
|
196
196
|
const result = await manager.removeAccount('nonexistent')
|
|
@@ -200,7 +200,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
200
200
|
})
|
|
201
201
|
|
|
202
202
|
describe('clearCredentials', () => {
|
|
203
|
-
|
|
203
|
+
it('removes credentials file when it exists', async () => {
|
|
204
204
|
const manager = setup()
|
|
205
205
|
const account = makeAccount()
|
|
206
206
|
await manager.setAccount(account)
|
|
@@ -214,7 +214,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
214
214
|
expect(existsSync(credentialsPath)).toBe(false)
|
|
215
215
|
})
|
|
216
216
|
|
|
217
|
-
|
|
217
|
+
it('does not throw when credentials file does not exist', async () => {
|
|
218
218
|
const manager = setup()
|
|
219
219
|
|
|
220
220
|
await expect(manager.clearCredentials()).resolves.toBeUndefined()
|
|
@@ -222,7 +222,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
222
222
|
})
|
|
223
223
|
|
|
224
224
|
describe('getAccountPaths', () => {
|
|
225
|
-
|
|
225
|
+
it('returns correct paths structure for account ID', async () => {
|
|
226
226
|
const testConfigDir = join(
|
|
227
227
|
import.meta.dir,
|
|
228
228
|
`.test-instagram-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
@@ -236,7 +236,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
236
236
|
expect(paths.session_path).toBe(join(testConfigDir, 'instagram', 'test-account', 'session.json'))
|
|
237
237
|
})
|
|
238
238
|
|
|
239
|
-
|
|
239
|
+
it('normalizes account ID via createAccountId', async () => {
|
|
240
240
|
const testConfigDir = join(
|
|
241
241
|
import.meta.dir,
|
|
242
242
|
`.test-instagram-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
@@ -252,7 +252,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
252
252
|
})
|
|
253
253
|
|
|
254
254
|
describe('ensureAccountPaths', () => {
|
|
255
|
-
|
|
255
|
+
it('creates directories', async () => {
|
|
256
256
|
const manager = setup()
|
|
257
257
|
|
|
258
258
|
const paths = await manager.ensureAccountPaths('test-account')
|
|
@@ -260,7 +260,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
260
260
|
expect(existsSync(paths.account_dir)).toBe(true)
|
|
261
261
|
})
|
|
262
262
|
|
|
263
|
-
|
|
263
|
+
it('returns paths structure', async () => {
|
|
264
264
|
const testConfigDir = join(
|
|
265
265
|
import.meta.dir,
|
|
266
266
|
`.test-instagram-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, spyOn,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, spyOn, it } from 'bun:test'
|
|
2
2
|
import * as fs from 'node:fs'
|
|
3
3
|
|
|
4
4
|
import { InstagramCredentialManager } from '@/platforms/instagram/credential-manager'
|
|
@@ -46,7 +46,7 @@ afterEach(() => {
|
|
|
46
46
|
})
|
|
47
47
|
|
|
48
48
|
describe('ensureInstagramAuth', () => {
|
|
49
|
-
|
|
49
|
+
it('exits with error when no account configured', async () => {
|
|
50
50
|
// given
|
|
51
51
|
getAccountSpy.mockResolvedValue(null)
|
|
52
52
|
|
|
@@ -56,7 +56,7 @@ describe('ensureInstagramAuth', () => {
|
|
|
56
56
|
expect(consoleSpy).toHaveBeenCalled()
|
|
57
57
|
})
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
it('exits with error when session file missing', async () => {
|
|
60
60
|
// given
|
|
61
61
|
getAccountSpy.mockResolvedValue(validAccount)
|
|
62
62
|
existsSyncSpy.mockReturnValue(false)
|
|
@@ -67,7 +67,7 @@ describe('ensureInstagramAuth', () => {
|
|
|
67
67
|
expect(consoleSpy).toHaveBeenCalled()
|
|
68
68
|
})
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
it('succeeds when account and session file exist', async () => {
|
|
71
71
|
// given
|
|
72
72
|
getAccountSpy.mockResolvedValue(validAccount)
|
|
73
73
|
existsSyncSpy.mockReturnValue(true)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { expect,
|
|
1
|
+
import { expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
createAccountId,
|
|
@@ -11,34 +11,34 @@ import {
|
|
|
11
11
|
InstagramListener,
|
|
12
12
|
} from '@/platforms/instagram/index'
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
it('InstagramClient is exported from barrel', () => {
|
|
15
15
|
expect(typeof InstagramClient).toBe('function')
|
|
16
16
|
})
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
it('InstagramCredentialManager is exported from barrel', () => {
|
|
19
19
|
expect(typeof InstagramCredentialManager).toBe('function')
|
|
20
20
|
})
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
it('InstagramListener is exported from barrel', () => {
|
|
23
23
|
expect(typeof InstagramListener).toBe('function')
|
|
24
24
|
})
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
it('InstagramError is exported from barrel', () => {
|
|
27
27
|
expect(typeof InstagramError).toBe('function')
|
|
28
28
|
})
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
it('createAccountId is exported from barrel', () => {
|
|
31
31
|
expect(typeof createAccountId).toBe('function')
|
|
32
32
|
})
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
it('extractMediaUrl is exported from barrel', () => {
|
|
35
35
|
expect(typeof extractMediaUrl).toBe('function')
|
|
36
36
|
})
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
it('extractMessageText is exported from barrel', () => {
|
|
39
39
|
expect(typeof extractMessageText).toBe('function')
|
|
40
40
|
})
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
it('getMessageType is exported from barrel', () => {
|
|
43
43
|
expect(typeof getMessageType).toBe('function')
|
|
44
44
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, describe, expect, spyOn,
|
|
1
|
+
import { afterEach, describe, expect, spyOn, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import { InstagramListener } from '@/platforms/instagram/listener'
|
|
4
4
|
import type { InstagramChatSummary } from '@/platforms/instagram/types'
|
|
@@ -38,7 +38,7 @@ describe('InstagramListener', () => {
|
|
|
38
38
|
listener?.stop()
|
|
39
39
|
})
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
it('emits connected on start', async () => {
|
|
42
42
|
const client = makeMockClient([makeChat()])
|
|
43
43
|
listener = new InstagramListener(client, { pollInterval: 60_000 })
|
|
44
44
|
|
|
@@ -51,7 +51,7 @@ describe('InstagramListener', () => {
|
|
|
51
51
|
expect(result.userId).toBe('123')
|
|
52
52
|
})
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
it('emits disconnected on stop', async () => {
|
|
55
55
|
const client = makeMockClient([])
|
|
56
56
|
listener = new InstagramListener(client, { pollInterval: 60_000 })
|
|
57
57
|
|
|
@@ -64,7 +64,7 @@ describe('InstagramListener', () => {
|
|
|
64
64
|
await disconnected
|
|
65
65
|
})
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
it('does not emit message for initial poll', async () => {
|
|
68
68
|
const client = makeMockClient([makeChat()])
|
|
69
69
|
listener = new InstagramListener(client, { pollInterval: 60_000 })
|
|
70
70
|
|
|
@@ -77,7 +77,7 @@ describe('InstagramListener', () => {
|
|
|
77
77
|
expect(messages).toHaveLength(0)
|
|
78
78
|
})
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
it('multiple start calls are idempotent', async () => {
|
|
81
81
|
const client = makeMockClient([])
|
|
82
82
|
listener = new InstagramListener(client, { pollInterval: 60_000 })
|
|
83
83
|
|
|
@@ -87,7 +87,7 @@ describe('InstagramListener', () => {
|
|
|
87
87
|
expect(client.listChats).toHaveBeenCalledTimes(1)
|
|
88
88
|
})
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
it('emits error when listChats throws', async () => {
|
|
91
91
|
const client = makeMockClient()
|
|
92
92
|
client.listChats.mockRejectedValueOnce(new Error('network error'))
|
|
93
93
|
listener = new InstagramListener(client, { pollInterval: 60_000 })
|
|
@@ -101,7 +101,7 @@ describe('InstagramListener', () => {
|
|
|
101
101
|
expect(err.message).toBe('network error')
|
|
102
102
|
})
|
|
103
103
|
|
|
104
|
-
|
|
104
|
+
it('on/off registers and unregisters handlers', () => {
|
|
105
105
|
const client = makeMockClient()
|
|
106
106
|
listener = new InstagramListener(client, { pollInterval: 60_000 })
|
|
107
107
|
|
|
@@ -116,7 +116,7 @@ describe('InstagramListener', () => {
|
|
|
116
116
|
expect(called).toBe(false)
|
|
117
117
|
})
|
|
118
118
|
|
|
119
|
-
|
|
119
|
+
it('once fires handler only once', async () => {
|
|
120
120
|
const client = makeMockClient([])
|
|
121
121
|
listener = new InstagramListener(client, { pollInterval: 60_000 })
|
|
122
122
|
|