|
|
@@ -0,0 +1,302 @@
|
|
|
+/**
|
|
|
+ * ================================================================
|
|
|
+ * 场景:统一审核中心 E2E 测试
|
|
|
+ * ================================================================
|
|
|
+ * 用户故事:管理员在统一审核中心查看和处理所有待审核事项,
|
|
|
+ * 包括文章审核、服务商审核、管家审核、提现审核等。
|
|
|
+ *
|
|
|
+ * 流程步骤:
|
|
|
+ * 1. 管理员登录后台
|
|
|
+ * 2. 进入统一审核中心
|
|
|
+ * 3. 查看待审核事项列表
|
|
|
+ * 4. 审核不同类型的事项
|
|
|
+ * 5. 查看审核记录
|
|
|
+ *
|
|
|
+ * 关键里程碑:
|
|
|
+ * - [Milestone-1] 审核中心页面加载成功
|
|
|
+ * - [Milestone-2] 待审核事项列表加载正常
|
|
|
+ * - [Milestone-3] 审核操作成功
|
|
|
+ * - [Milestone-4] 审核记录可查询
|
|
|
+ *
|
|
|
+ * 运行:npx playwright test tests/e2e/unified-audit-center.spec.js
|
|
|
+ * ================================================================
|
|
|
+ */
|
|
|
+
|
|
|
+const { test, expect } = require('@playwright/test');
|
|
|
+
|
|
|
+test.describe('【场景流程】统一审核中心', () => {
|
|
|
+
|
|
|
+ test.beforeEach(async ({ page }) => {
|
|
|
+ // 管理员登录(admin 后台)
|
|
|
+ await page.goto('http://cfc.iwintrue.com/admin/login');
|
|
|
+ await page.waitForLoadState('networkidle');
|
|
|
+
|
|
|
+ const adminPhone = '13701366188';
|
|
|
+ const phoneInput = page.locator('input[placeholder="请输入手机号"]');
|
|
|
+ await phoneInput.fill(adminPhone);
|
|
|
+
|
|
|
+ await page.locator('.login-btn, button:has-text("登录")').click();
|
|
|
+ await page.waitForTimeout(1500);
|
|
|
+
|
|
|
+ // 验证登录成功
|
|
|
+ try {
|
|
|
+ await page.waitForSelector('.admin-tab, .admin-menu, .admin-layout', { timeout: 10000 });
|
|
|
+ } catch (e) {
|
|
|
+ if (await page.url().includes('/login')) {
|
|
|
+ await page.goto('http://cfc.iwintrue.com/admin/review-center');
|
|
|
+ await page.waitForLoadState('networkidle');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 场景1:审核中心页面加载
|
|
|
+ * 角色:管理员
|
|
|
+ * 触发条件:进入统一审核中心
|
|
|
+ * 校验:页面加载成功,tab 切换到待审核
|
|
|
+ */
|
|
|
+ test('[场景1] 审核中心页面加载 — 期望 tab 切换到待审核', async ({ page }) => {
|
|
|
+ await page.goto('http://cfc.iwintrue.com/admin/review-center');
|
|
|
+ await page.waitForLoadState('networkidle');
|
|
|
+
|
|
|
+ // 验证页面标题
|
|
|
+ const title = page.locator('.el-card__header, .tab-header, h2:has-text("审核中心")');
|
|
|
+ expect(await title.isVisible()).toBeTruthy();
|
|
|
+
|
|
|
+ // 验证默认选中"待审核" tab
|
|
|
+ const pendingTab = page.locator('.nav-item.active, .el-tab-pane.is-active, text="待审核"');
|
|
|
+ expect(await pendingTab.isVisible()).toBeTruthy();
|
|
|
+ });
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 场景2:待审核事项列表加载
|
|
|
+ * 角色:管理员
|
|
|
+ * 触发条件:进入待审核 tab
|
|
|
+ * 校验:列表加载正常数据
|
|
|
+ */
|
|
|
+ test('[场景2] 待审核事项列表 — 期望加载正常', async ({ page }) => {
|
|
|
+ await page.goto('http://cfc.iwintrue.com/admin/review-center');
|
|
|
+ await page.waitForLoadState('networkidle');
|
|
|
+
|
|
|
+ // 切换到待审核 tab
|
|
|
+ const pendingTab = page.locator('.nav-item:has-text("待审核"), .tab-item:has-text("待审核")');
|
|
|
+ await pendingTab.click();
|
|
|
+ await page.waitForTimeout(1000);
|
|
|
+
|
|
|
+ // 验证列表加载
|
|
|
+ const rows = page.locator('.el-table__row, .review-item');
|
|
|
+ const rowCount = await rows.count();
|
|
|
+ expect(rowCount).toBeGreaterThanOrEqual(0);
|
|
|
+
|
|
|
+ // 验证列数
|
|
|
+ if (rowCount > 0) {
|
|
|
+ const firstRow = rows.first();
|
|
|
+ const cells = firstRow.locator('.el-table__cell, .review-cell');
|
|
|
+ expect(await cells.count()).toBeGreaterThanOrEqual(5);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 场景3:审核文章
|
|
|
+ * 角色:管理员
|
|
|
+ * 触发条件:选择待审核文章,点击通过
|
|
|
+ * 校验:审核成功,状态变为已发布
|
|
|
+ */
|
|
|
+ test('[场景3] 审核文章 — 期望通过成功', async ({ page }) => {
|
|
|
+ await page.goto('http://cfc.iwintrue.com/admin/review-center');
|
|
|
+ await page.waitForLoadState('networkidle');
|
|
|
+
|
|
|
+ // 切换到文章审核 tab
|
|
|
+ const articleTab = page.locator('.nav-item:has-text("文章审核"), .tab-item:has-text("文章")');
|
|
|
+ await articleTab.click();
|
|
|
+ await page.waitForTimeout(1000);
|
|
|
+
|
|
|
+ // 查找待审核文章
|
|
|
+ const pendingArticles = page.locator('.el-table__row:has-text("待审核")');
|
|
|
+ const articleCount = await pendingArticles.count();
|
|
|
+
|
|
|
+ if (articleCount > 0) {
|
|
|
+ // 点击通过按钮
|
|
|
+ const approveBtn = pendingArticles.first().locator('button:has-text("通过")');
|
|
|
+ await approveBtn.click();
|
|
|
+ await page.waitForTimeout(500);
|
|
|
+
|
|
|
+ // 提交
|
|
|
+ const submitBtn = page.locator('.el-dialog__footer button:has-text("确定"), button.el-button--primary');
|
|
|
+ await submitBtn.click();
|
|
|
+ await page.waitForTimeout(1000);
|
|
|
+
|
|
|
+ // 验证提示
|
|
|
+ const successTip = page.locator('.toast-success, text="审核通过"');
|
|
|
+ expect(await successTip.isVisible().catch(() => false)).toBeTruthy();
|
|
|
+ } else {
|
|
|
+ // 无待审核文章,跳过
|
|
|
+ expect(true).toBeTruthy();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 场景4:审核服务商
|
|
|
+ * 角色:管理员
|
|
|
+ * 触发条件:选择待审核服务商,点击通过
|
|
|
+ * 校验:审核成功,状态变为已入驻
|
|
|
+ */
|
|
|
+ test('[场景4] 审核服务商 — 期望通过成功', async ({ page }) => {
|
|
|
+ await page.goto('http://cfc.iwintrue.com/admin/review-center');
|
|
|
+ await page.waitForLoadState('networkidle');
|
|
|
+
|
|
|
+ // 切换到服务商审核 tab
|
|
|
+ const vendorTab = page.locator('.nav-item:has-text("服务商审核"), .tab-item:has-text("服务商")');
|
|
|
+ await vendorTab.click();
|
|
|
+ await page.waitForTimeout(1000);
|
|
|
+
|
|
|
+ // 查找待审核服务商
|
|
|
+ const pendingVendors = page.locator('.el-table__row:has-text("待审核")');
|
|
|
+ const vendorCount = await pendingVendors.count();
|
|
|
+
|
|
|
+ if (vendorCount > 0) {
|
|
|
+ // 点击通过按钮
|
|
|
+ const approveBtn = pendingVendors.first().locator('button:has-text("通过")');
|
|
|
+ await approveBtn.click();
|
|
|
+ await page.waitForTimeout(500);
|
|
|
+
|
|
|
+ // 提交
|
|
|
+ const submitBtn = page.locator('.el-dialog__footer button:has-text("确定"), button.el-button--primary');
|
|
|
+ await submitBtn.click();
|
|
|
+ await page.waitForTimeout(1000);
|
|
|
+
|
|
|
+ // 验证提示
|
|
|
+ const successTip = page.locator('.toast-success, text="审核通过"');
|
|
|
+ expect(await successTip.isVisible().catch(() => false)).toBeTruthy();
|
|
|
+ } else {
|
|
|
+ // 无待审核服务商,跳过
|
|
|
+ expect(true).toBeTruthy();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 场景5:审核提现申请
|
|
|
+ * 角色:管理员
|
|
|
+ * 触发条件:选择待审核提现,点击通过
|
|
|
+ * 校验:审核成功,状态变为已打款
|
|
|
+ */
|
|
|
+ test('[场景5] 审核提现申请 — 期望通过成功', async ({ page }) => {
|
|
|
+ await page.goto('http://cfc.iwintrue.com/admin/review-center');
|
|
|
+ await page.waitForLoadState('networkidle');
|
|
|
+
|
|
|
+ // 切换到提现审核 tab
|
|
|
+ const withdrawTab = page.locator('.nav-item:has-text("提现审核"), .tab-item:has-text("提现")');
|
|
|
+ await withdrawTab.click();
|
|
|
+ await page.waitForTimeout(1000);
|
|
|
+
|
|
|
+ // 查找待审核提现
|
|
|
+ const pendingWithdraws = page.locator('.el-table__row:has-text("待审核")');
|
|
|
+ const withdrawCount = await pendingWithdraws.count();
|
|
|
+
|
|
|
+ if (withdrawCount > 0) {
|
|
|
+ // 点击通过按钮
|
|
|
+ const approveBtn = pendingWithdraws.first().locator('button:has-text("通过")');
|
|
|
+ await approveBtn.click();
|
|
|
+ await page.waitForTimeout(500);
|
|
|
+
|
|
|
+ // 提交
|
|
|
+ const submitBtn = page.locator('.el-dialog__footer button:has-text("确定"), button.el-button--primary');
|
|
|
+ await submitBtn.click();
|
|
|
+ await page.waitForTimeout(1000);
|
|
|
+
|
|
|
+ // 验证提示
|
|
|
+ const successTip = page.locator('.toast-success, text="审核通过"');
|
|
|
+ expect(await successTip.isVisible().catch(() => false)).toBeTruthy();
|
|
|
+ } else {
|
|
|
+ // 无待审核提现,跳过
|
|
|
+ expect(true).toBeTruthy();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 场景6:审核管家申请
|
|
|
+ * 角色:管理员
|
|
|
+ * 触发条件:选择待审核管家,点击通过
|
|
|
+ * 校验:审核成功,状态变为已开通
|
|
|
+ */
|
|
|
+ test('[场景6] 审核管家申请 — 期望通过成功', async ({ page }) => {
|
|
|
+ await page.goto('http://cfc.iwintrue.com/admin/review-center');
|
|
|
+ await page.waitForLoadState('networkidle');
|
|
|
+
|
|
|
+ // 切换到管家审核 tab
|
|
|
+ const butlerTab = page.locator('.nav-item:has-text("管家审核"), .tab-item:has-text("管家")');
|
|
|
+ await butlerTab.click();
|
|
|
+ await page.waitForTimeout(1000);
|
|
|
+
|
|
|
+ // 查找待审核管家
|
|
|
+ const pendingButlers = page.locator('.el-table__row:has-text("待审核")');
|
|
|
+ const butlerCount = await pendingButlers.count();
|
|
|
+
|
|
|
+ if (butlerCount > 0) {
|
|
|
+ // 点击通过按钮
|
|
|
+ const approveBtn = pendingButlers.first().locator('button:has-text("通过")');
|
|
|
+ await approveBtn.click();
|
|
|
+ await page.waitForTimeout(500);
|
|
|
+
|
|
|
+ // 提交
|
|
|
+ const submitBtn = page.locator('.el-dialog__footer button:has-text("确定"), button.el-button--primary');
|
|
|
+ await submitBtn.click();
|
|
|
+ await page.waitForTimeout(1000);
|
|
|
+
|
|
|
+ // 验证提示
|
|
|
+ const successTip = page.locator('.toast-success, text="审核通过"');
|
|
|
+ expect(await successTip.isVisible().catch(() => false)).toBeTruthy();
|
|
|
+ } else {
|
|
|
+ // 无待审核管家,跳过
|
|
|
+ expect(true).toBeTruthy();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 场景7:查看审核记录
|
|
|
+ * 角色:管理员
|
|
|
+ * 触发条件:切换到审核记录 tab
|
|
|
+ * 校验:记录加载正常
|
|
|
+ */
|
|
|
+ test('[场景7] 查看审核记录 — 期望加载正常', async ({ page }) => {
|
|
|
+ await page.goto('http://cfc.iwintrue.com/admin/review-center');
|
|
|
+ await page.waitForLoadState('networkidle');
|
|
|
+
|
|
|
+ // 切换到审核记录 tab
|
|
|
+ const recordTab = page.locator('.nav-item:has-text("审核记录"), .tab-item:has-text("记录")');
|
|
|
+ await recordTab.click();
|
|
|
+ await page.waitForTimeout(1000);
|
|
|
+
|
|
|
+ // 验证记录加载
|
|
|
+ const records = page.locator('.el-table__row, .review-record');
|
|
|
+ const recordCount = await records.count();
|
|
|
+ expect(recordCount).toBeGreaterThanOrEqual(0);
|
|
|
+
|
|
|
+ // 验证记录包含关键字段(类型/操作人/时间/状态)
|
|
|
+ if (recordCount > 0) {
|
|
|
+ const firstRecord = records.first();
|
|
|
+ const cells = firstRecord.locator('.el-table__cell');
|
|
|
+ expect(await cells.count()).toBeGreaterThanOrEqual(5);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 场景8:审核中心统计概览
|
|
|
+ * 角色:管理员
|
|
|
+ * 触发条件:进入审核中心首页
|
|
|
+ * 校验:统计数据加载正常
|
|
|
+ */
|
|
|
+ test('[场景8] 审核中心统计概览 — 期望数据加载', async ({ page }) => {
|
|
|
+ await page.goto('http://cfc.iwintrue.com/admin/review-center');
|
|
|
+ await page.waitForLoadState('networkidle');
|
|
|
+
|
|
|
+ // 验证统计卡片加载
|
|
|
+ const statCards = page.locator('.stat-card, .summary-card, .overview-card');
|
|
|
+ const cardCount = await statCards.count();
|
|
|
+ expect(cardCount).toBeGreaterThanOrEqual(3);
|
|
|
+
|
|
|
+ // 验证各类型待审核数量
|
|
|
+ const pendingCount = page.locator('.pending-count, .review-count');
|
|
|
+ expect(await pendingCount.isVisible()).toBeTruthy();
|
|
|
+ });
|
|
|
+});
|