81 lines
2.4 KiB
TypeScript
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'
|
|
)
|
|
})
|
|
})
|