agent-messenger 2.10.0 → 2.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/dist/package.json +1 -1
  3. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
  4. package/dist/src/platforms/teams/token-extractor.js +15 -2
  5. package/dist/src/platforms/teams/token-extractor.js.map +1 -1
  6. package/dist/src/shared/chromium/decryptor.d.ts +6 -0
  7. package/dist/src/shared/chromium/decryptor.d.ts.map +1 -1
  8. package/dist/src/shared/chromium/decryptor.js +26 -6
  9. package/dist/src/shared/chromium/decryptor.js.map +1 -1
  10. package/e2e/channeltalk.e2e.test.ts +13 -13
  11. package/e2e/channeltalkbot.e2e.test.ts +13 -13
  12. package/e2e/discord.e2e.test.ts +24 -24
  13. package/e2e/discordbot.e2e.test.ts +16 -16
  14. package/e2e/instagram.e2e.test.ts +10 -10
  15. package/e2e/kakaotalk.e2e.test.ts +7 -7
  16. package/e2e/line.e2e.test.ts +8 -8
  17. package/e2e/slack.e2e.test.ts +34 -34
  18. package/e2e/slackbot.e2e.test.ts +14 -14
  19. package/e2e/teams.e2e.test.ts +23 -23
  20. package/e2e/telegram.e2e.test.ts +8 -8
  21. package/e2e/webex.e2e.test.ts +14 -14
  22. package/e2e/whatsapp.e2e.test.ts +8 -8
  23. package/e2e/whatsappbot.e2e.test.ts +6 -6
  24. package/package.json +1 -1
  25. package/skills/agent-channeltalk/SKILL.md +1 -1
  26. package/skills/agent-channeltalkbot/SKILL.md +1 -1
  27. package/skills/agent-discord/SKILL.md +1 -1
  28. package/skills/agent-discordbot/SKILL.md +1 -1
  29. package/skills/agent-instagram/SKILL.md +1 -1
  30. package/skills/agent-kakaotalk/SKILL.md +1 -1
  31. package/skills/agent-line/SKILL.md +1 -1
  32. package/skills/agent-slack/SKILL.md +1 -1
  33. package/skills/agent-slackbot/SKILL.md +1 -1
  34. package/skills/agent-teams/SKILL.md +1 -1
  35. package/skills/agent-telegram/SKILL.md +1 -1
  36. package/skills/agent-webex/SKILL.md +1 -1
  37. package/skills/agent-wechatbot/SKILL.md +1 -1
  38. package/skills/agent-whatsapp/SKILL.md +1 -1
  39. package/skills/agent-whatsappbot/SKILL.md +1 -1
  40. package/src/platforms/channeltalk/client.test.ts +26 -26
  41. package/src/platforms/channeltalk/commands/auth.test.ts +16 -16
  42. package/src/platforms/channeltalk/commands/bot.test.ts +2 -2
  43. package/src/platforms/channeltalk/commands/chat.test.ts +3 -3
  44. package/src/platforms/channeltalk/commands/group.test.ts +4 -4
  45. package/src/platforms/channeltalk/commands/manager.test.ts +2 -2
  46. package/src/platforms/channeltalk/commands/message.test.ts +17 -17
  47. package/src/platforms/channeltalk/commands/snapshot.test.ts +7 -7
  48. package/src/platforms/channeltalk/commands/whoami.test.ts +3 -3
  49. package/src/platforms/channeltalk/credential-manager.test.ts +18 -18
  50. package/src/platforms/channeltalk/ensure-auth.test.ts +5 -5
  51. package/src/platforms/channeltalk/index.test.ts +23 -23
  52. package/src/platforms/channeltalk/token-extractor.test.ts +21 -21
  53. package/src/platforms/channeltalk/types.test.ts +12 -12
  54. package/src/platforms/channeltalkbot/client.test.ts +14 -14
  55. package/src/platforms/channeltalkbot/commands/auth.test.ts +16 -16
  56. package/src/platforms/channeltalkbot/commands/bot.test.ts +6 -6
  57. package/src/platforms/channeltalkbot/commands/chat.test.ts +9 -9
  58. package/src/platforms/channeltalkbot/commands/group.test.ts +6 -6
  59. package/src/platforms/channeltalkbot/commands/manager.test.ts +3 -3
  60. package/src/platforms/channeltalkbot/commands/message.test.ts +10 -10
  61. package/src/platforms/channeltalkbot/commands/snapshot.test.ts +7 -7
  62. package/src/platforms/channeltalkbot/commands/whoami.test.ts +4 -4
  63. package/src/platforms/channeltalkbot/credential-manager.test.ts +27 -27
  64. package/src/platforms/channeltalkbot/index.test.ts +15 -15
  65. package/src/platforms/discord/client.test.ts +28 -28
  66. package/src/platforms/discord/commands/auth.test.ts +7 -7
  67. package/src/platforms/discord/commands/channel.test.ts +7 -7
  68. package/src/platforms/discord/commands/dm.test.ts +4 -4
  69. package/src/platforms/discord/commands/file.test.ts +4 -4
  70. package/src/platforms/discord/commands/friend.test.ts +6 -6
  71. package/src/platforms/discord/commands/member.test.ts +5 -5
  72. package/src/platforms/discord/commands/mention.test.ts +5 -5
  73. package/src/platforms/discord/commands/message.test.ts +9 -9
  74. package/src/platforms/discord/commands/note.test.ts +6 -6
  75. package/src/platforms/discord/commands/profile.test.ts +4 -4
  76. package/src/platforms/discord/commands/reaction.test.ts +5 -5
  77. package/src/platforms/discord/commands/server.test.ts +7 -7
  78. package/src/platforms/discord/commands/snapshot.test.ts +6 -6
  79. package/src/platforms/discord/commands/thread.test.ts +6 -6
  80. package/src/platforms/discord/commands/user.test.ts +5 -5
  81. package/src/platforms/discord/commands/whoami.test.ts +6 -6
  82. package/src/platforms/discord/credential-manager.test.ts +16 -16
  83. package/src/platforms/discord/ensure-auth.test.ts +8 -8
  84. package/src/platforms/discord/index.test.ts +17 -17
  85. package/src/platforms/discord/listener.test.ts +33 -33
  86. package/src/platforms/discord/token-extractor.test.ts +53 -53
  87. package/src/platforms/discord/types.test.ts +26 -26
  88. package/src/platforms/discordbot/client.test.ts +31 -31
  89. package/src/platforms/discordbot/commands/auth.test.ts +18 -18
  90. package/src/platforms/discordbot/commands/channel.test.ts +11 -11
  91. package/src/platforms/discordbot/commands/file.test.ts +7 -7
  92. package/src/platforms/discordbot/commands/message.test.ts +25 -25
  93. package/src/platforms/discordbot/commands/reaction.test.ts +6 -6
  94. package/src/platforms/discordbot/commands/server.test.ts +12 -12
  95. package/src/platforms/discordbot/commands/snapshot.test.ts +13 -13
  96. package/src/platforms/discordbot/commands/thread.test.ts +10 -10
  97. package/src/platforms/discordbot/commands/user.test.ts +9 -9
  98. package/src/platforms/discordbot/commands/whoami.test.ts +4 -4
  99. package/src/platforms/discordbot/credential-manager.test.ts +28 -28
  100. package/src/platforms/instagram/client.test.ts +18 -18
  101. package/src/platforms/instagram/commands/auth.test.ts +11 -11
  102. package/src/platforms/instagram/commands/chat.test.ts +6 -6
  103. package/src/platforms/instagram/commands/message.test.ts +11 -11
  104. package/src/platforms/instagram/commands/shared.test.ts +12 -12
  105. package/src/platforms/instagram/commands/whoami.test.ts +3 -3
  106. package/src/platforms/instagram/credential-manager.test.ts +21 -21
  107. package/src/platforms/instagram/ensure-auth.test.ts +4 -4
  108. package/src/platforms/instagram/index.test.ts +9 -9
  109. package/src/platforms/instagram/listener.test.ts +8 -8
  110. package/src/platforms/instagram/token-extractor.test.ts +35 -35
  111. package/src/platforms/kakaotalk/client.test.ts +33 -33
  112. package/src/platforms/kakaotalk/commands/auth.test.ts +11 -11
  113. package/src/platforms/kakaotalk/commands/chat.test.ts +6 -6
  114. package/src/platforms/kakaotalk/commands/message.test.ts +7 -7
  115. package/src/platforms/kakaotalk/commands/whoami.test.ts +5 -5
  116. package/src/platforms/kakaotalk/credential-manager.test.ts +15 -15
  117. package/src/platforms/kakaotalk/index.test.ts +15 -15
  118. package/src/platforms/kakaotalk/listener.test.ts +17 -17
  119. package/src/platforms/line/client.test.ts +17 -17
  120. package/src/platforms/line/commands/auth.test.ts +8 -8
  121. package/src/platforms/line/commands/chat.test.ts +7 -7
  122. package/src/platforms/line/commands/friend.test.ts +6 -6
  123. package/src/platforms/line/commands/message.test.ts +7 -7
  124. package/src/platforms/line/commands/whoami.test.ts +6 -6
  125. package/src/platforms/line/credential-manager.test.ts +17 -17
  126. package/src/platforms/line/index.test.ts +10 -10
  127. package/src/platforms/line/listener.test.ts +15 -15
  128. package/src/platforms/line/types.test.ts +14 -14
  129. package/src/platforms/slack/cli.test.ts +8 -8
  130. package/src/platforms/slack/client.test.ts +151 -151
  131. package/src/platforms/slack/commands/activity.test.ts +13 -13
  132. package/src/platforms/slack/commands/auth.test.ts +34 -34
  133. package/src/platforms/slack/commands/bookmark.test.ts +9 -9
  134. package/src/platforms/slack/commands/channel.test.ts +17 -17
  135. package/src/platforms/slack/commands/drafts.test.ts +7 -7
  136. package/src/platforms/slack/commands/emoji.test.ts +3 -3
  137. package/src/platforms/slack/commands/file.test.ts +12 -12
  138. package/src/platforms/slack/commands/message.test.ts +19 -19
  139. package/src/platforms/slack/commands/pin.test.ts +7 -7
  140. package/src/platforms/slack/commands/reaction.test.ts +10 -10
  141. package/src/platforms/slack/commands/reminder.test.ts +9 -9
  142. package/src/platforms/slack/commands/saved.test.ts +7 -7
  143. package/src/platforms/slack/commands/sections.test.ts +5 -5
  144. package/src/platforms/slack/commands/snapshot.test.ts +13 -13
  145. package/src/platforms/slack/commands/unread.test.ts +6 -6
  146. package/src/platforms/slack/commands/user.test.ts +10 -10
  147. package/src/platforms/slack/commands/usergroup.test.ts +15 -15
  148. package/src/platforms/slack/commands/whoami.test.ts +6 -6
  149. package/src/platforms/slack/commands/workspace.test.ts +26 -26
  150. package/src/platforms/slack/credential-manager.test.ts +14 -14
  151. package/src/platforms/slack/ensure-auth.test.ts +21 -21
  152. package/src/platforms/slack/index.test.ts +12 -12
  153. package/src/platforms/slack/listener.test.ts +17 -17
  154. package/src/platforms/slack/token-extractor-node.test.ts +2 -2
  155. package/src/platforms/slack/token-extractor.test.ts +37 -37
  156. package/src/platforms/slack/types.test.ts +21 -21
  157. package/src/platforms/slackbot/client.test.ts +22 -22
  158. package/src/platforms/slackbot/commands/auth.test.ts +14 -14
  159. package/src/platforms/slackbot/commands/channel.test.ts +7 -7
  160. package/src/platforms/slackbot/commands/message.test.ts +13 -13
  161. package/src/platforms/slackbot/commands/reaction.test.ts +6 -6
  162. package/src/platforms/slackbot/commands/user.test.ts +7 -7
  163. package/src/platforms/slackbot/commands/whoami.test.ts +4 -4
  164. package/src/platforms/slackbot/credential-manager.test.ts +22 -22
  165. package/src/platforms/slackbot/types.test.ts +7 -7
  166. package/src/platforms/teams/client.test.ts +30 -30
  167. package/src/platforms/teams/commands/auth.test.ts +8 -8
  168. package/src/platforms/teams/commands/channel.test.ts +7 -7
  169. package/src/platforms/teams/commands/file.test.ts +4 -4
  170. package/src/platforms/teams/commands/message.test.ts +5 -5
  171. package/src/platforms/teams/commands/reaction.test.ts +4 -4
  172. package/src/platforms/teams/commands/snapshot.test.ts +7 -7
  173. package/src/platforms/teams/commands/team.test.ts +8 -8
  174. package/src/platforms/teams/commands/user.test.ts +4 -4
  175. package/src/platforms/teams/commands/whoami.test.ts +6 -6
  176. package/src/platforms/teams/credential-manager.test.ts +17 -17
  177. package/src/platforms/teams/ensure-auth.test.ts +13 -13
  178. package/src/platforms/teams/index.test.ts +15 -15
  179. package/src/platforms/teams/token-extractor.test.ts +219 -145
  180. package/src/platforms/teams/token-extractor.ts +13 -2
  181. package/src/platforms/teams/types.test.ts +26 -26
  182. package/src/platforms/telegram/app-config.test.ts +4 -4
  183. package/src/platforms/telegram/chat-utils.test.ts +12 -12
  184. package/src/platforms/telegram/client.test.ts +4 -4
  185. package/src/platforms/telegram/commands/auth.test.ts +16 -16
  186. package/src/platforms/telegram/commands/chat.test.ts +9 -9
  187. package/src/platforms/telegram/commands/message.test.ts +6 -6
  188. package/src/platforms/telegram/commands/shared.test.ts +3 -3
  189. package/src/platforms/telegram/commands/whoami.test.ts +3 -3
  190. package/src/platforms/telegram/credential-manager.test.ts +10 -10
  191. package/src/platforms/telegram/types.test.ts +6 -6
  192. package/src/platforms/webex/app-config.test.ts +8 -8
  193. package/src/platforms/webex/cli.test.ts +5 -5
  194. package/src/platforms/webex/client.test.ts +65 -65
  195. package/src/platforms/webex/commands/auth.test.ts +18 -18
  196. package/src/platforms/webex/commands/member.test.ts +5 -5
  197. package/src/platforms/webex/commands/message.test.ts +12 -12
  198. package/src/platforms/webex/commands/snapshot.test.ts +5 -5
  199. package/src/platforms/webex/commands/space.test.ts +10 -10
  200. package/src/platforms/webex/commands/whoami.test.ts +6 -6
  201. package/src/platforms/webex/credential-manager.test.ts +22 -22
  202. package/src/platforms/webex/encryption.test.ts +4 -4
  203. package/src/platforms/webex/ensure-auth.test.ts +5 -5
  204. package/src/platforms/webex/index.test.ts +5 -5
  205. package/src/platforms/webex/markdown-to-html.test.ts +33 -33
  206. package/src/platforms/webex/token-extractor.test.ts +23 -23
  207. package/src/platforms/webex/types.test.ts +27 -27
  208. package/src/platforms/wechatbot/client.test.ts +27 -27
  209. package/src/platforms/wechatbot/commands/auth.test.ts +15 -15
  210. package/src/platforms/wechatbot/commands/message.test.ts +8 -8
  211. package/src/platforms/wechatbot/commands/template.test.ts +9 -9
  212. package/src/platforms/wechatbot/commands/user.test.ts +7 -7
  213. package/src/platforms/wechatbot/commands/whoami.test.ts +5 -5
  214. package/src/platforms/wechatbot/credential-manager.test.ts +18 -18
  215. package/src/platforms/wechatbot/index.test.ts +10 -10
  216. package/src/platforms/wechatbot/types.test.ts +25 -25
  217. package/src/platforms/whatsapp/commands/auth.test.ts +13 -13
  218. package/src/platforms/whatsapp/commands/chat.test.ts +8 -8
  219. package/src/platforms/whatsapp/commands/message.test.ts +10 -10
  220. package/src/platforms/whatsapp/commands/whoami.test.ts +3 -3
  221. package/src/platforms/whatsapp/credential-manager.test.ts +23 -23
  222. package/src/platforms/whatsapp/ensure-auth.test.ts +4 -4
  223. package/src/platforms/whatsapp/index.test.ts +8 -8
  224. package/src/platforms/whatsapp/types.test.ts +42 -42
  225. package/src/platforms/whatsappbot/client.test.ts +27 -27
  226. package/src/platforms/whatsappbot/commands/auth.test.ts +14 -14
  227. package/src/platforms/whatsappbot/commands/message.test.ts +16 -16
  228. package/src/platforms/whatsappbot/commands/template.test.ts +9 -9
  229. package/src/platforms/whatsappbot/commands/whoami.test.ts +5 -5
  230. package/src/platforms/whatsappbot/credential-manager.test.ts +18 -18
  231. package/src/platforms/whatsappbot/index.test.ts +7 -7
  232. package/src/platforms/whatsappbot/types.test.ts +18 -18
  233. package/src/shared/chromium/browsers.test.ts +22 -22
  234. package/src/shared/chromium/cookie-reader.test.ts +13 -13
  235. package/src/shared/chromium/decryptor.test.ts +97 -32
  236. package/src/shared/chromium/decryptor.ts +27 -6
  237. package/src/shared/utils/concurrency.test.ts +6 -6
  238. package/src/shared/utils/derived-key-cache.test.ts +11 -11
  239. package/src/tui/utils.test.ts +31 -31
