|
|
@@ -4,6 +4,7 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
|
import { DeliveryAddressManagement } from '../../src/components/DeliveryAddressManagement';
|
|
|
import { deliveryAddressClient, deliveryAddressClientManager } from '../../src/api/deliveryAddressClient';
|
|
|
|
|
|
+
|
|
|
// 完整的mock响应对象
|
|
|
const createMockResponse = (status: number, data?: any) => ({
|
|
|
status,
|
|
|
@@ -26,11 +27,16 @@ const createMockResponse = (status: number, data?: any) => ({
|
|
|
// Mock API client
|
|
|
vi.mock('../../src/api/deliveryAddressClient', () => {
|
|
|
const mockDeliveryAddressClient = {
|
|
|
- $get: vi.fn(() => Promise.resolve({ status: 200, body: null })),
|
|
|
- $post: vi.fn(() => Promise.resolve({ status: 201, body: null })),
|
|
|
+ index: {
|
|
|
+ $get: vi.fn(() => Promise.resolve(createMockResponse(200, {
|
|
|
+ data: [],
|
|
|
+ pagination: { total: 0, current: 1, pageSize: 10 }
|
|
|
+ }))),
|
|
|
+ $post: vi.fn(() => Promise.resolve(createMockResponse(201, { id: 1, name: '默认地址' }))),
|
|
|
+ },
|
|
|
':id': {
|
|
|
- $put: vi.fn(() => Promise.resolve({ status: 200, body: null })),
|
|
|
- $delete: vi.fn(() => Promise.resolve({ status: 204, body: null })),
|
|
|
+ $put: vi.fn(() => Promise.resolve(createMockResponse(200))),
|
|
|
+ $delete: vi.fn(() => Promise.resolve(createMockResponse(204))),
|
|
|
},
|
|
|
};
|
|
|
|
|
|
@@ -52,8 +58,8 @@ vi.mock('sonner', () => ({
|
|
|
},
|
|
|
}));
|
|
|
|
|
|
-// Mock UserSelector
|
|
|
-vi.mock('@d8d/user-management-ui/components', () => ({
|
|
|
+// Mock UserSelector (多租户版本)
|
|
|
+vi.mock('@d8d/user-management-ui-mt/components', () => ({
|
|
|
UserSelector: ({ value, onChange, placeholder, 'data-testid': testId }: any) => (
|
|
|
<select
|
|
|
data-testid={testId || 'user-selector'}
|
|
|
@@ -67,8 +73,8 @@ vi.mock('@d8d/user-management-ui/components', () => ({
|
|
|
),
|
|
|
}));
|
|
|
|
|
|
-// Mock AreaSelect4Level
|
|
|
-vi.mock('@d8d/area-management-ui/components', () => ({
|
|
|
+// Mock AreaSelect4Level (多租户版本)
|
|
|
+vi.mock('@d8d/area-management-ui-mt/components', () => ({
|
|
|
AreaSelect4Level: ({
|
|
|
provinceValue,
|
|
|
cityValue,
|
|
|
@@ -142,57 +148,57 @@ describe('地址管理集成测试', () => {
|
|
|
|
|
|
it('应该完成完整的地址CRUD流程', async () => {
|
|
|
const mockAddresses = {
|
|
|
- data: {
|
|
|
- list: [
|
|
|
- {
|
|
|
+ data: [
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ userId: 1,
|
|
|
+ name: '张三',
|
|
|
+ phone: '13800138000',
|
|
|
+ address: '朝阳区三里屯街道',
|
|
|
+ receiverProvince: 1,
|
|
|
+ receiverCity: 2,
|
|
|
+ receiverDistrict: 3,
|
|
|
+ receiverTown: 4,
|
|
|
+ state: 1,
|
|
|
+ isDefault: 1,
|
|
|
+ createdBy: 1,
|
|
|
+ updatedBy: 1,
|
|
|
+ createdAt: '2024-01-01T00:00:00Z',
|
|
|
+ updatedAt: '2024-01-01T00:00:00Z',
|
|
|
+ user: {
|
|
|
id: 1,
|
|
|
- userId: 1,
|
|
|
- name: '张三',
|
|
|
+ name: 'user1',
|
|
|
phone: '13800138000',
|
|
|
- address: '朝阳区三里屯街道',
|
|
|
- receiverProvince: 1,
|
|
|
- receiverCity: 2,
|
|
|
- receiverDistrict: 3,
|
|
|
- receiverTown: 4,
|
|
|
- state: 1,
|
|
|
- isDefault: 1,
|
|
|
- createdBy: 1,
|
|
|
- updatedBy: 1,
|
|
|
- createdAt: '2024-01-01T00:00:00Z',
|
|
|
- updatedAt: '2024-01-01T00:00:00Z',
|
|
|
- user: {
|
|
|
- id: 1,
|
|
|
- name: 'user1',
|
|
|
- phone: '13800138000',
|
|
|
- },
|
|
|
- province: {
|
|
|
- id: 1,
|
|
|
- name: '北京市',
|
|
|
- },
|
|
|
- city: {
|
|
|
- id: 2,
|
|
|
- name: '北京市',
|
|
|
- },
|
|
|
- district: {
|
|
|
- id: 3,
|
|
|
- name: '朝阳区',
|
|
|
- },
|
|
|
- town: {
|
|
|
- id: 4,
|
|
|
- name: '三里屯街道',
|
|
|
- },
|
|
|
},
|
|
|
- ],
|
|
|
+ province: {
|
|
|
+ id: 1,
|
|
|
+ name: '北京市',
|
|
|
+ },
|
|
|
+ city: {
|
|
|
+ id: 2,
|
|
|
+ name: '北京市',
|
|
|
+ },
|
|
|
+ district: {
|
|
|
+ id: 3,
|
|
|
+ name: '朝阳区',
|
|
|
+ },
|
|
|
+ town: {
|
|
|
+ id: 4,
|
|
|
+ name: '三里屯街道',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ pagination: {
|
|
|
total: 1,
|
|
|
- page: 1,
|
|
|
- limit: 10,
|
|
|
+ current: 1,
|
|
|
+ pageSize: 10,
|
|
|
},
|
|
|
};
|
|
|
|
|
|
const { toast } = await import('sonner');
|
|
|
|
|
|
// Mock initial address list
|
|
|
- (deliveryAddressClient.$get as any).mockResolvedValue(createMockResponse(200, mockAddresses));
|
|
|
+ (deliveryAddressClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockAddresses));
|
|
|
|
|
|
renderWithProviders(<DeliveryAddressManagement />);
|
|
|
|
|
|
@@ -232,13 +238,13 @@ describe('地址管理集成测试', () => {
|
|
|
fireEvent.change(townSelect, { target: { value: '4' } });
|
|
|
|
|
|
// Mock successful creation
|
|
|
- (deliveryAddressClient.$post as any).mockResolvedValue(createMockResponse(201, { id: 2, name: '李四' }));
|
|
|
+ (deliveryAddressClient.index.$post as any).mockResolvedValue(createMockResponse(201, { id: 2, name: '李四' }));
|
|
|
|
|
|
const submitButton = screen.getByText('创建');
|
|
|
fireEvent.click(submitButton);
|
|
|
|
|
|
await waitFor(() => {
|
|
|
- expect(deliveryAddressClient.$post).toHaveBeenCalledWith({
|
|
|
+ expect(deliveryAddressClientManager.get().index.$post).toHaveBeenCalledWith({
|
|
|
json: {
|
|
|
userId: 1,
|
|
|
name: '李四',
|
|
|
@@ -274,7 +280,7 @@ describe('地址管理集成测试', () => {
|
|
|
fireEvent.click(updateButton);
|
|
|
|
|
|
await waitFor(() => {
|
|
|
- expect(deliveryAddressClient[':id']['$put']).toHaveBeenCalledWith({
|
|
|
+ expect(deliveryAddressClientManager.get()[':id']['$put']).toHaveBeenCalledWith({
|
|
|
param: { id: 1 },
|
|
|
json: {
|
|
|
name: '王五',
|
|
|
@@ -298,15 +304,13 @@ describe('地址管理集成测试', () => {
|
|
|
expect(screen.getByText('确认删除')).toBeInTheDocument();
|
|
|
|
|
|
// Mock successful deletion
|
|
|
- (deliveryAddressClient[':id']['$delete'] as any).mockResolvedValue({
|
|
|
- status: 204,
|
|
|
- });
|
|
|
+ (deliveryAddressClient[':id']['$delete'] as any).mockResolvedValue(createMockResponse(204));
|
|
|
|
|
|
const confirmDeleteButton = screen.getByText('删除');
|
|
|
fireEvent.click(confirmDeleteButton);
|
|
|
|
|
|
await waitFor(() => {
|
|
|
- expect(deliveryAddressClient[':id']['$delete']).toHaveBeenCalledWith({
|
|
|
+ expect(deliveryAddressClientManager.get()[':id']['$delete']).toHaveBeenCalledWith({
|
|
|
param: { id: 1 },
|
|
|
});
|
|
|
expect(toast.success).toHaveBeenCalledWith('收货地址删除成功');
|
|
|
@@ -317,7 +321,7 @@ describe('地址管理集成测试', () => {
|
|
|
const { toast } = await import('sonner');
|
|
|
|
|
|
// Mock API error
|
|
|
- (deliveryAddressClient.$get as any).mockRejectedValue(new Error('API Error'));
|
|
|
+ (deliveryAddressClient.index.$get as any).mockRejectedValue(new Error('API Error'));
|
|
|
|
|
|
renderWithProviders(<DeliveryAddressManagement />);
|
|
|
|
|
|
@@ -330,14 +334,21 @@ describe('地址管理集成测试', () => {
|
|
|
const createButton = screen.getByText('创建收货地址');
|
|
|
fireEvent.click(createButton);
|
|
|
|
|
|
+ // Fill all required fields
|
|
|
+ const userSelector = screen.getByTestId('create-user-selector');
|
|
|
const nameInput = screen.getByPlaceholderText('请输入收货人姓名');
|
|
|
const phoneInput = screen.getByPlaceholderText('请输入手机号');
|
|
|
+ const addressInput = screen.getByPlaceholderText('请输入详细地址');
|
|
|
|
|
|
+ fireEvent.change(userSelector, { target: { value: '1' } });
|
|
|
fireEvent.change(nameInput, { target: { value: '测试用户' } });
|
|
|
fireEvent.change(phoneInput, { target: { value: '13800138000' } });
|
|
|
+ fireEvent.change(addressInput, { target: { value: '详细地址信息' } });
|
|
|
+
|
|
|
+ // Area values are set with default 0 values which should pass validation
|
|
|
|
|
|
// Mock creation error
|
|
|
- (deliveryAddressClient.$post as any).mockRejectedValue(new Error('Creation failed'));
|
|
|
+ (deliveryAddressClient.index.$post as any).mockRejectedValue(new Error('Creation failed'));
|
|
|
|
|
|
const submitButton = screen.getByText('创建');
|
|
|
fireEvent.click(submitButton);
|
|
|
@@ -349,15 +360,15 @@ describe('地址管理集成测试', () => {
|
|
|
|
|
|
it('应该处理搜索和过滤器集成', async () => {
|
|
|
const mockAddresses = {
|
|
|
- data: {
|
|
|
- list: [],
|
|
|
+ data: [],
|
|
|
+ pagination: {
|
|
|
total: 0,
|
|
|
- page: 1,
|
|
|
- limit: 10,
|
|
|
+ current: 1,
|
|
|
+ pageSize: 10,
|
|
|
},
|
|
|
};
|
|
|
|
|
|
- (deliveryAddressClient.$get as any).mockResolvedValue(createMockResponse(200, mockAddresses));
|
|
|
+ (deliveryAddressClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockAddresses));
|
|
|
|
|
|
renderWithProviders(<DeliveryAddressManagement />);
|
|
|
|
|
|
@@ -366,7 +377,7 @@ describe('地址管理集成测试', () => {
|
|
|
fireEvent.change(searchInput, { target: { value: '张三' } });
|
|
|
|
|
|
await waitFor(() => {
|
|
|
- expect(deliveryAddressClientManager.get().$get).toHaveBeenCalledWith({
|
|
|
+ expect(deliveryAddressClientManager.get().index.$get).toHaveBeenCalledWith({
|
|
|
query: {
|
|
|
page: 1,
|
|
|
pageSize: 10,
|
|
|
@@ -383,7 +394,7 @@ describe('地址管理集成测试', () => {
|
|
|
fireEvent.click(searchButton);
|
|
|
|
|
|
await waitFor(() => {
|
|
|
- expect(deliveryAddressClientManager.get().$get).toHaveBeenCalledWith({
|
|
|
+ expect(deliveryAddressClientManager.get().index.$get).toHaveBeenCalledWith({
|
|
|
query: {
|
|
|
page: 1,
|
|
|
pageSize: 10,
|
|
|
@@ -396,38 +407,38 @@ describe('地址管理集成测试', () => {
|
|
|
|
|
|
it('应该正确显示地址状态和默认地址标记', async () => {
|
|
|
const mockAddresses = {
|
|
|
- data: {
|
|
|
- list: [
|
|
|
- {
|
|
|
+ data: [
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ userId: 1,
|
|
|
+ name: '张三',
|
|
|
+ phone: '13800138000',
|
|
|
+ address: '朝阳区三里屯街道',
|
|
|
+ receiverProvince: 1,
|
|
|
+ receiverCity: 2,
|
|
|
+ receiverDistrict: 3,
|
|
|
+ receiverTown: 4,
|
|
|
+ state: 1,
|
|
|
+ isDefault: 1,
|
|
|
+ createdBy: 1,
|
|
|
+ updatedBy: 1,
|
|
|
+ createdAt: '2024-01-01T00:00:00Z',
|
|
|
+ updatedAt: '2024-01-01T00:00:00Z',
|
|
|
+ user: {
|
|
|
id: 1,
|
|
|
- userId: 1,
|
|
|
- name: '张三',
|
|
|
+ name: 'user1',
|
|
|
phone: '13800138000',
|
|
|
- address: '朝阳区三里屯街道',
|
|
|
- receiverProvince: 1,
|
|
|
- receiverCity: 2,
|
|
|
- receiverDistrict: 3,
|
|
|
- receiverTown: 4,
|
|
|
- state: 1,
|
|
|
- isDefault: 1,
|
|
|
- createdBy: 1,
|
|
|
- updatedBy: 1,
|
|
|
- createdAt: '2024-01-01T00:00:00Z',
|
|
|
- updatedAt: '2024-01-01T00:00:00Z',
|
|
|
- user: {
|
|
|
- id: 1,
|
|
|
- name: 'user1',
|
|
|
- phone: '13800138000',
|
|
|
- },
|
|
|
},
|
|
|
- ],
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ pagination: {
|
|
|
total: 1,
|
|
|
- page: 1,
|
|
|
- limit: 10,
|
|
|
+ current: 1,
|
|
|
+ pageSize: 10,
|
|
|
},
|
|
|
};
|
|
|
|
|
|
- (deliveryAddressClient.$get as any).mockResolvedValue(createMockResponse(200, mockAddresses));
|
|
|
+ (deliveryAddressClient.index.$get as any).mockResolvedValue(createMockResponse(200, mockAddresses));
|
|
|
|
|
|
renderWithProviders(<DeliveryAddressManagement />);
|
|
|
|