| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- import { describe, it, expect, vi, beforeEach } from 'vitest';
- import { render, screen, fireEvent, waitFor } from '@testing-library/react';
- import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
- import { PrintConfigManagement } from '../../src/components/PrintConfigManagement';
- import { createFeiePrinterClient } from '../../src/api/feiePrinterClient';
- import { ConfigKey, ConfigType } from '../../src/types/feiePrinter';
- // Mock API client
- vi.mock('../../src/api/feiePrinterClient', () => {
- const mockClient = {
- getPrintConfigs: vi.fn(),
- updatePrintConfig: vi.fn(),
- setAuthToken: vi.fn(),
- setTenantId: vi.fn(),
- };
- return {
- createFeiePrinterClient: vi.fn(() => mockClient),
- };
- });
- // Mock toast
- vi.mock('sonner', () => ({
- toast: {
- success: vi.fn(() => {}),
- error: vi.fn(() => {}),
- info: vi.fn(() => {}),
- },
- }));
- const createTestQueryClient = () =>
- new QueryClient({
- defaultOptions: {
- queries: {
- retry: false,
- },
- },
- });
- const renderWithProviders = (component: React.ReactElement) => {
- const queryClient = createTestQueryClient();
- return render(
- <QueryClientProvider client={queryClient}>
- {component as any}
- </QueryClientProvider>
- );
- };
- describe('打印配置管理组件集成测试', () => {
- let mockClient: any;
- beforeEach(() => {
- vi.clearAllMocks();
- mockClient = (createFeiePrinterClient as any)();
- });
- it('应该渲染组件并加载配置数据', async () => {
- const mockConfigsData = {
- data: [
- {
- id: 1,
- configKey: ConfigKey.ANTI_REFUND_DELAY,
- configValue: '120',
- configType: ConfigType.NUMBER,
- description: '防退款延迟时间(秒)',
- isEnabled: 1,
- createdAt: '2024-01-01T00:00:00Z',
- updatedAt: '2024-01-01T00:00:00Z',
- },
- ],
- pagination: {
- total: 1,
- page: 1,
- pageSize: 20,
- totalPages: 1,
- },
- };
- // Mock initial configs data
- mockClient.getPrintConfigs.mockResolvedValue(mockConfigsData);
- renderWithProviders(
- <PrintConfigManagement
- baseURL="/api/v1/feie"
- tenantId={123}
- authToken="test-token"
- />
- );
- // 验证API被调用
- await waitFor(() => {
- expect(mockClient.getPrintConfigs).toHaveBeenCalled();
- });
- // 验证组件标题渲染
- expect(screen.getByText('打印配置管理')).toBeInTheDocument();
- expect(screen.getByText('管理飞鹅打印的配置项,包括基础配置、打印策略和模板配置')).toBeInTheDocument();
- // 验证刷新按钮存在
- expect(screen.getByRole('button', { name: /刷新/i })).toBeInTheDocument();
- });
- it('应该处理获取配置列表API错误', async () => {
- // Mock API error
- mockClient.getPrintConfigs.mockRejectedValue(new Error('获取配置列表失败'));
- renderWithProviders(
- <PrintConfigManagement
- baseURL="/api/v1/feie"
- tenantId={123}
- authToken="test-token"
- />
- );
- // 检查错误UI是否显示
- await waitFor(() => {
- expect(screen.getByText('加载配置失败')).toBeInTheDocument();
- expect(screen.getByRole('button', { name: /重试/i })).toBeInTheDocument();
- });
- });
- it('应该处理更新配置API错误', async () => {
- const { toast } = await import('sonner');
- const mockConfigsData = {
- data: [
- {
- id: 1,
- configKey: ConfigKey.ANTI_REFUND_DELAY,
- configValue: '120',
- configType: ConfigType.NUMBER,
- description: '防退款延迟时间(秒)',
- isEnabled: 1,
- createdAt: '2024-01-01T00:00:00Z',
- updatedAt: '2024-01-01T00:00:00Z',
- },
- ],
- pagination: {
- total: 1,
- page: 1,
- pageSize: 20,
- totalPages: 1,
- },
- };
- mockClient.getPrintConfigs.mockResolvedValue(mockConfigsData);
- mockClient.updatePrintConfig.mockRejectedValue(new Error('更新配置失败'));
- renderWithProviders(
- <PrintConfigManagement
- baseURL="/api/v1/feie"
- tenantId={123}
- authToken="test-token"
- />
- );
- // 等待初始数据加载
- await waitFor(() => {
- expect(mockClient.getPrintConfigs).toHaveBeenCalled();
- });
- // 等待配置项渲染
- await waitFor(() => {
- expect(screen.getByText('防退款延迟时间(秒)')).toBeInTheDocument();
- });
- // 找到配置值输入框(根据组件行为,可能是spinbutton或textbox)
- // 注意:实际组件可能使用不同的输入方式,这里需要根据实际组件调整
- let configInputs = screen.queryAllByRole('spinbutton');
- if (configInputs.length === 0) {
- configInputs = screen.queryAllByRole('textbox');
- }
- expect(configInputs.length).toBeGreaterThan(0);
- // 修改配置值
- fireEvent.change(configInputs[0], { target: { value: '180' } });
- // 找到批量保存按钮
- const saveButtons = screen.getAllByRole('button', { name: /批量保存/i });
- expect(saveButtons.length).toBeGreaterThan(0);
- // 点击批量保存按钮
- fireEvent.click(saveButtons[0]);
- await waitFor(() => {
- expect(toast.error).toHaveBeenCalledWith('批量保存失败: 更新配置失败');
- });
- });
- it('应该支持多租户场景', async () => {
- const mockConfigsData = {
- data: [
- {
- id: 1,
- configKey: ConfigKey.ANTI_REFUND_DELAY,
- configValue: '150',
- configType: ConfigType.NUMBER,
- description: '防退款延迟时间(秒)',
- isEnabled: 1,
- createdAt: '2024-01-01T00:00:00Z',
- updatedAt: '2024-01-01T00:00:00Z',
- },
- ],
- pagination: {
- total: 1,
- page: 1,
- pageSize: 20,
- totalPages: 1,
- },
- };
- mockClient.getPrintConfigs.mockResolvedValue(mockConfigsData);
- renderWithProviders(
- <PrintConfigManagement
- baseURL="/api/v1/feie"
- tenantId={456}
- authToken="test-token"
- />
- );
- await waitFor(() => {
- expect(mockClient.getPrintConfigs).toHaveBeenCalled();
- });
- // 验证租户ID设置
- expect(mockClient.setTenantId).toHaveBeenCalledWith(456);
- expect(mockClient.setAuthToken).toHaveBeenCalledWith('test-token');
- // 等待数据加载
- await waitFor(() => {
- expect(screen.getByText('防退款延迟时间(秒)')).toBeInTheDocument();
- });
- // 配置值在输入框中,检查输入框存在
- const configInputs = screen.queryAllByRole('spinbutton');
- const textInputs = screen.queryAllByRole('textbox');
- expect(configInputs.length + textInputs.length).toBeGreaterThan(0);
- // 检查租户ID设置是否正确
- expect(mockClient.setTenantId).toHaveBeenCalledWith(456);
- expect(mockClient.setAuthToken).toHaveBeenCalledWith('test-token');
- });
- it('应该处理配置项启用/禁用状态', async () => {
- const mockConfigsData = {
- data: [
- {
- id: 1,
- configKey: ConfigKey.ANTI_REFUND_DELAY,
- configValue: '120',
- configType: ConfigType.NUMBER,
- description: '防退款延迟时间(秒)',
- isEnabled: 1,
- createdAt: '2024-01-01T00:00:00Z',
- updatedAt: '2024-01-01T00:00:00Z',
- },
- {
- id: 2,
- configKey: ConfigKey.RECEIPT_TEMPLATE,
- configValue: '订单号: {orderNo}',
- configType: ConfigType.STRING,
- description: '小票模板',
- isEnabled: 0, // 禁用状态
- createdAt: '2024-01-01T00:00:00Z',
- updatedAt: '2024-01-01T00:00Z',
- },
- ],
- pagination: {
- total: 2,
- page: 1,
- pageSize: 20,
- totalPages: 1,
- },
- };
- mockClient.getPrintConfigs.mockResolvedValue(mockConfigsData);
- renderWithProviders(
- <PrintConfigManagement
- baseURL="/api/v1/feie"
- tenantId={123}
- authToken="test-token"
- />
- );
- // 等待数据加载 - 至少检查一个配置项存在
- await waitFor(() => {
- expect(screen.getByText('防退款延迟时间(秒)')).toBeInTheDocument();
- });
- // 检查组件基本渲染
- expect(screen.getByText('打印配置管理')).toBeInTheDocument();
- expect(screen.getByRole('button', { name: /刷新/i })).toBeInTheDocument();
- });
- it('应该处理不同配置类型的显示', async () => {
- const mockConfigsData = {
- data: [
- {
- id: 1,
- configKey: ConfigKey.ANTI_REFUND_DELAY,
- configValue: '120',
- configType: ConfigType.NUMBER,
- description: '防退款延迟时间(秒)',
- isEnabled: 1,
- createdAt: '2024-01-01T00:00:00Z',
- updatedAt: '2024-01-01T00:00:00Z',
- },
- {
- id: 2,
- configKey: ConfigKey.RECEIPT_TEMPLATE,
- configValue: '订单号: {orderNo}',
- configType: ConfigType.STRING,
- description: '小票模板',
- isEnabled: 1,
- createdAt: '2024-01-01T00:00:00Z',
- updatedAt: '2024-01-01T00:00:00Z',
- },
- {
- id: 3,
- configKey: ConfigKey.SHIPPING_TEMPLATE,
- configValue: '发货单\n订单号: {orderNo}',
- configType: ConfigType.STRING,
- description: '发货单模板',
- isEnabled: 1,
- createdAt: '2024-01-01T00:00:00Z',
- updatedAt: '2024-01-01T00:00:00Z',
- },
- ],
- pagination: {
- total: 3,
- page: 1,
- pageSize: 20,
- totalPages: 1,
- },
- };
- mockClient.getPrintConfigs.mockResolvedValue(mockConfigsData);
- renderWithProviders(
- <PrintConfigManagement
- baseURL="/api/v1/feie"
- tenantId={123}
- authToken="test-token"
- />
- );
- // 等待数据加载 - 至少检查一个配置项存在
- await waitFor(() => {
- expect(screen.getByText('防退款延迟时间(秒)')).toBeInTheDocument();
- });
- // 检查组件基本渲染和输入框存在
- expect(screen.getByText('打印配置管理')).toBeInTheDocument();
- // 检查是否有输入框(配置值在输入框中)
- const configInputs = screen.queryAllByRole('spinbutton');
- const textInputs = screen.queryAllByRole('textbox');
- expect(configInputs.length + textInputs.length).toBeGreaterThan(0);
- });
- });
|