@@ -1,4 +1,4 @@
1
- import { expect, test } from 'bun:test'
1
+ import { expect, it } from 'bun:test'
2
2
 
3
3
  import {
4
4
  WebexConfigSchema,
@@ -9,7 +9,7 @@ import {
9
9
  WebexSpaceSchema,
10
10
  } from './types'
11
11
 
12
- test('WebexSpaceSchema validates valid space', () => {
12
+ it('WebexSpaceSchema validates valid space', () => {
13
13
  const result = WebexSpaceSchema.safeParse({
14
14
  id: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
15
15
  title: 'Project Alpha',
@@ -22,7 +22,7 @@ test('WebexSpaceSchema validates valid space', () => {
22
22
  expect(result.success).toBe(true)
23
23
  })
24
24
 
25
- test('WebexSpaceSchema validates space with optional teamId', () => {
25
+ it('WebexSpaceSchema validates space with optional teamId', () => {
26
26
  const result = WebexSpaceSchema.safeParse({
27
27
  id: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
28
28
  title: 'Project Alpha',
@@ -36,7 +36,7 @@ test('WebexSpaceSchema validates space with optional teamId', () => {
36
36
  expect(result.success).toBe(true)
37
37
  })
38
38
 
39
- test('WebexSpaceSchema validates direct space type', () => {
39
+ it('WebexSpaceSchema validates direct space type', () => {
40
40
  const result = WebexSpaceSchema.safeParse({
41
41
  id: 'Y2lzY29zcGFyazovL3VzL1JPT00vZGlyZWN0',
42
42
  title: 'Direct Message',
@@ -49,7 +49,7 @@ test('WebexSpaceSchema validates direct space type', () => {
49
49
  expect(result.success).toBe(true)
50
50
  })
51
51
 
52
- test('WebexSpaceSchema rejects missing required fields', () => {
52
+ it('WebexSpaceSchema rejects missing required fields', () => {
53
53
  const result = WebexSpaceSchema.safeParse({
54
54
  id: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
55
55
  title: 'Project Alpha',
@@ -57,7 +57,7 @@ test('WebexSpaceSchema rejects missing required fields', () => {
57
57
  expect(result.success).toBe(false)
58
58
  })
59
59
 
60
- test('WebexSpaceSchema rejects invalid type', () => {
60
+ it('WebexSpaceSchema rejects invalid type', () => {
61
61
  const result = WebexSpaceSchema.safeParse({
62
62
  id: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
63
63
  title: 'Project Alpha',
@@ -70,7 +70,7 @@ test('WebexSpaceSchema rejects invalid type', () => {
70
70
  expect(result.success).toBe(false)
71
71
  })
72
72
 
73
- test('WebexMessageSchema validates valid message', () => {
73
+ it('WebexMessageSchema validates valid message', () => {
74
74
  const result = WebexMessageSchema.safeParse({
75
75
  id: 'Y2lzY29zcGFyazovL3VzL01FU1NBR0UvbXNn',
76
76
  roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
@@ -83,7 +83,7 @@ test('WebexMessageSchema validates valid message', () => {
83
83
  expect(result.success).toBe(true)
84
84
  })
85
85
 
86
- test('WebexMessageSchema validates message with optional fields', () => {
86
+ it('WebexMessageSchema validates message with optional fields', () => {
87
87
  const result = WebexMessageSchema.safeParse({
88
88
  id: 'Y2lzY29zcGFyazovL3VzL01FU1NBR0UvbXNn',
89
89
  roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
@@ -101,7 +101,7 @@ test('WebexMessageSchema validates message with optional fields', () => {
101
101
  expect(result.success).toBe(true)
102
102
  })
103
103
 
104
- test('WebexMessageSchema rejects missing required fields', () => {
104
+ it('WebexMessageSchema rejects missing required fields', () => {
105
105
  const result = WebexMessageSchema.safeParse({
106
106
  id: 'Y2lzY29zcGFyazovL3VzL01FU1NBR0UvbXNn',
107
107
  roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
@@ -110,7 +110,7 @@ test('WebexMessageSchema rejects missing required fields', () => {
110
110
  expect(result.success).toBe(false)
111
111
  })
112
112
 
113
- test('WebexMessageSchema rejects invalid roomType', () => {
113
+ it('WebexMessageSchema rejects invalid roomType', () => {
114
114
  const result = WebexMessageSchema.safeParse({
115
115
  id: 'Y2lzY29zcGFyazovL3VzL01FU1NBR0UvbXNn',
116
116
  roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
@@ -122,7 +122,7 @@ test('WebexMessageSchema rejects invalid roomType', () => {
122
122
  expect(result.success).toBe(false)
123
123
  })
124
124
 
125
- test('WebexPersonSchema validates valid person', () => {
125
+ it('WebexPersonSchema validates valid person', () => {
126
126
  const result = WebexPersonSchema.safeParse({
127
127
  id: 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS9hYmM',
128
128
  emails: ['user@example.com'],
@@ -134,7 +134,7 @@ test('WebexPersonSchema validates valid person', () => {
134
134
  expect(result.success).toBe(true)
135
135
  })
136
136
 
137
- test('WebexPersonSchema validates person with optional fields', () => {
137
+ it('WebexPersonSchema validates person with optional fields', () => {
138
138
  const result = WebexPersonSchema.safeParse({
139
139
  id: 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS9hYmM',
140
140
  emails: ['user@example.com', 'user@work.com'],
@@ -150,7 +150,7 @@ test('WebexPersonSchema validates person with optional fields', () => {
150
150
  expect(result.success).toBe(true)
151
151
  })
152
152
 
153
- test('WebexPersonSchema validates bot type', () => {
153
+ it('WebexPersonSchema validates bot type', () => {
154
154
  const result = WebexPersonSchema.safeParse({
155
155
  id: 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS9ib3Q',
156
156
  emails: ['bot@webex.bot'],
@@ -162,7 +162,7 @@ test('WebexPersonSchema validates bot type', () => {
162
162
  expect(result.success).toBe(true)
163
163
  })
164
164
 
165
- test('WebexPersonSchema rejects missing required fields', () => {
165
+ it('WebexPersonSchema rejects missing required fields', () => {
166
166
  const result = WebexPersonSchema.safeParse({
167
167
  id: 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS9hYmM',
168
168
  displayName: 'Test User',
@@ -170,7 +170,7 @@ test('WebexPersonSchema rejects missing required fields', () => {
170
170
  expect(result.success).toBe(false)
171
171
  })
172
172
 
173
- test('WebexPersonSchema rejects invalid type', () => {
173
+ it('WebexPersonSchema rejects invalid type', () => {
174
174
  const result = WebexPersonSchema.safeParse({
175
175
  id: 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS9hYmM',
176
176
  emails: ['user@example.com'],
@@ -182,7 +182,7 @@ test('WebexPersonSchema rejects invalid type', () => {
182
182
  expect(result.success).toBe(false)
183
183
  })
184
184
 
185
- test('WebexMembershipSchema validates valid membership', () => {
185
+ it('WebexMembershipSchema validates valid membership', () => {
186
186
  const result = WebexMembershipSchema.safeParse({
187
187
  id: 'Y2lzY29zcGFyazovL3VzL01FTUJFUlNISVAvbWVt',
188
188
  roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
@@ -195,7 +195,7 @@ test('WebexMembershipSchema validates valid membership', () => {
195
195
  expect(result.success).toBe(true)
196
196
  })
197
197
 
198
- test('WebexMembershipSchema validates moderator membership', () => {
198
+ it('WebexMembershipSchema validates moderator membership', () => {
199
199
  const result = WebexMembershipSchema.safeParse({
200
200
  id: 'Y2lzY29zcGFyazovL3VzL01FTUJFUlNISVAvbWVt',
201
201
  roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
@@ -208,7 +208,7 @@ test('WebexMembershipSchema validates moderator membership', () => {
208
208
  expect(result.success).toBe(true)
209
209
  })
210
210
 
211
- test('WebexMembershipSchema rejects missing required fields', () => {
211
+ it('WebexMembershipSchema rejects missing required fields', () => {
212
212
  const result = WebexMembershipSchema.safeParse({
213
213
  id: 'Y2lzY29zcGFyazovL3VzL01FTUJFUlNISVAvbWVt',
214
214
  roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
@@ -216,7 +216,7 @@ test('WebexMembershipSchema rejects missing required fields', () => {
216
216
  expect(result.success).toBe(false)
217
217
  })
218
218
 
219
- test('WebexConfigSchema validates valid OAuth config', () => {
219
+ it('WebexConfigSchema validates valid OAuth config', () => {
220
220
  const result = WebexConfigSchema.safeParse({
221
221
  accessToken: 'test',
222
222
  refreshToken: 'test',
@@ -225,7 +225,7 @@ test('WebexConfigSchema validates valid OAuth config', () => {
225
225
  expect(result.success).toBe(true)
226
226
  })
227
227
 
228
- test('WebexConfigSchema validates config with clientId and clientSecret', () => {
228
+ it('WebexConfigSchema validates config with clientId and clientSecret', () => {
229
229
  const result = WebexConfigSchema.safeParse({
230
230
  accessToken: 'test',
231
231
  refreshToken: 'test',
@@ -240,7 +240,7 @@ test('WebexConfigSchema validates config with clientId and clientSecret', () =>
240
240
  }
241
241
  })
242
242
 
243
- test('WebexConfigSchema validates config with tokenType oauth', () => {
243
+ it('WebexConfigSchema validates config with tokenType oauth', () => {
244
244
  const result = WebexConfigSchema.safeParse({
245
245
  accessToken: 'test',
246
246
  refreshToken: 'test',
@@ -253,7 +253,7 @@ test('WebexConfigSchema validates config with tokenType oauth', () => {
253
253
  }
254
254
  })
255
255
 
256
- test('WebexConfigSchema validates config with tokenType manual', () => {
256
+ it('WebexConfigSchema validates config with tokenType manual', () => {
257
257
  const result = WebexConfigSchema.safeParse({
258
258
  accessToken: 'test',
259
259
  refreshToken: '',
@@ -266,7 +266,7 @@ test('WebexConfigSchema validates config with tokenType manual', () => {
266
266
  }
267
267
  })
268
268
 
269
- test('WebexConfigSchema rejects invalid tokenType', () => {
269
+ it('WebexConfigSchema rejects invalid tokenType', () => {
270
270
  const result = WebexConfigSchema.safeParse({
271
271
  accessToken: 'test',
272
272
  refreshToken: 'test',
@@ -276,7 +276,7 @@ test('WebexConfigSchema rejects invalid tokenType', () => {
276
276
  expect(result.success).toBe(false)
277
277
  })
278
278
 
279
- test('WebexConfigSchema accepts config without clientId/clientSecret (backward compat)', () => {
279
+ it('WebexConfigSchema accepts config without clientId/clientSecret (backward compat)', () => {
280
280
  const result = WebexConfigSchema.safeParse({
281
281
  accessToken: 'test',
282
282
  refreshToken: 'test',
@@ -289,19 +289,19 @@ test('WebexConfigSchema accepts config without clientId/clientSecret (backward c
289
289
  }
290
290
  })
291
291
 
292
- test('WebexConfigSchema rejects missing fields', () => {
292
+ it('WebexConfigSchema rejects missing fields', () => {
293
293
  const result = WebexConfigSchema.safeParse({})
294
294
  expect(result.success).toBe(false)
295
295
  })
296
296
 
297
- test('WebexError has correct name and code', () => {
297
+ it('WebexError has correct name and code', () => {
298
298
  const error = new WebexError('Not found', 'NOT_FOUND')
299
299
  expect(error.name).toBe('WebexError')
300
300
  expect(error.message).toBe('Not found')
301
301
  expect(error.code).toBe('NOT_FOUND')
302
302
  })
303
303
 
304
- test('WebexError is instance of Error', () => {
304
+ it('WebexError is instance of Error', () => {
305
305
  const error = new WebexError('Unauthorized', 'UNAUTHORIZED')
306
306
  expect(error instanceof Error).toBe(true)
307
307
  })
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
2
2
 
3
3
  import { WeChatBotClient } from '@/platforms/wechatbot/client'
4
4
  import { WeChatBotError } from '@/platforms/wechatbot/types'
@@ -48,28 +48,28 @@ describe('WeChatBotClient', () => {
48
48
  const tokenResponse = () => mockResponse({ access_token: 'test-token', expires_in: 7200 })
49
49
 
50
50
  describe('login', () => {
51
- test('throws on empty appId', async () => {
51
+ it('throws on empty appId', async () => {
52
52
  await expect(new WeChatBotClient().login({ appId: '', appSecret: 'secret' })).rejects.toThrow(WeChatBotError)
53
53
  await expect(new WeChatBotClient().login({ appId: '', appSecret: 'secret' })).rejects.toThrow(
54
54
  'App ID is required',
55
55
  )
56
56
  })
57
57
 
58
- test('throws on empty appSecret', async () => {
58
+ it('throws on empty appSecret', async () => {
59
59
  await expect(new WeChatBotClient().login({ appId: 'wx123', appSecret: '' })).rejects.toThrow(WeChatBotError)
60
60
  await expect(new WeChatBotClient().login({ appId: 'wx123', appSecret: '' })).rejects.toThrow(
61
61
  'App Secret is required',
62
62
  )
63
63
  })
64
64
 
65
- test('accepts valid credentials and returns client', async () => {
65
+ it('accepts valid credentials and returns client', async () => {
66
66
  const client = await new WeChatBotClient().login({ appId: 'wx123', appSecret: 'secret123' })
67
67
  expect(client).toBeInstanceOf(WeChatBotClient)
68
68
  })
69
69
  })
70
70
 
71
71
  describe('verifyCredentials', () => {
72
- test('calls token endpoint and returns true on success', async () => {
72
+ it('calls token endpoint and returns true on success', async () => {
73
73
  tokenResponse()
74
74
 
75
75
  const client = await new WeChatBotClient().login({ appId: 'wx123', appSecret: 'secret123' })
@@ -82,7 +82,7 @@ describe('WeChatBotClient', () => {
82
82
  expect(fetchCalls[0].url).toContain('secret=secret123')
83
83
  })
84
84
 
85
- test('returns false on token error', async () => {
85
+ it('returns false on token error', async () => {
86
86
  mockResponse({ errcode: 40125, errmsg: 'invalid appsecret' })
87
87
 
88
88
  const client = await new WeChatBotClient().login({ appId: 'wx123', appSecret: 'bad-secret' })
@@ -91,7 +91,7 @@ describe('WeChatBotClient', () => {
91
91
  expect(result).toBe(false)
92
92
  })
93
93
 
94
- test('returns false on network error', async () => {
94
+ it('returns false on network error', async () => {
95
95
  fetchResponses = []
96
96
  Object.defineProperty(globalThis, 'fetch', {
97
97
  value: async (): Promise<Response> => {
@@ -109,7 +109,7 @@ describe('WeChatBotClient', () => {
109
109
  })
110
110
 
111
111
  describe('sendTextMessage', () => {
112
- test('sends POST to /cgi-bin/message/custom/send with token in query', async () => {
112
+ it('sends POST to /cgi-bin/message/custom/send with token in query', async () => {
113
113
  tokenResponse()
114
114
  mockResponse({ errcode: 0, errmsg: 'ok' })
115
115
 
@@ -123,7 +123,7 @@ describe('WeChatBotClient', () => {
123
123
  expect(call.options?.method).toBe('POST')
124
124
  })
125
125
 
126
- test('sends correct body shape', async () => {
126
+ it('sends correct body shape', async () => {
127
127
  tokenResponse()
128
128
  mockResponse({ errcode: 0, errmsg: 'ok' })
129
129
 
@@ -140,7 +140,7 @@ describe('WeChatBotClient', () => {
140
140
  })
141
141
 
142
142
  describe('sendImageMessage', () => {
143
- test('sends POST with image payload', async () => {
143
+ it('sends POST with image payload', async () => {
144
144
  tokenResponse()
145
145
  mockResponse({ errcode: 0, errmsg: 'ok' })
146
146
 
@@ -157,7 +157,7 @@ describe('WeChatBotClient', () => {
157
157
  })
158
158
 
159
159
  describe('sendNewsMessage', () => {
160
- test('sends POST with news/articles payload', async () => {
160
+ it('sends POST with news/articles payload', async () => {
161
161
  tokenResponse()
162
162
  mockResponse({ errcode: 0, errmsg: 'ok' })
163
163
 
@@ -182,7 +182,7 @@ describe('WeChatBotClient', () => {
182
182
  })
183
183
 
184
184
  describe('sendTemplateMessage', () => {
185
- test('sends POST to /cgi-bin/message/template/send and returns msgid', async () => {
185
+ it('sends POST to /cgi-bin/message/template/send and returns msgid', async () => {
186
186
  tokenResponse()
187
187
  mockResponse({ errcode: 0, errmsg: 'ok', msgid: 12345 })
188
188
 
@@ -208,7 +208,7 @@ describe('WeChatBotClient', () => {
208
208
  })
209
209
 
210
210
  describe('listTemplates', () => {
211
- test('sends GET and unwraps template_list from response', async () => {
211
+ it('sends GET and unwraps template_list from response', async () => {
212
212
  tokenResponse()
213
213
  mockResponse({
214
214
  errcode: 0,
@@ -236,7 +236,7 @@ describe('WeChatBotClient', () => {
236
236
  })
237
237
 
238
238
  describe('deleteTemplate', () => {
239
- test('sends POST with template_id body', async () => {
239
+ it('sends POST with template_id body', async () => {
240
240
  tokenResponse()
241
241
  mockResponse({ errcode: 0, errmsg: 'ok' })
242
242
 
@@ -250,7 +250,7 @@ describe('WeChatBotClient', () => {
250
250
  })
251
251
 
252
252
  describe('getFollowers', () => {
253
- test('sends GET to /cgi-bin/user/get and returns openids array', async () => {
253
+ it('sends GET to /cgi-bin/user/get and returns openids array', async () => {
254
254
  tokenResponse()
255
255
  mockResponse({
256
256
  errcode: 0,
@@ -270,7 +270,7 @@ describe('WeChatBotClient', () => {
270
270
  expect(fetchCalls[1].url).toContain('/cgi-bin/user/get')
271
271
  })
272
272
 
273
- test('passes next_openid parameter when provided', async () => {
273
+ it('passes next_openid parameter when provided', async () => {
274
274
  tokenResponse()
275
275
  mockResponse({
276
276
  total: 1,
@@ -285,7 +285,7 @@ describe('WeChatBotClient', () => {
285
285
  expect(fetchCalls[1].url).toContain('next_openid=openid-2')
286
286
  })
287
287
 
288
- test('returns empty openids when data is missing', async () => {
288
+ it('returns empty openids when data is missing', async () => {
289
289
  tokenResponse()
290
290
  mockResponse({
291
291
  total: 0,
@@ -301,7 +301,7 @@ describe('WeChatBotClient', () => {
301
301
  })
302
302
 
303
303
  describe('getUserInfo', () => {
304
- test('sends GET with openid and lang params', async () => {
304
+ it('sends GET with openid and lang params', async () => {
305
305
  tokenResponse()
306
306
  mockResponse({
307
307
  subscribe: 1,
@@ -325,7 +325,7 @@ describe('WeChatBotClient', () => {
325
325
  expect(fetchCalls[1].url).toContain('lang=zh_CN')
326
326
  })
327
327
 
328
- test('defaults to zh_CN lang', async () => {
328
+ it('defaults to zh_CN lang', async () => {
329
329
  tokenResponse()
330
330
  mockResponse({
331
331
  subscribe: 1,
@@ -347,7 +347,7 @@ describe('WeChatBotClient', () => {
347
347
  })
348
348
 
349
349
  describe('token caching', () => {
350
- test('second call does not re-fetch token if not expired', async () => {
350
+ it('second call does not re-fetch token if not expired', async () => {
351
351
  tokenResponse()
352
352
  mockResponse({ errcode: 0, errmsg: 'ok' })
353
353
  mockResponse({ errcode: 0, errmsg: 'ok' })
@@ -364,7 +364,7 @@ describe('WeChatBotClient', () => {
364
364
  })
365
365
 
366
366
  describe('token auto-refresh on 40001', () => {
367
- test('fetches new token and retries on errcode 40001', async () => {
367
+ it('fetches new token and retries on errcode 40001', async () => {
368
368
  tokenResponse()
369
369
  mockResponse({ errcode: 40001, errmsg: 'invalid credential' })
370
370
  mockResponse({ access_token: 'new-token', expires_in: 7200 })
@@ -381,7 +381,7 @@ describe('WeChatBotClient', () => {
381
381
  })
382
382
 
383
383
  describe('retry on system busy (errcode -1)', () => {
384
- test('retries with backoff on errcode -1', async () => {
384
+ it('retries with backoff on errcode -1', async () => {
385
385
  tokenResponse()
386
386
  mockResponse({ errcode: -1, errmsg: 'system busy' })
387
387
  mockResponse({ errcode: -1, errmsg: 'system busy' })
@@ -401,7 +401,7 @@ describe('WeChatBotClient', () => {
401
401
  })
402
402
 
403
403
  describe('network error retry', () => {
404
- test('GET retries on fetch throw', async () => {
404
+ it('GET retries on fetch throw', async () => {
405
405
  let callCount = 0
406
406
  Object.defineProperty(globalThis, 'fetch', {
407
407
  value: async (url: string | URL | Request, options?: RequestInit): Promise<Response> => {
@@ -434,7 +434,7 @@ describe('WeChatBotClient', () => {
434
434
  expect(callCount).toBe(4)
435
435
  })
436
436
 
437
- test('POST does not retry on fetch throw', async () => {
437
+ it('POST does not retry on fetch throw', async () => {
438
438
  let callCount = 0
439
439
  Object.defineProperty(globalThis, 'fetch', {
440
440
  value: async (url: string | URL | Request, options?: RequestInit): Promise<Response> => {
@@ -456,7 +456,7 @@ describe('WeChatBotClient', () => {
456
456
  })
457
457
 
458
458
  describe('errcode handling', () => {
459
- test('non-zero errcode throws WeChatBotError with correct code', async () => {
459
+ it('non-zero errcode throws WeChatBotError with correct code', async () => {
460
460
  tokenResponse()
461
461
  mockResponse({ errcode: 48001, errmsg: 'api unauthorized' })
462
462
 
@@ -472,7 +472,7 @@ describe('WeChatBotClient', () => {
472
472
  }
473
473
  })
474
474
 
475
- test('errcode 0 does not throw', async () => {
475
+ it('errcode 0 does not throw', async () => {
476
476
  tokenResponse()
477
477
  mockResponse({ errcode: 0, errmsg: 'ok' })
478
478
 
@@ -482,7 +482,7 @@ describe('WeChatBotClient', () => {
482
482
  })
483
483
 
484
484
  describe('rate limit (errcode 45009)', () => {
485
- test('throws WeChatBotError with code 45009 and appropriate message', async () => {
485
+ it('throws WeChatBotError with code 45009 and appropriate message', async () => {
486
486
  tokenResponse()
487
487
  mockResponse({ errcode: 45009, errmsg: 'reach max api daily quota limit' })
488
488
 
@@ -1,4 +1,4 @@
1
- import { afterAll, describe, expect, mock, test } from 'bun:test'
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
 
@@ -31,7 +31,7 @@ afterAll(() => {
31
31
  })
32
32
 
33
33
  describe('setAction', () => {
34
- test('returns success with app_id when credentials are valid', async () => {
34
+ it('returns success with app_id when credentials are valid', async () => {
35
35
  const credManager = makeCredManager()
36
36
  const result = await setAction('wx123', 'secret123', { _credManager: credManager })
37
37
 
@@ -40,7 +40,7 @@ describe('setAction', () => {
40
40
  expect(result.account_name).toBe('wx123')
41
41
  })
42
42
 
43
- test('saves credentials to credManager', async () => {
43
+ it('saves credentials to credManager', async () => {
44
44
  const credManager = makeCredManager()
45
45
  await setAction('wx456', 'secret456', { _credManager: credManager })
46
46
 
@@ -48,7 +48,7 @@ describe('setAction', () => {
48
48
  expect(creds?.app_id).toBe('wx456')
49
49
  })
50
50
 
51
- test('returns error when verifyCredentials returns false', async () => {
51
+ it('returns error when verifyCredentials returns false', async () => {
52
52
  mock.module('../client', () => ({
53
53
  WeChatBotClient: class MockWeChatBotClient {
54
54
  async login() {
@@ -68,7 +68,7 @@ describe('setAction', () => {
68
68
  })
69
69
 
70
70
  describe('statusAction', () => {
71
- test('returns valid: false when no credentials configured', async () => {
71
+ it('returns valid: false when no credentials configured', async () => {
72
72
  const credManager = makeCredManager()
73
73
  const result = await statusAction({ _credManager: credManager })
74
74
 
@@ -76,7 +76,7 @@ describe('statusAction', () => {
76
76
  expect(result.error).toBeDefined()
77
77
  })
78
78
 
79
- test('returns valid: true when credentials exist and are valid', async () => {
79
+ it('returns valid: true when credentials exist and are valid', async () => {
80
80
  mock.module('../client', () => ({
81
81
  WeChatBotClient: class MockWeChatBotClient {
82
82
  async login() {
@@ -96,7 +96,7 @@ describe('statusAction', () => {
96
96
  expect(result.app_id).toBe('wx123')
97
97
  })
98
98
 
99
- test('returns valid: false when credentials exist but are invalid', async () => {
99
+ it('returns valid: false when credentials exist but are invalid', async () => {
100
100
  mock.module('../client', () => ({
101
101
  WeChatBotClient: class MockWeChatBotClient {
102
102
  async login() {
@@ -115,7 +115,7 @@ describe('statusAction', () => {
115
115
  expect(result.valid).toBe(false)
116
116
  })
117
117
 
118
- test('returns error message when account not found', async () => {
118
+ it('returns error message when account not found', async () => {
119
119
  const credManager = makeCredManager()
120
120
  const result = await statusAction({ account: 'nonexistent', _credManager: credManager })
121
121
 
@@ -125,7 +125,7 @@ describe('statusAction', () => {
125
125
  })
126
126
 
127
127
  describe('clearAction', () => {
128
- test('clears all credentials and returns success', async () => {
128
+ it('clears all credentials and returns success', async () => {
129
129
  const credManager = makeCredManager()
130
130
  await credManager.setCredentials({ app_id: 'wx123', app_secret: 'secret123', account_name: 'My Account' })
131
131
 
@@ -139,14 +139,14 @@ describe('clearAction', () => {
139
139
  })
140
140
 
141
141
  describe('listAction', () => {
142
- test('returns empty accounts array when none configured', async () => {
142
+ it('returns empty accounts array when none configured', async () => {
143
143
  const credManager = makeCredManager()
144
144
  const result = await listAction({ _credManager: credManager })
145
145
 
146
146
  expect(result.accounts).toEqual([])
147
147
  })
148
148
 
149
- test('returns all accounts with is_current flag', async () => {
149
+ it('returns all accounts with is_current flag', async () => {
150
150
  const credManager = makeCredManager()
151
151
  await credManager.setCredentials({ app_id: 'wx-a', app_secret: 'secret-a', account_name: 'Account A' })
152
152
  await credManager.setCredentials({ app_id: 'wx-b', app_secret: 'secret-b', account_name: 'Account B' })
@@ -162,7 +162,7 @@ describe('listAction', () => {
162
162
  })
163
163
 
164
164
  describe('useAction', () => {
165
- test('switches to specified account and returns success', async () => {
165
+ it('switches to specified account and returns success', async () => {
166
166
  const credManager = makeCredManager()
167
167
  await credManager.setCredentials({ app_id: 'wx-a', app_secret: 'secret-a', account_name: 'Account A' })
168
168
  await credManager.setCredentials({ app_id: 'wx-b', app_secret: 'secret-b', account_name: 'Account B' })
@@ -173,7 +173,7 @@ describe('useAction', () => {
173
173
  expect(result.app_id).toBe('wx-a')
174
174
  })
175
175
 
176
- test('returns error when account not found', async () => {
176
+ it('returns error when account not found', async () => {
177
177
  const credManager = makeCredManager()
178
178
  const result = await useAction('nonexistent', { _credManager: credManager })
179
179
 
@@ -184,7 +184,7 @@ describe('useAction', () => {
184
184
  })
185
185
 
186
186
  describe('removeAction', () => {
187
- test('removes specified account and returns success', async () => {
187
+ it('removes specified account and returns success', async () => {
188
188
  const credManager = makeCredManager()
189
189
  await credManager.setCredentials({ app_id: 'wx123', app_secret: 'secret123', account_name: 'My Account' })
190
190
 
@@ -196,7 +196,7 @@ describe('removeAction', () => {
196
196
  expect(creds).toBeNull()
197
197
  })
198
198
 
199
- test('returns error when account not found', async () => {
199
+ it('returns error when account not found', async () => {
200
200
  const credManager = makeCredManager()
201
201
  const result = await removeAction('nonexistent', { _credManager: credManager })
202
202
 
@@ -1,4 +1,4 @@
1
- import { afterAll, describe, expect, mock, test } from 'bun:test'
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
 
@@ -43,7 +43,7 @@ afterAll(() => {
43
43
  })
44
44
 
45
45
  describe('sendAction', () => {
46
- test('sends text message and returns success', async () => {
46
+ it('sends text message and returns success', async () => {
47
47
  const credManager = await makeCredManagerWithCreds()
48
48
  const result = await sendAction('openid-123', 'Hello world', { _credManager: credManager })
49
49
 
@@ -51,7 +51,7 @@ describe('sendAction', () => {
51
51
  expect(sendTextMessageMock).toHaveBeenCalledWith('openid-123', 'Hello world')
52
52
  })
53
53
 
54
- test('returns error when client throws', async () => {
54
+ it('returns error when client throws', async () => {
55
55
  mock.module('../client', () => ({
56
56
  WeChatBotClient: class MockWeChatBotClient {
57
57
  async login() {
@@ -71,7 +71,7 @@ describe('sendAction', () => {
71
71
  })
72
72
 
73
73
  describe('sendImageAction', () => {
74
- test('sends image message and returns success', async () => {
74
+ it('sends image message and returns success', async () => {
75
75
  mock.module('../client', () => ({
76
76
  WeChatBotClient: class MockWeChatBotClient {
77
77
  async login() {
@@ -88,7 +88,7 @@ describe('sendImageAction', () => {
88
88
  expect(result.success).toBe(true)
89
89
  })
90
90
 
91
- test('returns error when client throws', async () => {
91
+ it('returns error when client throws', async () => {
92
92
  mock.module('../client', () => ({
93
93
  WeChatBotClient: class MockWeChatBotClient {
94
94
  async login() {
@@ -107,7 +107,7 @@ describe('sendImageAction', () => {
107
107
  })
108
108
 
109
109
  describe('sendNewsAction', () => {
110
- test('returns error when required options are missing', async () => {
110
+ it('returns error when required options are missing', async () => {
111
111
  const credManager = await makeCredManagerWithCreds()
112
112
  const result = await sendNewsAction('openid-123', { _credManager: credManager })
113
113
 
@@ -115,7 +115,7 @@ describe('sendNewsAction', () => {
115
115
  expect(result.success).toBeUndefined()
116
116
  })
117
117
 
118
- test('returns error when title is missing', async () => {
118
+ it('returns error when title is missing', async () => {
119
119
  const credManager = await makeCredManagerWithCreds()
120
120
  const result = await sendNewsAction('openid-123', {
121
121
  description: 'Test desc',
@@ -127,7 +127,7 @@ describe('sendNewsAction', () => {
127
127
  expect(result.error).toContain('--title')
128
128
  })
129
129
 
130
- test('sends news message with all required options', async () => {
130
+ it('sends news message with all required options', async () => {
131
131
  mock.module('../client', () => ({
132
132
  WeChatBotClient: class MockWeChatBotClient {
133
133
  async login() {