Преглед на файлове

♻️ refactor(tests): restructure test files and update import paths

- move test utility files from src/client/__test_utils__ to tests/utils/client
- move test utility files from src/server/__test_utils__ to tests/utils/server
- update import paths in test files to use new @/ and ~/ aliases
- rename src/test directory to tests/unit and adjust test file locations

✅ test(config): update test configuration

- add "~/*" path alias in tsconfig.json pointing to tests directory
- simplify alias configuration in vitest.config.ts
- update setupFiles path in vitest config to use new tests/utils/setup.ts location
- add support for additional bash commands in claude settings

🔧 chore(tests): update test file imports and mocks

- update import paths in all test files to use new utility locations
- adjust vi.mock paths in test files to correctly reference source modules
- fix relative import paths after directory restructuring
yourname преди 1 месец
родител
ревизия
3c6f9813a1

+ 3 - 1
.claude/settings.local.json

@@ -32,7 +32,9 @@
       "Bash(pnpm typecheck)",
       "Bash(pnpm test:api:*)",
       "Bash(pnpm test:components:*)",
-      "Bash(pnpm test:unit:*)"
+      "Bash(pnpm test:unit:*)",
+      "Bash(mkdir:*)",
+      "Bash(xargs sed:*)"
     ],
     "deny": [],
     "ask": []

+ 3 - 3
tests/integration/client/admin/login.test.tsx

@@ -2,14 +2,14 @@ import { describe, it, expect, vi, beforeEach } from 'vitest';
 import { render, screen, waitFor } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 import '@testing-library/jest-dom';
-import { LoginPage } from '../../../../src/client/admin/pages/Login';
-import { TestWrapper } from '../../../../src/client/__test_utils__/test-render';
+import { LoginPage } from '@/client/admin/pages/Login';
+import { TestWrapper } from '~/utils/client/test-render';
 
 // Mock useAuth钩子
 const mockLogin = vi.fn();
 const mockNavigate = vi.fn();
 
