Ver Fonte

feat(story-13.12): 完成跨系统数据一致性验证任务 (任务 12-15)

主要变更:

1. Page Object 增强 (disability-person.page.ts)
   - 新增 updateWorkStatus() 方法,支持修改人员工作状态
   - 方法参数: isEmployed (true=已在职, false=未在职)
   - 使用原生 select 元素定位工作状态字段

2. 测试代码完善 (statistics-cross-system-validation.spec.ts)
   - 修复 TypeScript 类型错误 (page.waitForTimeout -> page.page.waitForTimeout)
   - 完善任务 13: 修改人员状态 → 统计数据变化验证
     - 实现后台修改人员状态为"未在职"的完整流程
     - 添加轮询检查机制验证小程序统计数据更新
     - 验证在职人数减少的断言
   - 修复测试数据: 使用数据库中存在的省份数据 (广东省/广州市)

3. 测试结果
   - 任务 14 (边界条件测试) ✓ 通过
   - 任务 15 (数据一致性验证方法) ✓ 通过
   - 任务 12 步骤 2 (后台添加人员) ✓ 通过

Co-Authored-By: Claude <noreply@anthropic.com>
yourname há 2 dias atrás
pai
commit
c76985b144

+ 27 - 0
web/tests/e2e/pages/admin/disability-person.page.ts

@@ -1054,6 +1054,33 @@ export class DisabilityPersonManagementPage {
     };
   }
 
+  /**
+   * 修改人员工作状态 (跨系统数据一致性验证)
+   * @param isEmployed 是否在职 (true=已在职, false=未在职)
+   * @returns 提交结果
+   *
+   * 注意:此方法需要在编辑对话框打开后调用
+   */
+  async updateWorkStatus(isEmployed: boolean): Promise<{
+    hasSuccess: boolean;
+    hasError: boolean;
+    errorMessage?: string;
+    successMessage?: string;
+  }> {
+    // 工作状态选择器:编辑表单使用原生 select 元素
+    const jobStatusSelect = this.page.locator('select[name="jobStatus"]');
+    await jobStatusSelect.waitFor({ state: 'visible', timeout: TIMEOUTS.ELEMENT_VISIBLE_SHORT });
+
+    // 设置值:1=已在职, 0=未在职
+    const value = isEmployed ? '1' : '0';
+    await jobStatusSelect.selectOption(value);
+
+    console.debug(`  ✓ 设置工作状态: ${isEmployed ? '已在职' : '未在职'}`);
+
+    // 提交修改
+    return await this.submitAndSave();
+  }
+
   /**
    * 导出残疾人列表数据
    * @returns 下载事件(可用于验证下载)

+ 45 - 18
web/tests/e2e/specs/cross-platform/statistics-cross-system-validation.spec.ts

@@ -82,9 +82,9 @@ function generateTestPerson() {
     disabilityType: '肢体残疾',
     disabilityLevel: '一级',
     phone: `138${String(timestamp).slice(-8)}`,
-    idAddress: `北京市朝阳区测试路${timestamp % 100}号`,
-    province: '北京市',
-    city: '北京市',
+    idAddress: `广东省广州市测试路${timestamp % 100}号`,
+    province: '广东省',
+    city: '广州市',
   };
 }
 
@@ -200,7 +200,7 @@ test.describe('跨系统数据一致性验证 - Story 13.12 (任务 12-15)', ()
           break;
         }
 
-        await page.waitForTimeout(TEST_POLL_INTERVAL);
+        await page.page.waitForTimeout(TEST_POLL_INTERVAL);
       }
 
       testState.updatedEmploymentCount = updatedCount;
@@ -226,7 +226,7 @@ test.describe('跨系统数据一致性验证 - Story 13.12 (任务 12-15)', ()
       console.debug(`[小程序] 当前在职人数: ${currentCount ?? '无数据'}`);
     });
 
-    test('步骤 2: 后台修改人员状态为职', async ({ adminPage }) => {
+    test('步骤 2: 后台修改人员状态为未在职', async ({ adminPage }) => {
       if (!testState.personName) {
         console.debug('[跳过] 未找到测试人员,跳过状态修改测试');
         test.skip();
@@ -246,14 +246,12 @@ test.describe('跨系统数据一致性验证 - Story 13.12 (任务 12-15)', ()
       await personPage.openEditDialog(testState.personName);
       await adminPage.waitForTimeout(TIMEOUTS.MEDIUM);
 
-      // 注意:这里需要修改人员的工作状态为"离职"
-      // 具体的实现取决于表单结构,这里提供基础框架
-      // TODO: 实现修改工作状态的具体逻辑
+      // 修改人员工作状态为"未在职"(离职)
+      const result = await personPage.updateWorkStatus(false);
 
-      // 提交修改
-      // await personPage.submitAndSave();
-
-      console.debug(`[后台] 已修改人员状态: ${testState.personName}`);
+      // 验证修改成功
+      expect(result.hasSuccess || !result.hasError).toBe(true);
+      console.debug(`[后台] 已修改人员状态为未在职: ${testState.personName}`);
     });
 
     test('步骤 3: 验证小程序在职人数减少', async ({ enterpriseMiniPage: miniPage }) => {
@@ -266,15 +264,44 @@ test.describe('跨系统数据一致性验证 - Story 13.12 (任务 12-15)', ()
       await miniPage.navigateToStatisticsPage();
       await miniPage.waitForStatisticsDataLoaded();
 
-      // 等待数据更新
-      await miniPage.page.waitForTimeout(TIMEOUTS.LONG);
+      // 记录同步开始时间
+      const syncStartTime = Date.now();
+
+      // 轮询检查统计数据是否更新
+      let updatedCount: number | null = null;
+      let found = false;
+
+      for (let elapsed = 0; elapsed <= TEST_SYNC_TIMEOUT; elapsed += TEST_POLL_INTERVAL) {
+        // 强制刷新统计数据
+        await miniPage.forceRefreshStatistics();
+        await miniPage.waitForStatisticsDataLoaded();
+
+        updatedCount = await miniPage.getEmploymentCount();
+
+        // 检查数据是否更新(在职人数应该减少)
+        if (testState.initialEmploymentCount !== null &&
+            updatedCount !== null &&
+            updatedCount < testState.initialEmploymentCount) {
+          found = true;
+          testState.syncTime = Date.now() - syncStartTime;
+          console.debug(`[小程序] 统计数据已更新,耗时: ${testState.syncTime}ms`);
+          break;
+        }
+
+        await miniPage.page.waitForTimeout(TEST_POLL_INTERVAL);
+      }
 
-      const updatedCount = await miniPage.getEmploymentCount();
       testState.updatedEmploymentCount = updatedCount;
 
-      // 验证在职人数减少(如果状态修改成功)
-      // 注意:此验证依赖于状态修改的实现
-      console.debug(`[验证] 当前在职人数: ${updatedCount ?? '无数据'}`);
+      // 验证数据已更新
+      expect(found, `在职人数应该从 ${testState.initialEmploymentCount} 减少`).toBe(true);
+      if (testState.initialEmploymentCount !== null) {
+        expect(updatedCount).toBeLessThan(testState.initialEmploymentCount);
+      }
+
+      console.debug(`[验证] 修改前在职人数: ${testState.initialEmploymentCount}`);
+      console.debug(`[验证] 修改后在职人数: ${updatedCount}`);
+      console.debug(`[验证] 在职人数减少: ${(testState.initialEmploymentCount ?? 0) - (updatedCount ?? 0)}`);
     });
   });