|
@@ -26,7 +26,9 @@ const createMockResponse = (status: number, data?: any) => ({
|
|
|
// Mock API client
|
|
// Mock API client
|
|
|
vi.mock('../../src/api/orderClient', () => {
|
|
vi.mock('../../src/api/orderClient', () => {
|
|
|
const mockAdminOrderClient = {
|
|
const mockAdminOrderClient = {
|
|
|
- $get: vi.fn(() => Promise.resolve({ status: 200, body: null })),
|
|
|
|
|
|
|
+ index: {
|
|
|
|
|
+ $get: vi.fn(() => Promise.resolve({ status: 200, body: null })),
|
|
|
|
|
+ },
|
|
|
':id': {
|
|
':id': {
|
|
|
$put: vi.fn(() => Promise.resolve({ status: 200, body: null })),
|
|
$put: vi.fn(() => Promise.resolve({ status: 200, body: null })),
|
|
|
},
|
|
},
|
|
@@ -125,7 +127,7 @@ describe('订单管理集成测试', () => {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// Mock initial order list
|
|
// Mock initial order list
|
|
|
- (adminOrderClient.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
+ (adminOrderClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
|
renderWithProviders(<OrderManagement />);
|
|
renderWithProviders(<OrderManagement />);
|
|
|
|
|
|
|
@@ -140,7 +142,7 @@ describe('订单管理集成测试', () => {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
// Verify API was called with correct parameters
|
|
// Verify API was called with correct parameters
|
|
|
- expect(adminOrderClient.$get).toHaveBeenCalledWith({
|
|
|
|
|
|
|
+ expect(adminOrderClient.index.$get).toHaveBeenCalledWith({
|
|
|
query: {
|
|
query: {
|
|
|
page: 1,
|
|
page: 1,
|
|
|
pageSize: 10,
|
|
pageSize: 10,
|
|
@@ -156,7 +158,7 @@ describe('订单管理集成测试', () => {
|
|
|
pagination: { total: 0, page: 1, pageSize: 10 },
|
|
pagination: { total: 0, page: 1, pageSize: 10 },
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- (adminOrderClient.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
+ (adminOrderClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
|
renderWithProviders(<OrderManagement />);
|
|
renderWithProviders(<OrderManagement />);
|
|
|
|
|
|
|
@@ -174,7 +176,7 @@ describe('订单管理集成测试', () => {
|
|
|
fireEvent.click(searchButton);
|
|
fireEvent.click(searchButton);
|
|
|
|
|
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
- expect(adminOrderClient.$get).toHaveBeenCalledWith({
|
|
|
|
|
|
|
+ expect(adminOrderClient.index.$get).toHaveBeenCalledWith({
|
|
|
query: {
|
|
query: {
|
|
|
page: 1,
|
|
page: 1,
|
|
|
pageSize: 10,
|
|
pageSize: 10,
|
|
@@ -191,7 +193,7 @@ describe('订单管理集成测试', () => {
|
|
|
pagination: { total: 0, page: 1, pageSize: 10 },
|
|
pagination: { total: 0, page: 1, pageSize: 10 },
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- (adminOrderClient.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
+ (adminOrderClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
|
renderWithProviders(<OrderManagement />);
|
|
renderWithProviders(<OrderManagement />);
|
|
|
|
|
|
|
@@ -208,7 +210,7 @@ describe('订单管理集成测试', () => {
|
|
|
fireEvent.click(statusOption);
|
|
fireEvent.click(statusOption);
|
|
|
|
|
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
- expect(adminOrderClient.$get).toHaveBeenCalledWith({
|
|
|
|
|
|
|
+ expect(adminOrderClient.index.$get).toHaveBeenCalledWith({
|
|
|
query: {
|
|
query: {
|
|
|
page: 1,
|
|
page: 1,
|
|
|
pageSize: 10,
|
|
pageSize: 10,
|
|
@@ -225,7 +227,7 @@ describe('订单管理集成测试', () => {
|
|
|
pagination: { total: 0, page: 1, pageSize: 10 },
|
|
pagination: { total: 0, page: 1, pageSize: 10 },
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- (adminOrderClient.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
+ (adminOrderClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
|
renderWithProviders(<OrderManagement />);
|
|
renderWithProviders(<OrderManagement />);
|
|
|
|
|
|
|
@@ -242,7 +244,7 @@ describe('订单管理集成测试', () => {
|
|
|
fireEvent.click(payStatusOption);
|
|
fireEvent.click(payStatusOption);
|
|
|
|
|
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
- expect(adminOrderClient.$get).toHaveBeenCalledWith({
|
|
|
|
|
|
|
+ expect(adminOrderClient.index.$get).toHaveBeenCalledWith({
|
|
|
query: {
|
|
query: {
|
|
|
page: 1,
|
|
page: 1,
|
|
|
pageSize: 10,
|
|
pageSize: 10,
|
|
@@ -283,7 +285,7 @@ describe('订单管理集成测试', () => {
|
|
|
},
|
|
},
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- (adminOrderClient.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
+ (adminOrderClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
|
renderWithProviders(<OrderManagement />);
|
|
renderWithProviders(<OrderManagement />);
|
|
|
|
|
|
|
@@ -364,7 +366,7 @@ describe('订单管理集成测试', () => {
|
|
|
},
|
|
},
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- (adminOrderClient.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
+ (adminOrderClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
|
renderWithProviders(<OrderManagement />);
|
|
renderWithProviders(<OrderManagement />);
|
|
|
|
|
|
|
@@ -400,7 +402,7 @@ describe('订单管理集成测试', () => {
|
|
|
const { toast } = await import('sonner');
|
|
const { toast } = await import('sonner');
|
|
|
|
|
|
|
|
// Mock API error
|
|
// Mock API error
|
|
|
- (adminOrderClient.$get as any).mockRejectedValue(new Error('API Error'));
|
|
|
|
|
|
|
+ (adminOrderClient.index.$get as any).mockRejectedValue(new Error('API Error'));
|
|
|
|
|
|
|
|
renderWithProviders(<OrderManagement />);
|
|
renderWithProviders(<OrderManagement />);
|
|
|
|
|
|
|
@@ -439,7 +441,7 @@ describe('订单管理集成测试', () => {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// Mock successful data load
|
|
// Mock successful data load
|
|
|
- (adminOrderClient.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
+ (adminOrderClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
|
|
|
// Re-render with data
|
|
// Re-render with data
|
|
|
renderWithProviders(<OrderManagement />);
|
|
renderWithProviders(<OrderManagement />);
|
|
@@ -467,4 +469,280 @@ describe('订单管理集成测试', () => {
|
|
|
expect(toast.error).toHaveBeenCalledWith('更新失败,请重试');
|
|
expect(toast.error).toHaveBeenCalledWith('更新失败,请重试');
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+ it('应该处理订单打印功能 - 一次打印保证只执行一张', async () => {
|
|
|
|
|
+ const mockOrders = {
|
|
|
|
|
+ data: [
|
|
|
|
|
+ {
|
|
|
|
|
+ id: 1,
|
|
|
|
|
+ orderNo: 'ORDER001',
|
|
|
|
|
+ state: 0,
|
|
|
|
|
+ payState: 2,
|
|
|
|
|
+ remark: '测试订单',
|
|
|
|
|
+ user: { username: 'testuser' },
|
|
|
|
|
+ userPhone: '13800138000',
|
|
|
|
|
+ recevierName: '张三',
|
|
|
|
|
+ receiverMobile: '13800138001',
|
|
|
|
|
+ amount: 100.00,
|
|
|
|
|
+ payAmount: 100.00,
|
|
|
|
|
+ freightAmount: 0.00,
|
|
|
|
|
+ orderType: 1,
|
|
|
|
|
+ payType: 1,
|
|
|
|
|
+ address: '北京市朝阳区',
|
|
|
|
|
+ createdAt: '2024-01-01T00:00:00Z',
|
|
|
|
|
+ tenantId: 1,
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ pagination: {
|
|
|
|
|
+ total: 1,
|
|
|
|
|
+ page: 1,
|
|
|
|
|
+ pageSize: 10,
|
|
|
|
|
+ },
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ (adminOrderClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
+
|
|
|
|
|
+ // Mock fetch API for printer and print task
|
|
|
|
|
+ const mockFetch = vi.fn();
|
|
|
|
|
+ global.fetch = mockFetch;
|
|
|
|
|
+
|
|
|
|
|
+ // Mock getDefaultPrinter response
|
|
|
|
|
+ mockFetch.mockResolvedValueOnce({
|
|
|
|
|
+ ok: true,
|
|
|
|
|
+ json: async () => ({
|
|
|
|
|
+ success: true,
|
|
|
|
|
+ data: {
|
|
|
|
|
+ data: [
|
|
|
|
|
+ {
|
|
|
|
|
+ printerSn: 'TEST123456',
|
|
|
|
|
+ printerKey: 'test-key',
|
|
|
|
|
+ printerName: '测试打印机',
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+ }),
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // Mock getPrintTemplate response
|
|
|
|
|
+ mockFetch.mockResolvedValueOnce({
|
|
|
|
|
+ ok: true,
|
|
|
|
|
+ json: async () => ({
|
|
|
|
|
+ success: true,
|
|
|
|
|
+ data: '<CB>订单收据</CB><BR>订单号: {orderNo}',
|
|
|
|
|
+ }),
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // Mock submit print task response
|
|
|
|
|
+ mockFetch.mockResolvedValueOnce({
|
|
|
|
|
+ ok: true,
|
|
|
|
|
+ json: async () => ({
|
|
|
|
|
+ success: true,
|
|
|
|
|
+ data: {
|
|
|
|
|
+ taskId: 'PRINT_TASK_001',
|
|
|
|
|
+ status: 'PENDING',
|
|
|
|
|
+ },
|
|
|
|
|
+ }),
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ renderWithProviders(<OrderManagement />);
|
|
|
|
|
+
|
|
|
|
|
+ // Wait for data to load
|
|
|
|
|
+ await waitFor(() => {
|
|
|
|
|
+ expect(screen.getByText('ORDER001')).toBeInTheDocument();
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // Find print button using test ID
|
|
|
|
|
+ const printButtons = screen.getAllByTestId('order-print-button');
|
|
|
|
|
+ expect(printButtons.length).toBeGreaterThan(0);
|
|
|
|
|
+
|
|
|
|
|
+ // Click print button
|
|
|
|
|
+ fireEvent.click(printButtons[0]);
|
|
|
|
|
+
|
|
|
|
|
+ // Verify fetch was called for printer
|
|
|
|
|
+ await waitFor(() => {
|
|
|
|
|
+ expect(mockFetch).toHaveBeenCalledWith(
|
|
|
|
|
+ '/api/v1/feie/printers?isDefault=true&pageSize=1',
|
|
|
|
|
+ expect.objectContaining({
|
|
|
|
|
+ method: 'GET',
|
|
|
|
|
+ headers: expect.any(Headers),
|
|
|
|
|
+ })
|
|
|
|
|
+ );
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // Verify fetch was called for template
|
|
|
|
|
+ await waitFor(() => {
|
|
|
|
|
+ expect(mockFetch).toHaveBeenCalledWith(
|
|
|
|
|
+ '/api/v1/feie/config',
|
|
|
|
|
+ expect.objectContaining({
|
|
|
|
|
+ method: 'GET',
|
|
|
|
|
+ headers: expect.any(Headers),
|
|
|
|
|
+ })
|
|
|
|
|
+ );
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // Verify fetch was called for print task submission
|
|
|
|
|
+ await waitFor(() => {
|
|
|
|
|
+ expect(mockFetch).toHaveBeenCalledWith(
|
|
|
|
|
+ '/api/v1/feie/tasks',
|
|
|
|
|
+ expect.objectContaining({
|
|
|
|
|
+ method: 'POST',
|
|
|
|
|
+ body: expect.stringContaining('ORDER001'), // 只需要验证包含订单号
|
|
|
|
|
+ headers: expect.any(Headers),
|
|
|
|
|
+ })
|
|
|
|
|
+ );
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // Verify toast success was called
|
|
|
|
|
+ const { toast } = await import('sonner');
|
|
|
|
|
+ await waitFor(() => {
|
|
|
|
|
+ expect(toast.success).toHaveBeenCalledWith(expect.stringContaining('打印任务已提交'));
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('应该防止重复点击打印按钮 - 一次打印保证只执行一张', async () => {
|
|
|
|
|
+ const mockOrders = {
|
|
|
|
|
+ data: [
|
|
|
|
|
+ {
|
|
|
|
|
+ id: 1,
|
|
|
|
|
+ orderNo: 'ORDER001',
|
|
|
|
|
+ state: 0,
|
|
|
|
|
+ payState: 2,
|
|
|
|
|
+ remark: '测试订单',
|
|
|
|
|
+ user: { username: 'testuser' },
|
|
|
|
|
+ userPhone: '13800138000',
|
|
|
|
|
+ recevierName: '张三',
|
|
|
|
|
+ receiverMobile: '13800138001',
|
|
|
|
|
+ amount: 100.00,
|
|
|
|
|
+ payAmount: 100.00,
|
|
|
|
|
+ freightAmount: 0.00,
|
|
|
|
|
+ orderType: 1,
|
|
|
|
|
+ payType: 1,
|
|
|
|
|
+ address: '北京市朝阳区',
|
|
|
|
|
+ createdAt: '2024-01-01T00:00:00Z',
|
|
|
|
|
+ tenantId: 1,
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ pagination: {
|
|
|
|
|
+ total: 1,
|
|
|
|
|
+ page: 1,
|
|
|
|
|
+ pageSize: 10,
|
|
|
|
|
+ },
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ (adminOrderClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
+
|
|
|
|
|
+ // Mock fetch API
|
|
|
|
|
+ const mockFetch = vi.fn();
|
|
|
|
|
+ global.fetch = mockFetch;
|
|
|
|
|
+
|
|
|
|
|
+ // Mock responses
|
|
|
|
|
+ mockFetch.mockResolvedValue({
|
|
|
|
|
+ ok: true,
|
|
|
|
|
+ json: async () => ({
|
|
|
|
|
+ success: true,
|
|
|
|
|
+ data: {
|
|
|
|
|
+ data: [
|
|
|
|
|
+ {
|
|
|
|
|
+ printerSn: 'TEST123456',
|
|
|
|
|
+ printerKey: 'test-key',
|
|
|
|
|
+ printerName: '测试打印机',
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+ }),
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ renderWithProviders(<OrderManagement />);
|
|
|
|
|
+
|
|
|
|
|
+ // Wait for data to load
|
|
|
|
|
+ await waitFor(() => {
|
|
|
|
|
+ expect(screen.getByText('ORDER001')).toBeInTheDocument();
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // Find print button using test ID
|
|
|
|
|
+ const printButtons = screen.getAllByTestId('order-print-button');
|
|
|
|
|
+ expect(printButtons.length).toBeGreaterThan(0);
|
|
|
|
|
+ const printButton = printButtons[0];
|
|
|
|
|
+
|
|
|
|
|
+ // Click print button multiple times quickly
|
|
|
|
|
+ fireEvent.click(printButton);
|
|
|
|
|
+ fireEvent.click(printButton);
|
|
|
|
|
+ fireEvent.click(printButton);
|
|
|
|
|
+
|
|
|
|
|
+ // Verify fetch was called only once for printer
|
|
|
|
|
+ await waitFor(() => {
|
|
|
|
|
+ const printerCalls = mockFetch.mock.calls.filter(call =>
|
|
|
|
|
+ call[0] === '/api/v1/feie/printers?isDefault=true&pageSize=1'
|
|
|
|
|
+ );
|
|
|
|
|
+ expect(printerCalls.length).toBe(1); // 应该只调用一次
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('应该处理打印失败场景', async () => {
|
|
|
|
|
+ const mockOrders = {
|
|
|
|
|
+ data: [
|
|
|
|
|
+ {
|
|
|
|
|
+ id: 1,
|
|
|
|
|
+ orderNo: 'ORDER001',
|
|
|
|
|
+ state: 0,
|
|
|
|
|
+ payState: 2,
|
|
|
|
|
+ remark: '测试订单',
|
|
|
|
|
+ user: { username: 'testuser' },
|
|
|
|
|
+ userPhone: '13800138000',
|
|
|
|
|
+ recevierName: '张三',
|
|
|
|
|
+ receiverMobile: '13800138001',
|
|
|
|
|
+ amount: 100.00,
|
|
|
|
|
+ payAmount: 100.00,
|
|
|
|
|
+ freightAmount: 0.00,
|
|
|
|
|
+ orderType: 1,
|
|
|
|
|
+ payType: 1,
|
|
|
|
|
+ address: '北京市朝阳区',
|
|
|
|
|
+ createdAt: '2024-01-01T00:00:00Z',
|
|
|
|
|
+ tenantId: 1,
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ pagination: {
|
|
|
|
|
+ total: 1,
|
|
|
|
|
+ page: 1,
|
|
|
|
|
+ pageSize: 10,
|
|
|
|
|
+ },
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ (adminOrderClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockOrders));
|
|
|
|
|
+
|
|
|
|
|
+ // Mock fetch API to simulate printer not found
|
|
|
|
|
+ const mockFetch = vi.fn();
|
|
|
|
|
+ global.fetch = mockFetch;
|
|
|
|
|
+
|
|
|
|
|
+ // Mock getDefaultPrinter response - no printer found
|
|
|
|
|
+ mockFetch.mockResolvedValueOnce({
|
|
|
|
|
+ ok: true,
|
|
|
|
|
+ json: async () => ({
|
|
|
|
|
+ success: true,
|
|
|
|
|
+ data: {
|
|
|
|
|
+ data: [], // 空数组表示没有打印机
|
|
|
|
|
+ },
|
|
|
|
|
+ }),
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ renderWithProviders(<OrderManagement />);
|
|
|
|
|
+
|
|
|
|
|
+ // Wait for data to load
|
|
|
|
|
+ await waitFor(() => {
|
|
|
|
|
+ expect(screen.getByText('ORDER001')).toBeInTheDocument();
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // Find print button using test ID
|
|
|
|
|
+ const printButtons = screen.getAllByTestId('order-print-button');
|
|
|
|
|
+ expect(printButtons.length).toBeGreaterThan(0);
|
|
|
|
|
+
|
|
|
|
|
+ // Click print button
|
|
|
|
|
+ fireEvent.click(printButtons[0]);
|
|
|
|
|
+
|
|
|
|
|
+ // Verify error toast was shown
|
|
|
|
|
+ const { toast } = await import('sonner');
|
|
|
|
|
+ await waitFor(() => {
|
|
|
|
|
+ expect(toast.error).toHaveBeenCalledWith(expect.stringContaining('未找到默认打印机'));
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
});
|
|
});
|