134 lines
3.4 KiB
TypeScript
134 lines
3.4 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
CHANNEL_SETTINGS_LIMITS,
|
|
channelConnectionTestResultSchema,
|
|
channelSecretUpdateSchema,
|
|
channelSettingsApplySchema,
|
|
channelSettingsSnapshotSchema
|
|
} from './channel-settings-contracts'
|
|
|
|
describe('channel settings contracts', () => {
|
|
it('accepts bounded strict WeCom and DingTalk updates', () => {
|
|
expect(
|
|
channelSettingsApplySchema.parse({
|
|
weixin: {
|
|
enabled: false
|
|
},
|
|
wecom: {
|
|
enabled: true,
|
|
botId: ' bot-id ',
|
|
secret: { action: 'replace', value: ' secret ' },
|
|
allowedSenderIds: [' user-1 ', 'user-1'],
|
|
allowGroupMessages: false
|
|
},
|
|
dingtalk: {
|
|
enabled: false,
|
|
clientId: '',
|
|
secret: { action: 'clear' },
|
|
allowedSenderIds: [],
|
|
allowGroupMessages: true
|
|
}
|
|
})
|
|
).toEqual({
|
|
weixin: {
|
|
enabled: false
|
|
},
|
|
wecom: {
|
|
enabled: true,
|
|
botId: 'bot-id',
|
|
secret: { action: 'replace', value: 'secret' },
|
|
allowedSenderIds: ['user-1'],
|
|
allowGroupMessages: false
|
|
},
|
|
dingtalk: {
|
|
enabled: false,
|
|
clientId: '',
|
|
secret: { action: 'clear' },
|
|
allowedSenderIds: [],
|
|
allowGroupMessages: true
|
|
}
|
|
})
|
|
})
|
|
|
|
it('rejects unknown fields and unbounded values', () => {
|
|
expect(() =>
|
|
channelSecretUpdateSchema.parse({
|
|
action: 'keep',
|
|
value: 'must-not-be-accepted'
|
|
})
|
|
).toThrow()
|
|
expect(() =>
|
|
channelSettingsApplySchema.parse({
|
|
wecom: {
|
|
enabled: true,
|
|
botId: 'x'.repeat(
|
|
CHANNEL_SETTINGS_LIMITS.maximumIdentifierLength + 1
|
|
),
|
|
secret: { action: 'keep' },
|
|
allowedSenderIds: [],
|
|
allowGroupMessages: false
|
|
}
|
|
})
|
|
).toThrow()
|
|
expect(() => channelSettingsApplySchema.parse({})).toThrow()
|
|
})
|
|
|
|
it('models public credential source and runtime status without secrets', () => {
|
|
const snapshot = channelSettingsSnapshotSchema.parse({
|
|
weixin: {
|
|
enabled: true,
|
|
bindingConfigured: true,
|
|
source: 'encrypted',
|
|
accountDisplay: '微信用户 ****1234',
|
|
status: { state: 'running' }
|
|
},
|
|
wecom: {
|
|
enabled: true,
|
|
botId: 'bot-id',
|
|
secretConfigured: true,
|
|
source: 'environment',
|
|
readOnly: true,
|
|
allowedSenderIds: ['user-1'],
|
|
allowGroupMessages: false,
|
|
status: { state: 'running' }
|
|
},
|
|
dingtalk: {
|
|
enabled: false,
|
|
clientId: '',
|
|
secretConfigured: false,
|
|
source: 'none',
|
|
readOnly: false,
|
|
allowedSenderIds: [],
|
|
allowGroupMessages: false,
|
|
status: {
|
|
state: 'error',
|
|
lastError: '连接失败'
|
|
}
|
|
}
|
|
})
|
|
expect(JSON.stringify(snapshot)).not.toContain('secret":')
|
|
})
|
|
|
|
it('requires errors only for failed connection tests', () => {
|
|
expect(
|
|
channelConnectionTestResultSchema.parse({
|
|
channel: 'wecom',
|
|
ok: true
|
|
})
|
|
).toEqual({ channel: 'wecom', ok: true })
|
|
expect(() =>
|
|
channelConnectionTestResultSchema.parse({
|
|
channel: 'dingtalk',
|
|
ok: false
|
|
})
|
|
).toThrow()
|
|
expect(() =>
|
|
channelConnectionTestResultSchema.parse({
|
|
channel: 'dingtalk',
|
|
ok: true,
|
|
error: '不应存在'
|
|
})
|
|
).toThrow()
|
|
})
|
|
})
|