Files
goodbuddy/src/main/channels/channel-env.test.ts
T
2026-08-05 19:40:40 +08:00

81 lines
2.4 KiB
TypeScript

import { describe, expect, it, vi } from 'vitest'
import {
parseChannelEnvironment,
startEnvironmentChannels
} from './channel-env'
describe('channel environment bootstrap', () => {
it('starts only complete credentials with a non-empty explicit allowlist', () => {
expect(
parseChannelEnvironment({
GOODBUDDY_DINGTALK_CLIENT_ID: ' client-id ',
GOODBUDDY_DINGTALK_CLIENT_SECRET: ' secret ',
GOODBUDDY_DINGTALK_ALLOWED_SENDERS: ' USER-1,user-2 ',
GOODBUDDY_DINGTALK_ALLOW_GROUPS: 'true',
GOODBUDDY_WECOM_BOT_ID: 'bot-id',
GOODBUDDY_WECOM_SECRET: 'wecom-secret'
})
).toEqual([
{
channel: 'dingtalk',
clientId: 'client-id',
clientSecret: 'secret',
allowedSenderIds: ['user-1', 'user-2'],
allowGroupMessages: true
}
])
})
it('strictly parses booleans and comma-separated identities', () => {
expect(() =>
parseChannelEnvironment({
GOODBUDDY_WECOM_ALLOW_GROUPS: 'TRUE'
})
).toThrow('必须是 true 或 false')
expect(() =>
parseChannelEnvironment({
GOODBUDDY_WECOM_ALLOWED_SENDERS: 'user-1,,user-2'
})
).toThrow('包含空白身份')
})
it('defaults groups off and contains asynchronous startup failures', async () => {
const start = vi.fn(async () => {
throw new Error('secret=must-not-escape')
})
const stop = vi.fn(async () => undefined)
const onStartError = vi.fn()
const createService = vi.fn(() => ({ start, stop }))
const services = startEnvironmentChannels({
env: {
GOODBUDDY_WECOM_BOT_ID: 'bot-id',
GOODBUDDY_WECOM_SECRET: 'secret',
GOODBUDDY_WECOM_ALLOWED_SENDERS: 'user-1'
},
executor: vi.fn(async () => ({ status: 'completed' })),
createWeComDriver: vi.fn(() => ({ channel: 'wecom' }) as never),
createService,
onStartError
})
expect(services).toHaveLength(1)
expect(createService).toHaveBeenCalledWith(
expect.objectContaining({ channel: 'wecom' }),
expect.any(Function),
{
allowedSenderIds: ['user-1'],
allowGroupMessages: false
}
)
await vi.waitFor(() => {
expect(onStartError).toHaveBeenCalledWith(
'wecom',
'wecom 通道启动失败'
)
})
expect(JSON.stringify(onStartError.mock.calls)).not.toContain(
'must-not-escape'
)
})
})