-vi.mock('../../../../src/client/admin/hooks/AuthProvider', () => ({
+vi.mock('@/client/admin/hooks/AuthProvider', () => ({
   useAuth: () => ({
     login: mockLogin,
     user: null,

+ 4 - 4
tests/integration/client/admin/users.test.tsx

@@ -2,15 +2,15 @@ import { describe, it, expect, vi, beforeEach } from 'vitest';
 import { render, screen, waitFor } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 import '@testing-library/jest-dom';
-import { UsersPage } from '../../../../src/client/admin/pages/Users';
-import { TestWrapper } from '../../../../src/client/__test_utils__/test-render';
+import { UsersPage } from '@/client/admin/pages/Users';
+import { TestWrapper } from '~/utils/client/test-render';
 
 // Import mocked modules
-import { userClient } from '../../../../src/client/api';
+import { userClient } from '@/client/api';
 import { toast } from 'sonner';
 
 // Mock API 客户端
-vi.mock('../../../../src/client/api', () => ({
+vi.mock('@/client/api', () => ({
   userClient: {
     $get: vi.fn().mockResolvedValue({
       status: 200,

+ 6 - 6
tests/integration/server/auth.integration.test.ts

@@ -4,12 +4,12 @@ import {
   IntegrationTestDatabase,
   setupIntegrationDatabaseHooks,
   TestDataFactory
-} from '../../../src/server/__test_utils__/integration-test-db';
-import { UserEntity } from '../../../src/server/modules/users/user.entity';
-import { authRoutes } from '../../../src/server/api';
-import { AuthService } from '../../../src/server/modules/auth/auth.service';
-import { UserService } from '../../../src/server/modules/users/user.service';
-import { DisabledStatus } from '../../../src/share/types';
+} from '~/utils/server/integration-test-db';
+import { UserEntity } from '@/server/modules/users/user.entity';
+import { authRoutes } from '@/server/api';
+import { AuthService } from '@/server/modules/auth/auth.service';
+import { UserService } from '@/server/modules/users/user.service';
+import { DisabledStatus } from '@/share/types';
 
 // 设置集成测试钩子
 setupIntegrationDatabaseHooks()

+ 5 - 5
tests/integration/server/users.integration.test.ts

@@ -4,11 +4,11 @@ import {
   IntegrationTestDatabase,
   setupIntegrationDatabaseHooks,
   TestDataFactory
-} from '../../../src/server/__test_utils__/integration-test-db';
-import { IntegrationTestAssertions } from '../../../src/server/__test_utils__/integration-test-utils';
-import { userRoutes } from '../../../src/server/api';
-import { AuthService } from '../../../src/server/modules/auth/auth.service';
-import { UserService } from '../../../src/server/modules/users/user.service';
+} from '~/utils/server/integration-test-db';
+import { IntegrationTestAssertions } from '~/utils/server/integration-test-utils';
+import { userRoutes } from '@/server/api';
+import { AuthService } from '@/server/modules/auth/auth.service';
+import { UserService } from '@/server/modules/users/user.service';
 
 
 // 设置集成测试钩子

+ 0 - 0
src/test/basic.test.ts → tests/unit/basic.test.ts


+ 4 - 4
tests/unit/client/pages/Users.test.tsx

@@ -2,12 +2,12 @@ import { describe, it, expect, vi, beforeEach } from 'vitest';
 import { render, screen, waitFor } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 import '@testing-library/jest-dom';
-import { TestWrapper } from '../../../../src/client/__test_utils__/test-render';
-import { UsersPage } from '../../../../src/client/admin/pages/Users';
-import { userClient } from '../../../../src/client/api';
+import { TestWrapper } from '~/utils/client/test-render';
+import { UsersPage } from '@/client/admin/pages/Users';
+import { userClient } from '@/client/api';
 
 // Mock the API client
-vi.mock('../../../../src/client/api', () => ({
+vi.mock('@/client/api', () => ({
   userClient: {
     $get: vi.fn(),
     $post: vi.fn(),

+ 4 - 4
tests/unit/client/pages/debug.test.tsx

@@ -1,12 +1,12 @@
 import { describe, it, expect, vi } from 'vitest';
 import { render, screen } from '@testing-library/react';
 import '@testing-library/jest-dom';
-import { TestWrapper } from '../../../../src/client/__test_utils__/test-render';
-import { UsersPage } from '../../../../src/client/admin/pages/Users';
-import { userClient } from '../../../../src/client/api';
+import { TestWrapper } from '~/utils/client/test-render';
+import { UsersPage } from '@/client/admin/pages/Users';
+import { userClient } from '@/client/api';
 
 // Mock the API client
-vi.mock('../../../../src/client/api', () => ({
+vi.mock('@/client/api', () => ({
   userClient: {
     $get: vi.fn(),
     $post: vi.fn(),

+ 0 - 0
src/client/__test_utils__/test-query.tsx → tests/utils/client/test-query.tsx


+ 1 - 1
src/client/__test_utils__/test-render.tsx → tests/utils/client/test-render.tsx

@@ -2,7 +2,7 @@ import { ReactNode } from 'react';
 import { BrowserRouter } from 'react-router-dom';
 import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
 import { ThemeProvider } from 'next-themes';
-import { AuthProvider } from '@/client/admin/hooks/AuthProvider';
+import { AuthProvider } from '../../../src/client/admin/hooks/AuthProvider';
 import { vi } from 'vitest';
 
 /**

+ 0 - 0
src/client/__test_utils__/test-router.tsx → tests/utils/client/test-router.tsx


+ 3 - 3
src/server/__test_utils__/integration-test-db.ts → tests/utils/server/integration-test-db.ts

@@ -1,8 +1,8 @@
 import { DataSource } from 'typeorm';
 import { beforeEach, afterEach } from 'vitest';
-import { UserEntity } from '../modules/users/user.entity';
-import { Role } from '../modules/users/role.entity';
-import { AppDataSource } from '../data-source';
+import { UserEntity } from '@/server/modules/users/user.entity';
+import { Role } from '@/server/modules/users/role.entity';
+import { AppDataSource } from '@/server/data-source';
 
 /**
  * 集成测试数据库工具类 - 使用真实PostgreSQL数据库

+ 1 - 1
src/server/__test_utils__/integration-test-utils.ts → tests/utils/server/integration-test-utils.ts

@@ -1,6 +1,6 @@
 
 import { IntegrationTestDatabase } from './integration-test-db';
-import { UserEntity } from '../modules/users/user.entity';
+import { UserEntity } from '@/server/modules/users/user.entity';
 
 
 

+ 0 - 0
src/server/__test_utils__/service-mocks.ts → tests/utils/server/service-mocks.ts


+ 4 - 4
src/server/__test_utils__/service-stubs.ts → tests/utils/server/service-stubs.ts

@@ -137,22 +137,22 @@ export const serviceStubs = new ServiceStubManager();
  */
 export function setupServiceMocks() {
   // 用户服务mock
-  vi.mock('../modules/users/user.service', () => ({
+  vi.mock('../../../src/server/modules/users/user.service', () => ({
     UserService: vi.fn().mockImplementation(() => serviceStubs.createStub('UserService', createMockUserService()))
   }));
 
   // 认证服务mock
-  vi.mock('../modules/auth/auth.service', () => ({
+  vi.mock('../../../src/server/modules/auth/auth.service', () => ({
     AuthService: vi.fn().mockImplementation(() => serviceStubs.createStub('AuthService', createMockAuthService()))
   }));
 
   // 角色服务mock
-  vi.mock('../modules/roles/role.service', () => ({
+  vi.mock('../../../src/server/modules/roles/role.service', () => ({
     RoleService: vi.fn().mockImplementation(() => serviceStubs.createStub('RoleService', createMockRoleService()))
   }));
 
   // 通用CRUD服务mock
-  vi.mock('../../utils/generic-crud.service', () => ({
+  vi.mock('../../../src/server/utils/generic-crud.service', () => ({
     GenericCRUDService: vi.fn().mockImplementation(() => serviceStubs.createStub('GenericCRUDService', createMockCrudService()))
   }));
 }

+ 0 - 0
src/server/__test_utils__/test-auth.ts → tests/utils/server/test-auth.ts


+ 2 - 2
src/server/__test_utils__/test-db.ts → tests/utils/server/test-db.ts

@@ -116,8 +116,8 @@ export class TestDatabase {
       logging: false,
       entities: [
         // 导入实际实体
-        (await import('../modules/users/user.entity')).UserEntity,
-        (await import('../modules/users/role.entity')).Role
+        (await import('@/server/modules/users/user.entity')).UserEntity,
+        (await import('@/server/modules/users/role.entity')).Role
       ]
     });
 

+ 0 - 0
src/test/setup.ts → tests/utils/setup.ts


+ 0 - 0
src/test/test-utils.ts → tests/utils/test-utils.ts


+ 1 - 0
tsconfig.json

@@ -25,6 +25,7 @@
     "emitDecoratorMetadata": true,
     "baseUrl": ".",
     "paths": {
+      "~/*": ["tests/*"],
       "@/*": ["src/*"]
     },
   },

+ 3 - 9
vitest.config.ts

@@ -24,11 +24,8 @@ export default defineConfig({
           ],
 
           alias: {
+            '~': resolve(__dirname, './tests'),
             '@': resolve(__dirname, './src'),
-            '@/client': resolve(__dirname, './src/client'),
-            '@/server': resolve(__dirname, './src/server'),
-            '@/share': resolve(__dirname, './src/share'),
-            '@/test': resolve(__dirname, './src/test')
           }
         }
       },
@@ -54,17 +51,14 @@ export default defineConfig({
             'src/client/__test_utils__/**',
           ],
           alias: {
+            '~': resolve(__dirname, './tests'),
             '@': resolve(__dirname, './src'),
-            '@/client': resolve(__dirname, './src/client'),
-            '@/server': resolve(__dirname, './src/server'),
-            '@/share': resolve(__dirname, './src/share'),
-            '@/test': resolve(__dirname, './src/test')
           },
         },
       }
     ],
     testTimeout: 10000,
-    setupFiles: ['./src/test/setup.ts'],
+    setupFiles: ['./tests/utils/setup.ts'],
     // 覆盖率配置 - 放在根级别
     coverage: {
       provider: 'v8',