feat: optimize signature workflows and high-frequency queries

This commit is contained in:
hectorzhao
2026-09-02 15:45:48 +08:00
parent 9b8196ecab
commit ad89e8fed7
48 changed files with 1334 additions and 352 deletions
@@ -0,0 +1,52 @@
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { ReportMaterialImportModal } from './ReportMaterialImportModal';
const { adminApi } = vi.hoisted(() => ({
adminApi: {
analyzeReportMaterialImport: vi.fn(),
listDrainageFields: vi.fn(),
listEnterpriseApplicationOptions: vi.fn(),
listReportImportProfiles: vi.fn(),
listTenantOptions: vi.fn(),
},
}));
vi.mock('@/api/adminApi', () => ({ adminApi }));
describe('ReportMaterialImportModal mapping profile action', () => {
beforeEach(() => {
Object.values(adminApi).forEach((method) => method.mockReset());
adminApi.listTenantOptions.mockResolvedValue([{ id: 'tenant-1', name: '测试企业', code: 'T001', status: 'active' }]);
adminApi.listEnterpriseApplicationOptions.mockResolvedValue([]);
adminApi.listDrainageFields.mockResolvedValue([]);
adminApi.listReportImportProfiles.mockResolvedValue([]);
adminApi.analyzeReportMaterialImport.mockResolvedValue({
id: 'analysis-1',
columns: [{ sourceColumnIndex: 0, columnLetter: 'A', sourceHeader: '签名', sourceHeaderPath: '签名', imageCount: 0 }],
rows: [],
suggestedMappings: [],
});
});
it('renders the reusable mapping choice as a clear pressed-state shared button', async () => {
const user = userEvent.setup();
render(<ReportMaterialImportModal onClose={vi.fn()} onCompleted={vi.fn()} />);
await waitFor(() => expect(adminApi.listTenantOptions).toHaveBeenCalledTimes(1));
const tenantSelect = screen.getByText('所属企业').closest('label')?.querySelector('button');
expect(tenantSelect).not.toBeNull();
await user.click(tenantSelect!);
await user.click(screen.getByRole('option', { name: /测试企业/ }));
const fileInput = document.querySelector('input[type="file"]');
expect(fileInput).not.toBeNull();
fireEvent.change(fileInput!, { target: { files: [new File(['xlsx'], 'mapping.xlsx')] } });
await user.click(screen.getByRole('button', { name: '解析文件并配置映射' }));
const toggle = await screen.findByRole('button', { name: '保存为可复用映射方案' });
expect(toggle).toHaveClass('ui-button', 'report-import-profile__toggle');
expect(toggle).toHaveAttribute('aria-pressed', 'false');
await user.click(toggle);
await waitFor(() => expect(screen.getByRole('button', { name: '本次将保存/更新映射方案' })).toHaveAttribute('aria-pressed', 'true'));
expect(screen.getByLabelText('映射方案名称')).toBeVisible();
});
});