import { test as base, Page, BrowserContext } from '@playwright/test'; import { testConfig, TestEnvironment } from './core/test-config'; import { testDataGenerator, UserData, RoleData, MenuData, PermissionData } from './core/test-data'; import { testLogger } from './core/test-logger'; import { testReporter } from './core/test-reporter'; import { BasePage } from './pages/base-page'; import { LoginPage } from './pages/login-page'; import { DashboardPage } from './pages/dashboard-page'; import { UserManagementPage } from './pages/user-management-page'; import { RoleManagementPage } from './pages/role-management-page'; import { MenuManagementPage } from './pages/menu-management-page'; import { ScreenshotHelper } from './helpers/screenshot-helper'; import { FormHelper } from './helpers/form-helper'; import { TableHelper } from './helpers/table-helper'; import { MockManager, MockConfig } from './mock-manager'; export interface TestFixtures { page: Page; context: BrowserContext; testConfig: TestEnvironment; testDataGenerator: typeof testDataGenerator; testLogger: typeof testLogger; testReporter: typeof testReporter; pageObjects: { basePage: BasePage; loginPage: LoginPage; dashboardPage: DashboardPage; userManagementPage: UserManagementPage; roleManagementPage: RoleManagementPage; menuManagementPage: MenuManagementPage; }; helpers: { screenshot: ScreenshotHelper; form: FormHelper; table: TableHelper; }; mockManager: MockManager; testData: { user: UserData; admin: UserData; role: RoleData; menu: MenuData; permission: PermissionData; }; } export const test = base.extend({ page: async ({ page }, use) => { await use(page); }, context: async ({ context }, use) => { await use(context); }, testConfig: async ({}, use) => { const config = testConfig.getEnvironment(); await use(config); }, testDataGenerator: async ({}, use) => { await use(testDataGenerator); }, testLogger: async ({}, use) => { await use(testLogger); }, testReporter: async ({}, use) => { await use(testReporter); }, pageObjects: async ({ page }, use) => { const pageObjects = { basePage: new BasePage(page), loginPage: new LoginPage(page), dashboardPage: new DashboardPage(page), userManagementPage: new UserManagementPage(page), roleManagementPage: new RoleManagementPage(page), menuManagementPage: new MenuManagementPage(page) }; await use(pageObjects); }, helpers: async ({ page }, use) => { const helpers = { screenshot: new ScreenshotHelper(page), form: new FormHelper(page), table: new TableHelper(page) }; await use(helpers); }, mockManager: async ({ page }, use) => { const mockConfig: MockConfig = { enabled: process.env.E2E_MOCK_ENABLED === 'true', mode: (process.env.E2E_MOCK_MODE as 'full' | 'partial' | 'none') || 'none', mockPaths: [], delay: 0, logCalls: true, validateResponses: true, dataSource: 'memory' }; const mockManager = new MockManager(mockConfig); await mockManager.interceptAPIRequest(page); await use(mockManager); }, testData: async ({}, use) => { const testData = { user: testDataGenerator.generateUserData({ username: 'testuser', email: 'test@example.com', status: 'active' }), admin: testDataGenerator.generateUserData({ username: 'admin', email: 'admin@example.com', status: 'active', roleIds: [1] }), role: testDataGenerator.generateRoleData({ roleName: '测试角色', roleCode: 'test_role', status: 1 }), menu: testDataGenerator.generateMenuData({ menuName: '测试菜单', menuType: 1, path: '/test', status: 0 }), permission: testDataGenerator.generatePermissionData({ permissionName: '测试权限', permissionCode: 'test:permission', permissionType: 'button' }) }; await use(testData); } }); export const expect = test.expect; export type PageObjects = TestFixtures['pageObjects']; export type Helpers = TestFixtures['helpers']; export type TestData = TestFixtures['testData'];