import { HttpResponse } from '@/core'; import { GridController } from '@/core'; import { useEventBind, useNavParamsBind } from "@/hooks/use-ctrl"; import { model } from './grid-controller-model'; import { GridControlVO } from './grid-controller-vo'; const evt = useEventBind(emit); const data = [ new GridControlVO({ [`${model.entityCodeName.toLowerCase()}`]: 1, [`${model.entityCodeName.toLowerCase()}id`]: 1, [`${model.entityCodeName.toLowerCase()}name`]: '测试1', srfuf: '1', [model.groupField ? model.groupField : 'text']: '分组', }), new GridControlVO({ [`${model.entityCodeName.toLowerCase()}`]: 2, [`${model.entityCodeName.toLowerCase()}id`]: 2, [`${model.entityCodeName.toLowerCase()}name`]: '测试2', srfuf: '1', [model.groupField ? model.groupField : 'text']: '分组', }), new GridControlVO({ [`${model.entityCodeName.toLowerCase()}`]: 3, [`${model.entityCodeName.toLowerCase()}id`]: 3, [`${model.entityCodeName.toLowerCase()}name`]: '测试3', srfuf: '0', [model.groupField ? model.groupField : 'text']: '分组', }), ] const params: any = { name: model.name, model, evt, openView: undefined, newView: undefined, closeView: undefined, pLoadingHelper: undefined, pViewCtx: undefined, handler: undefined, defaultEnableRowEdit: false, actions: { loadDraftAction: 'GetDraft', createAction: 'Create', fetchAction: 'FetchDefault', removeAction: 'Remove', updateAction: 'Update' }, rowActiveMode: 2, singleSelect: false, selectFirstDefault: false, ctrlService: { getCopynativeData: () => { return [ { [`${model.entityCodeName.toLowerCase()}`]: 1, [`${model.entityCodeName.toLowerCase()}id`]: 1, [`${model.entityCodeName.toLowerCase()}name`]: '测试1', srfuf: '1', [model.groupField ? model.groupField : 'text']: '分组', }, { [`${model.entityCodeName.toLowerCase()}`]: 2, [`${model.entityCodeName.toLowerCase()}id`]: 2, [`${model.entityCodeName.toLowerCase()}name`]: '测试2', srfuf: '1', [model.groupField ? model.groupField : 'text']: '分组', }, { [`${model.entityCodeName.toLowerCase()}`]: 3, [`${model.entityCodeName.toLowerCase()}id`]: 3, [`${model.entityCodeName.toLowerCase()}name`]: '测试3', srfuf: '0', [model.groupField ? model.groupField : 'text']: '分组', } ] }, getRemoteCopyData: () => { return { [`${model.entityCodeName.toLowerCase()}`]: 12, [`${model.entityCodeName.toLowerCase()}id`]: 12, [`${model.entityCodeName.toLowerCase()}name`]: '测试12', } }, frontLogic: async (action: string, context: any, arg: any) => { const data = new GridControlVO({ [`${model.entityCodeName.toLowerCase()}`]: 4, [`${model.entityCodeName.toLowerCase()}id`]: 4, [`${model.entityCodeName.toLowerCase()}name`]: '测试4', srfuf: '1', }) return new HttpResponse(data, null, 200); }, loadDraft: async () => { const data = new GridControlVO({ [`${model.entityCodeName.toLowerCase()}`]: 5, [`${model.entityCodeName.toLowerCase()}id`]: 5, [`${model.entityCodeName.toLowerCase()}name`]: '测试5', srfuf: '0', }) return new HttpResponse(data, null, 200); }, add: async (action: string, tempContext: any, arg: any) => { return new HttpResponse(arg, null, 200); }, update: async (action: string, tempContext: any, arg: any) => { return new HttpResponse(arg, null, 200); }, delete: async (action: string, tempContext: any, arg: any) => { return arg; } }, }; const context = {}; const viewParams = {}; const controller: any = new GridController(params); useNavParamsBind(controller, { context, viewParams }); const store = controller.getStore(); const validateItem = async () => { return true } const validateItemSpy = vi.spyOn(controller, 'validateItem').mockImplementation(validateItem); describe('GridController unit test', () => { test('initRules unit test', () => { if (model.rules.editRules.length > 0) { const rule: any = model.rules.editRules[0] expect(store.ruleModel[rule.name]).toHaveProperty('error', '') } }); test('handleLoadDataChange unit test', () => { const handleDataAggSpy = vi.spyOn(controller, 'handleDataAgg'); const handleGroupSpy = vi.spyOn(controller, 'handleGroup'); const handleDefaultSelectSpy = vi.spyOn(controller, 'handleDefaultSelect'); controller.handleLoadDataChange(data); if (model.rules.editRules.length > 0) { expect(store.ruleModel).toHaveProperty('0'); } if (model.aggMode !== 'NONE') { expect(handleDataAggSpy).toHaveBeenCalled(); } expect(handleGroupSpy).toHaveBeenCalled(); expect(handleDefaultSelectSpy).toHaveBeenCalled(); }) test('computeDefaultValueWithParam unit test', () => { const _data = { srfkey: 2, } expect(controller.computeDefaultValueWithParam('UPDATE', [`${model.entityCodeName.toLowerCase()}name`], _data)).toBe('测试2'); expect(controller.computeDefaultValueWithParam('CREATE', [`${model.entityCodeName.toLowerCase()}name`], _data)).toBe('测试12'); }) test('handleItemValueChange', () => { const name = `${model.entityCodeName.toLowerCase()}name`; const value = 'test值改变'; const index = 0; // 表格开启分组时不能配置启用行编辑(平台不支持) if (!model.enableGroup) { controller.handleItemValueChange(name, value, index); expect(validateItemSpy).toHaveBeenCalled(); expect(validateItemSpy).toHaveBeenCalledWith(name, value, index); expect(store.data[index]).toHaveProperty(name, value); expect(store.data[index]).toHaveProperty('$rowDataState', data[0].srfuf === '0' ? 'create' : 'update'); } }) test('updateGridEditItem', () => { const action = 'GetDraft'; const _data = data[0]; const updateDetails = [`${model.entityCodeName.toLowerCase()}name`]; const index = 0; controller.updateGridEditItem(action, _data, updateDetails, index); if (!model.enableGroup) { // TODO then 里面修改的值外部监听不到 // expect(controller.store.data[index]).toHaveProperty(updateDetails[0], 'frontLogic2 测试'); } }) test('newRow', async () => { const opt: any[] = []; // 表格开启分组时不能配置启用新建行(平台不支持) if (!model.enableGroup) { await expect(controller.newRow(opt)).resolves.toHaveProperty('ok', true) expect(store.data[store.data.length - 1]).toHaveProperty([`${model.entityCodeName.toLowerCase()}name`], '测试5') } }); test('save', async () => { const opt: any = {}; await expect(controller.save(opt)).resolves.toHaveProperty('ok', true); }); test('rowClick', () => { controller.rowClick(data[0], null); if (params.singleSelect) { expect(store.selections).toStrictEqual([data[0]]); } else { expect(store.selections).toStrictEqual([data[0]]); } if (params.rowActiveMode === 1) { expect(emit).toHaveBeenLastCalledWith('ctrl-action', model.name, 'dataActive', [data[0]]) } else { expect(emit).toHaveBeenLastCalledWith('ctrl-action', model.name, 'selectionChange', controller.getData()) } }); test('rowDbClick', () => { controller.rowDbClick(data[1], null); if (params.singleSelect) { expect(store.selections).toStrictEqual([data[1]]); } else { expect(store.selections).toStrictEqual([data[0], data[1]]); } if (params.rowActiveMode === 2) { expect(emit).toHaveBeenLastCalledWith('ctrl-action', model.name, 'dataActive', [data[1]]) } else { expect(emit).toHaveBeenLastCalledWith('ctrl-action', model.name, 'selectionChange', controller.getData()) } }) test.todo('importExcel 待之后测试升级后进行端对端测试'); test('remove', async () => { await expect(controller.remove([data[2]])).resolves.toHaveProperty('ok', true); // TODO 后续测试需用端对端测试 }) })