You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.6 KiB

import { evaluateFieldLinkage } from '@/utils/fieldLinkage'
const fields = [
{ id: 1, name: 'need_invoice', type: 'select', multiple: 0 },
{
id: 2,
name: 'invoice_address',
type: 'text',
visibility_rule: { mode: 'show_when', control_field_id: 1, values: ['是'] }
}
]
describe('evaluateFieldLinkage', () => {
it('disables a writable controlled field when its control value does not match', () => {
const result = evaluateFieldLinkage({ fields, form: { need_invoice: '否' }, writeable: [1, 2] })
expect(result.disabledFieldIds.has(2)).toBe(true)
expect(result.disabledFieldNames.has('invoice_address')).toBe(true)
})
it('keeps the field enabled when the control value matches', () => {
const result = evaluateFieldLinkage({ fields, form: { need_invoice: '是' }, writeable: [1, 2] })
expect(result.disabledFieldIds.has(2)).toBe(false)
expect(result.states[2].reason).toBe('value_matched')
})
it('does not activate the rule unless both fields are writable', () => {
const result = evaluateFieldLinkage({ fields, form: { need_invoice: '否' }, writeable: [2] })
expect(result.disabledFieldIds.size).toBe(0)
expect(result.states[2].reason).toBe('not_both_writable')
})
it('fails open for unsupported multi-select controls', () => {
const multiFields = [
{ ...fields[0], multiple: 1 },
fields[1]
]
const result = evaluateFieldLinkage({ fields: multiFields, form: { need_invoice: '否' }, writeable: [1, 2] })
expect(result.disabledFieldIds.size).toBe(0)
expect(result.states[2].reason).toBe('invalid_rule')
})
})