import { describe, expect, it, vi } from 'vitest' import { InputConfig } from '../../../../components/form/input' import { SelectConfig } from '../../../../components/form/select' import { DatePickerConfig } from '../../../../components/form/datePicker' import { AddFormConfig } from '../../../../components/form/addForm' import { UploadConfig } from '../../../../components/form/upload' describe('components/form 基础配置类', () => { it('InputConfig 提供默认值与默认函数', () => { const config = new InputConfig({ model: 'name', label: '名称' }) expect(config.type).toBe('infoInput') expect(config.model).toBe('name') expect(config.label).toBe('名称') expect(config.name).toBe('') expect(config.autofocus).toBe(false) expect(config.clearable).toBe(false) expect(config.maxlength).toBe(2000) expect(config.minRow).toBe(3) expect(config.noTrim).toBe(false) expect(config.prefixIcon).toBe('') expect(config.button).toEqual({}) expect(config.inputType).toBe('text') expect(config.placeholder()).toBe('pleaseInput') expect(config.disabled()).toBe(false) expect(config.methods()).toBeUndefined() }) it('InputConfig 支持参数覆写', () => { const buttonMethods = vi.fn() const placeholder = vi.fn(() => 'customPlaceholder') const disabled = vi.fn(() => true) const methods = vi.fn() const config = new InputConfig({ model: 'name', label: '名称', autofocus: true, clearable: true, maxlength: 10, minRow: 5, noTrim: true, prefixIcon: 'Search', button: { name: '查询', methods: buttonMethods }, inputType: 'textarea', placeholder, disabled, methods }) expect(config.autofocus).toBe(true) expect(config.clearable).toBe(true) expect(config.maxlength).toBe(10) expect(config.minRow).toBe(5) expect(config.noTrim).toBe(true) expect(config.prefixIcon).toBe('Search') expect(config.button).toMatchObject({ name: '查询', methods: buttonMethods }) expect(config.inputType).toBe('textarea') expect(config.placeholder()).toBe('customPlaceholder') expect(config.disabled()).toBe(true) expect(config.methods()).toBeUndefined() expect(placeholder).toHaveBeenCalledTimes(1) expect(disabled).toHaveBeenCalledTimes(1) expect(methods).toHaveBeenCalledTimes(1) }) it('SelectConfig 提供默认值、默认函数与参数覆写', () => { const options = vi.fn(() => [{ label: 'A', value: 'a' }]) const loading = vi.fn(() => true) const disabled = vi.fn(() => true) const placeholder = vi.fn(() => 'customSelect') const defaultVal = vi.fn(() => 'a') const config = new SelectConfig({ model: 'status', label: '状态', filterable: true, multiple: true, valueItem: true, optionsLabel: 'name', optionsValue: 'id', options, loading, disabled, placeholder, defaultVal }) expect(config.type).toBe('infoSelect') expect(config.noDataText).toBe('noData') expect(config.popperClass).toBe('') expect(config.prefixIcon).toBe('') expect(config.filterable).toBe(true) expect(config.multiple).toBe(true) expect(config.valueItem).toBe(true) expect(config.optionsLabel).toBe('name') expect(config.optionsValue).toBe('id') expect(config.options()).toEqual([{ label: 'A', value: 'a' }]) expect(config.loading()).toBe(true) expect(config.disabled()).toBe(true) expect(config.placeholder()).toBe('customSelect') expect(config.defaultVal()).toBe('a') }) it('DatePickerConfig 提供默认值、默认函数与参数覆写', () => { const shortcuts = [{ text: '今天', value: () => new Date() }] const format = vi.fn(() => 'YYYY-MM') const valueFormat = vi.fn(() => 'YYYY-MM') const dateType = vi.fn(() => 'monthrange') const disabled = vi.fn(() => true) const focusMethod = vi.fn() const cellClassName = vi.fn() const disabledDate = vi.fn() const config = new DatePickerConfig({ model: 'time', label: '时间', startPlaceholder: '开始', endPlaceholder: '结束', popperClass: 'custom-popper', initMethods: true, teleported: false, shortcuts, format, valueFormat, dateType, disabled, focusMethod, cellClassName, disabledDate }) expect(config.type).toBe('infoDatePicker') expect(config.startPlaceholder).toBe('开始') expect(config.endPlaceholder).toBe('结束') expect(config.popperClass).toBe('custom-popper') expect(config.initMethods).toBe(true) expect(config.teleported).toBe(false) expect(config.shortcuts).toBe(shortcuts) expect(config.format()).toBe('YYYY-MM') expect(config.valueFormat()).toBe('YYYY-MM') expect(config.dateType()).toBe('monthrange') expect(config.disabled()).toBe(true) expect(config.focusMethod()).toBeUndefined() expect(config.cellClassName()).toBeUndefined() expect(config.disabledDate()).toBeUndefined() }) it('AddFormConfig 提供默认值、默认函数与参数覆写', () => { const rule = vi.fn(() => [{ type: 'infoInput', model: 'name', label: '名称' }]) const afterAdd = vi.fn() const afterRemove = vi.fn() const filterPane = vi.fn() const config = new AddFormConfig({ model: 'items', label: '列表', closable: true, addable: true, paneLabel: 'Tab', labelWidth: '100px', rule, afterAdd, afterRemove, filterPane }) expect(config.type).toBe('infoAddForm') expect(config.closable).toBe(true) expect(config.addable).toBe(true) expect(config.paneLabel).toBe('Tab') expect(config.labelWidth).toBe('100px') expect(config.rule()).toEqual([{ type: 'infoInput', model: 'name', label: '名称' }]) expect(config.afterAdd()).toBeUndefined() expect(config.afterRemove()).toBeUndefined() expect(config.filterPane()).toBeUndefined() }) it('UploadConfig 提供默认值、默认函数与参数覆写', () => { const data = vi.fn(() => ({ folder: 'test' })) const on = vi.fn() const preview = vi.fn() const remove = vi.fn() const error = vi.fn() const tipBtnClick = vi.fn() const showTipBtn = vi.fn(() => true) const config = new UploadConfig({ model: 'fileList', label: '附件', api: '/upload', headers: { Authorization: 'token' }, name: 'file', method: 'put', multiple: true, showFileList: true, drag: true, accept: '.png', listType: 'text', autoUpload: true, limit: 1, trigger: 'manual', tip: 'tip', showClear: false, isReplace: true, tipBtnText: '下载模板', data, on, preview, remove, error, tipBtnClick, showTipBtn }) expect(config.type).toBe('infoUpload') expect(config.api).toBe('/upload') expect(config.headers).toEqual({ Authorization: 'token' }) expect(config.name).toBe('file') expect(config.method).toBe('put') expect(config.multiple).toBe(true) expect(config.showFileList).toBe(true) expect(config.drag).toBe(true) expect(config.accept).toBe('.png') expect(config.listType).toBe('text') expect(config.autoUpload).toBe(true) expect(config.limit).toBe(1) expect(config.trigger).toBe('manual') expect(config.tip).toBe('tip') expect(config.showClear).toBe(false) expect(config.isReplace).toBe(true) expect(config.tipBtnText).toBe('下载模板') expect(config.data()).toEqual({ folder: 'test' }) expect(config.showTipBtn()).toBe(true) expect(config.on()).toBeUndefined() expect(config.preview()).toBeUndefined() expect(config.remove()).toBeUndefined() expect(config.error()).toBeUndefined() expect(config.tipBtnClick()).toBeUndefined() }) })