import { DataViewCtrlController, deepCopy } from '@/core'; import { useEventBind, useNavParamsBind } from "@/hooks/use-ctrl"; import { model } from './data-view-ctrl-controller-model'; import { DataviewControlVO } from './data-view-ctrl-controller-vo'; const evt = useEventBind(emit); const data = [ new DataviewControlVO({ [`${model.entityCodeName.toLowerCase()}`]: 1, [`${model.entityCodeName.toLowerCase()}id`]: 1, [`${model.entityCodeName.toLowerCase()}name`]: '测试1', srfuf: '1', [model.groupField ? model.groupField : 'text']: '分组', }), new DataviewControlVO({ [`${model.entityCodeName.toLowerCase()}`]: 2, [`${model.entityCodeName.toLowerCase()}id`]: 2, [`${model.entityCodeName.toLowerCase()}name`]: '测试2', srfuf: '1', [model.groupField ? model.groupField : 'text']: '分组', }), new DataviewControlVO({ [`${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: { delete: async (action: string, tempContext: any, arg: any) => { return arg; } }, }; const context = {}; const viewParams = {}; const controller: any = new DataViewCtrlController(params); useNavParamsBind(controller, { context, viewParams }); const store = controller.getStore(); describe('DataViewCtrlController unit test', () => { const handleChildrenUIAction = (data: any) => { }; const spy = vi.spyOn(controller, "handleChildrenUIAction").mockImplementation(handleChildrenUIAction); test('handleLoadDataChange', () => { vi.useFakeTimers(); controller.handleLoadDataChange(data); setTimeout(() => { expect(controller.copyData).toStrictEqual(store.data); }, 100) vi.runAllTimers(); }); test('handleAutoGroup', () => { if (model.enableGroup && model.groupMode == 'AUTO') { controller.handleAutoGroup(); expect(store.data[0]).toHaveProperty('isGroupItem', true); } }) test('handleCodeListGroup', () => { if (model.enableGroup && model.groupMode == 'CODELIST') { controller.handleCodeListGroup(); expect(store.data[0]).toHaveProperty('isGroupItem', true); } }); test('handleAutoLoadMoreData', () => { if (model.enableGroup && model.groupMode == 'AUTO') { controller.handleAutoLoadMoreData(data); expect(store.data[0]).toHaveProperty('isGroupItem', true); } }) test('handleCodeListLoadMoreData', () => { if (model.enableGroup && model.groupMode == 'CODELIST') { controller.handleCodeListLoadMoreData(data); expect(store.data[0]).toHaveProperty('isGroupItem', true); } }); test('loadMore', async () => { await controller.loadMore(); expect(controller.isLoadMore).toBe(false); }); test('handleItemClick', () => { controller.handleItemClick(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('handleItemDbClick', () => { controller.handleItemDbClick(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('remove', async () => { await expect(controller.remove([data[2]])).resolves.toHaveProperty('ok', true); // TODO 后续测试需用端对端测试 }) })