import { TIMEOUTS } from '../../utils/timeouts'; import { test, expect } from '../../utils/test-setup'; /** * 数据统计页测试与功能验证 (Story 13.12) */ const TEST_USER_PHONE = '13800001111'; const TEST_USER_PASSWORD = process.env.TEST_ENTERPRISE_PASSWORD || 'password123'; const STATISTICS_PAGE_URL = '/pages/yongren/statistics/index'; test.describe('数据统计页测试与功能验证 - Story 13.12', () => { test.use({ storageState: undefined }); test('应该能够访问数据统计页', async ({ enterpriseMiniPage: miniPage }) => { await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await miniPage.navigateToStatisticsPage(); await miniPage.expectUrl(STATISTICS_PAGE_URL); console.debug('[AC1.1] 数据统计页可访问性 ✓'); }); test('应该显示筛选器 UI 元素', async ({ enterpriseMiniPage: miniPage }) => { await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await miniPage.navigateToStatisticsPage(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); // 筛选器是 Taro 自定义组件,使用文本定位器 // 检查年份筛选器(格式: "2026年") const yearSelector = miniPage.page.getByText(/\d{4}年/); const monthSelector = miniPage.page.getByText(/\d+月/); const hasYearSelector = await yearSelector.count() > 0; const hasMonthSelector = await monthSelector.count() > 0; expect(hasYearSelector).toBeTruthy(); expect(hasMonthSelector).toBeTruthy(); console.debug('[AC1.2] 筛选器 UI 元素 ✓'); }); test('应该显示 4 个统计卡片', async ({ enterpriseMiniPage: miniPage }) => { await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await miniPage.navigateToStatisticsPage(); await miniPage.waitForStatisticsDataLoaded(); const cards = await miniPage.getStatisticsCards(); expect(cards.length).toBeGreaterThanOrEqual(4); console.debug('[AC1.3] 4 个统计卡片显示 ✓'); }); test('应该显示 6 个统计图表', async ({ enterpriseMiniPage: miniPage }) => { await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await miniPage.navigateToStatisticsPage(); await miniPage.waitForStatisticsDataLoaded(); const charts = await miniPage.getStatisticsCharts(); expect(charts.length).toBeGreaterThan(0); console.debug('[AC1.4] 6 个统计图表显示 ✓'); }); test('选择年份后应更新统计数据', async ({ enterpriseMiniPage: miniPage }) => { await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await miniPage.navigateToStatisticsPage(); await miniPage.waitForStatisticsDataLoaded(); await miniPage.selectYear(2025); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); const updatedCards = await miniPage.getStatisticsCards(); expect(updatedCards.length).toBeGreaterThanOrEqual(4); console.debug('[AC2.1] 选择年份后数据更新 ✓'); }); test('选择月份后应更新统计数据', async ({ enterpriseMiniPage: miniPage }) => { await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await miniPage.navigateToStatisticsPage(); await miniPage.waitForStatisticsDataLoaded(); await miniPage.selectMonth(12); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); const updatedCards = await miniPage.getStatisticsCards(); expect(updatedCards.length).toBeGreaterThanOrEqual(4); console.debug('[AC2.2] 选择月份后数据更新 ✓'); }); test('验证在职人数数据正确性', async ({ enterpriseMiniPage: miniPage }) => { await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await miniPage.navigateToStatisticsPage(); await miniPage.waitForStatisticsDataLoaded(); const cards = await miniPage.getStatisticsCards(); const employedCard = cards.find(c => c.cardName.includes('在职') || c.cardName.includes('人数')); expect(employedCard).toBeDefined(); if (employedCard) { // 接受数字或空数据占位符 "--" expect(employedCard.currentValue).toMatch(/(\d+|--)/); } console.debug('[AC3.1] 在职人数数据正确性 ✓'); }); test('验证平均薪资数据正确性', async ({ enterpriseMiniPage: miniPage }) => { await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await miniPage.navigateToStatisticsPage(); await miniPage.waitForStatisticsDataLoaded(); const cards = await miniPage.getStatisticsCards(); const salaryCard = cards.find(c => c.cardName.includes('薪资') || c.cardName.includes('平均')); expect(salaryCard).toBeDefined(); if (salaryCard) { // 验证:要么是数字格式(如 "5000" 或 "¥5,000"),要么是空数据占位符 "--" const hasValidSalary = salaryCard.currentValue === '--' || /^¥?\d{1,3}(,\d{3})*(\.\d+)?$/.test(salaryCard.currentValue); expect(hasValidSalary).toBe(true); } console.debug('[AC3.2] 平均薪资数据正确性 ✓'); }); test('验证残疾类型分布图表数据', async ({ enterpriseMiniPage: miniPage }) => { await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await miniPage.navigateToStatisticsPage(); await miniPage.waitForStatisticsDataLoaded(); await miniPage.expectChartData('残疾类型分布', { isVisible: true }); console.debug('[AC4.1] 残疾类型分布图表数据 ✓'); }); test('验证性别分布图表数据', async ({ enterpriseMiniPage: miniPage }) => { await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await miniPage.navigateToStatisticsPage(); await miniPage.waitForStatisticsDataLoaded(); await miniPage.expectChartData('性别分布', { isVisible: true }); console.debug('[AC4.2] 性别分布图表数据 ✓'); }); test('验证 API 不传参数时返回当前年月数据', async ({ enterpriseMiniPage: miniPage }) => { await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await miniPage.navigateToStatisticsPage(); await miniPage.waitForStatisticsDataLoaded(); const cards = await miniPage.getStatisticsCards(); expect(cards.length).toBeGreaterThan(0); console.debug('[AC5.1] API 不传参数返回当前年月数据 ✓'); }); test('完整的数据统计页用户流程', async ({ enterpriseMiniPage: miniPage }) => { await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await miniPage.navigateToStatisticsPage(); await miniPage.waitForStatisticsDataLoaded(); const cards = await miniPage.getStatisticsCards(); expect(cards.length).toBeGreaterThanOrEqual(4); const charts = await miniPage.getStatisticsCharts(); expect(charts.length).toBeGreaterThan(0); await miniPage.selectYear(2025); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); const updatedCards = await miniPage.getStatisticsCards(); expect(updatedCards.length).toBeGreaterThanOrEqual(4); console.debug('[综合测试] 完整的数据统计页用户流程 ✓'); }); });