|
@@ -17,8 +17,33 @@ vi.mock('next-themes', () => ({
|
|
|
}),
|
|
}),
|
|
|
}));
|
|
}));
|
|
|
|
|
|
|
|
-// Mock API 客户端
|
|
|
|
|
|
|
+// Mock activityClient for ActivitySelect component
|
|
|
vi.mock('@/client/api', () => ({
|
|
vi.mock('@/client/api', () => ({
|
|
|
|
|
+ activityClient: {
|
|
|
|
|
+ $get: vi.fn().mockResolvedValue({
|
|
|
|
|
+ status: 200,
|
|
|
|
|
+ ok: true,
|
|
|
|
|
+ json: async () => ({
|
|
|
|
|
+ data: [
|
|
|
|
|
+ {
|
|
|
|
|
+ id: 1,
|
|
|
|
|
+ name: '北京去程活动',
|
|
|
|
|
+ type: 'departure'
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ id: 2,
|
|
|
|
|
+ name: '上海返程活动',
|
|
|
|
|
+ type: 'return'
|
|
|
|
|
+ }
|
|
|
|
|
+ ],
|
|
|
|
|
+ pagination: {
|
|
|
|
|
+ total: 2,
|
|
|
|
|
+ current: 1,
|
|
|
|
|
+ pageSize: 50
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ })
|
|
|
|
|
+ },
|
|
|
routeClient: {
|
|
routeClient: {
|
|
|
$get: vi.fn().mockResolvedValue({
|
|
$get: vi.fn().mockResolvedValue({
|
|
|
status: 200,
|
|
status: 200,
|
|
@@ -126,6 +151,14 @@ describe('RoutesPage 集成测试', () => {
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
beforeEach(() => {
|
|
|
vi.clearAllMocks();
|
|
vi.clearAllMocks();
|
|
|
|
|
+
|
|
|
|
|
+ // 模拟缺失的 Pointer Events API
|
|
|
|
|
+ if (!Element.prototype.hasPointerCapture) {
|
|
|
|
|
+ Element.prototype.hasPointerCapture = vi.fn(() => false);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!Element.prototype.releasePointerCapture) {
|
|
|
|
|
+ Element.prototype.releasePointerCapture = vi.fn();
|
|
|
|
|
+ }
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
it('应该正确渲染路线管理页面标题', async () => {
|
|
it('应该正确渲染路线管理页面标题', async () => {
|
|
@@ -179,6 +212,7 @@ describe('RoutesPage 集成测试', () => {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
it('应该显示车型筛选功能', async () => {
|
|
it('应该显示车型筛选功能', async () => {
|
|
|
|
|
+ const user = userEvent.setup();
|
|
|
render(
|
|
render(
|
|
|
<TestWrapper>
|
|
<TestWrapper>
|
|
|
<RoutesPage />
|
|
<RoutesPage />
|
|
@@ -191,8 +225,16 @@ describe('RoutesPage 集成测试', () => {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
// 验证车型筛选器存在
|
|
// 验证车型筛选器存在
|
|
|
- const vehicleTypeFilter = screen.getByRole('combobox');
|
|
|
|
|
|
|
+ const vehicleTypeFilter = screen.getByTestId('route-vehicle-type-filter');
|
|
|
expect(vehicleTypeFilter).toBeInTheDocument();
|
|
expect(vehicleTypeFilter).toBeInTheDocument();
|
|
|
|
|
+
|
|
|
|
|
+ // 点击Select来展开选项
|
|
|
|
|
+ await user.click(vehicleTypeFilter);
|
|
|
|
|
+
|
|
|
|
|
+ // 验证筛选选项存在
|
|
|
|
|
+ expect(screen.getByText('大巴')).toBeInTheDocument();
|
|
|
|
|
+ expect(screen.getByText('中巴')).toBeInTheDocument();
|
|
|
|
|
+ expect(screen.getByText('小车')).toBeInTheDocument();
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
it('应该显示创建路线按钮并打开模态框', async () => {
|
|
it('应该显示创建路线按钮并打开模态框', async () => {
|
|
@@ -341,7 +383,19 @@ describe('RoutesPage 集成测试', () => {
|
|
|
expect(screen.getByTestId('price-input')).toBeInTheDocument();
|
|
expect(screen.getByTestId('price-input')).toBeInTheDocument();
|
|
|
expect(screen.getByTestId('seat-count-input')).toBeInTheDocument();
|
|
expect(screen.getByTestId('seat-count-input')).toBeInTheDocument();
|
|
|
expect(screen.getByTestId('available-seats-input')).toBeInTheDocument();
|
|
expect(screen.getByTestId('available-seats-input')).toBeInTheDocument();
|
|
|
- expect(screen.getByTestId('activity-select')).toBeInTheDocument();
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // 验证ActivitySelect组件存在并测试点击交互
|
|
|
|
|
+ const activitySelect = screen.getByTestId('activity-select');
|
|
|
|
|
+ expect(activitySelect).toBeInTheDocument();
|
|
|
|
|
+
|
|
|
|
|
+ // 点击ActivitySelect来展开选项
|
|
|
|
|
+ await user.click(activitySelect);
|
|
|
|
|
+
|
|
|
|
|
+ // 等待活动选项加载并验证选项存在
|
|
|
|
|
+ await waitFor(() => {
|
|
|
|
|
+ expect(screen.getByText('北京去程活动 (去程)')).toBeInTheDocument();
|
|
|
|
|
+ expect(screen.getByText('上海返程活动 (返程)')).toBeInTheDocument();
|
|
|
|
|
+ });
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
it('应该处理启用/禁用路线操作', async () => {
|
|
it('应该处理启用/禁用路线操作', async () => {
|
|
@@ -403,14 +457,6 @@ describe('RoutesPage 集成测试', () => {
|
|
|
it('应该处理车型筛选', async () => {
|
|
it('应该处理车型筛选', async () => {
|
|
|
const user = userEvent.setup();
|
|
const user = userEvent.setup();
|
|
|
|
|
|
|
|
- // 在测试前模拟缺失的 Pointer Events API
|
|
|
|
|
- if (!Element.prototype.hasPointerCapture) {
|
|
|
|
|
- Element.prototype.hasPointerCapture = vi.fn(() => false);
|
|
|
|
|
- }
|
|
|
|
|
- if (!Element.prototype.releasePointerCapture) {
|
|
|
|
|
- Element.prototype.releasePointerCapture = vi.fn();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
render(
|
|
render(
|
|
|
<TestWrapper>
|
|
<TestWrapper>
|
|
|
<RoutesPage />
|
|
<RoutesPage />
|