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
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')
|
|
})
|
|
})
|