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