Commit 6c31a476 authored by liguangyu06's avatar liguangyu06
Browse files

同步基础管理与统计报表用例文档,并更新 Playwright 脚本与 PO。

对齐 CSV/MD/测试点与现网列名及组合查询;补充厂商资质子 Tab 与基础模块复跑脚本。
parent aa8987ce
......@@ -26,187 +26,247 @@ async function smokeMockEmpty(po: VendorAuditPage): Promise<void> {
* 运行:npm run test:vendor-audit:all
*/
test.describe('基础设置 · 厂商管理', () => {
test.describe('授权变更初审 · 页面进入', () => {
test('VENDOR-AF1-001 菜单进入授权变更初审页', { tag: '@smoke' }, async ({ vendorAuthFirstPage }) => {
await smokeEnter(vendorAuthFirstPage);
});
});
test.describe('授权变更初审 · 筛选与列表', () => {
test('VENDOR-AF1-002 默认查询列表有数据或空态明确', { tag: '@smoke' }, async ({ vendorAuthFirstPage }) => {
await smokeQuery(vendorAuthFirstPage);
});
test('VENDOR-AF1-003 按单号筛选', async ({ vendorAuthFirstPage }) => {
await vendorAuthFirstPage.open();
await vendorAuthFirstPage.filterByOrderNo();
});
test('VENDOR-AF1-004 按进院供应商筛选', async ({ vendorAuthFirstPage }) => {
await vendorAuthFirstPage.open();
await vendorAuthFirstPage.filterBySupplierOrCert();
});
test('VENDOR-AF1-005 重置恢复默认', async ({ vendorAuthFirstPage }) => {
await vendorAuthFirstPage.open();
test('VENDOR-AF1-001 重置恢复默认', async ({ vendorAuthFirstPage }) => {
await vendorAuthFirstPage.open({ keepQueryDefaults: true });
await vendorAuthFirstPage.resetFilters();
});
test('VENDOR-AF1-006 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorAuthFirstPage }) => {
test('VENDOR-AF1-002 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorAuthFirstPage }) => {
await smokeMockEmpty(vendorAuthFirstPage);
});
test('VENDOR-AF1-008 制单日期起止同一天', async ({ vendorAuthFirstPage }) => {
test('VENDOR-AF1-004 筛选区展开与收起正常使用', async ({ vendorAuthFirstPage }) => {
await vendorAuthFirstPage.open();
await vendorAuthFirstPage.filterMakeDateSameDay();
await vendorAuthFirstPage.expectFilterExpandCollapseWorks();
});
test('VENDOR-AF1-010 多条件组合查询(制单日期等9项)', async ({ vendorAuthFirstPage }) => {
});
test.describe('授权变更初审 · 列设置', () => {
test.describe.configure({ mode: 'serial', timeout: 120_000 });
test.beforeEach(async ({ vendorAuthFirstPage }) => {
await vendorAuthFirstPage.open();
await vendorAuthFirstPage.filterCombination();
await vendorAuthFirstPage.query();
});
test('VENDOR-AF1-003 列设置取消勾选后再勾选列表列恢复', async ({ vendorAuthFirstPage }) => {
await vendorAuthFirstPage.executeColumnSettingsToggleRestoreTest();
});
});
test.describe('授权变更初审 · 详情', () => {
test('VENDOR-AF1-007 打开详情后返回', async ({ vendorAuthFirstPage }) => {
test('VENDOR-AF1-005 点击详情进入详情页后返回', async ({ vendorAuthFirstPage }) => {
await vendorAuthFirstPage.open();
await vendorAuthFirstPage.detailAndBack();
});
test('VENDOR-AF1-009 与终审单据衔接不串单', async ({ vendorAuthFirstPage, vendorAuthFinalPage }) => {
await vendorAuthFirstPage.open();
await vendorAuthFirstPage.expectPeerHandoff(vendorAuthFinalPage);
await vendorAuthFirstPage.openDetailAndBack();
});
});
test.describe('授权变更终审 · 页面进入', () => {
test('VENDOR-AF2-001 菜单进入授权变更终审页', { tag: '@smoke' }, async ({ vendorAuthFinalPage }) => {
await smokeEnter(vendorAuthFinalPage);
test.describe('授权变更初审 · 组合查询', () => {
test('VENDOR-AF1-006 首行九项组合查询', async ({ vendorAuthFirstPage }) => {
await vendorAuthFirstPage.open();
const sample = await vendorAuthFirstPage.queryFirstRowNineFieldCombo();
await assertListOrEmpty(await vendorAuthFirstPage.snapshotList(), '首行九项组合查询');
expect(
await vendorAuthFirstPage.rowsMatchKeyword('单号', sample.orderNo),
'结果行单号应含首行取值',
).toBeTruthy();
});
});
test.describe('授权变更终审 · 筛选与列表', () => {
test('VENDOR-AF2-002 默认查询列表有数据或空态明确', { tag: '@smoke' }, async ({ vendorAuthFinalPage }) => {
await smokeQuery(vendorAuthFinalPage);
test('VENDOR-AF2-001 重置恢复默认', async ({ vendorAuthFinalPage }) => {
await vendorAuthFinalPage.open({ keepQueryDefaults: true });
await vendorAuthFinalPage.resetFilters();
});
test('VENDOR-AF2-003 按单号筛选', async ({ vendorAuthFinalPage }) => {
await vendorAuthFinalPage.open();
await vendorAuthFinalPage.filterByOrderNo();
test('VENDOR-AF2-002 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorAuthFinalPage }) => {
await smokeMockEmpty(vendorAuthFinalPage);
});
test('VENDOR-AF2-004 按进院供应商筛选', async ({ vendorAuthFinalPage }) => {
test('VENDOR-AF2-003 筛选区展开与收起正常使用', async ({ vendorAuthFinalPage }) => {
await vendorAuthFinalPage.open();
await vendorAuthFinalPage.filterBySupplierOrCert();
await vendorAuthFinalPage.expectFilterExpandCollapseWorks();
});
test('VENDOR-AF2-005 重置恢复默认', async ({ vendorAuthFinalPage }) => {
test('VENDOR-AF2-007 分页翻至第 2 页', async ({ vendorAuthFinalPage }) => {
await vendorAuthFinalPage.open();
await vendorAuthFinalPage.resetFilters();
});
test('VENDOR-AF2-006 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorAuthFinalPage }) => {
await smokeMockEmpty(vendorAuthFinalPage);
await vendorAuthFinalPage.query();
await vendorAuthFinalPage.goToPage2();
const state = await vendorAuthFinalPage.snapshotList();
expect(state.rows, '第 2 页应有数据').toBeGreaterThan(0);
});
test('VENDOR-AF2-008 制单日期起止同一天', async ({ vendorAuthFinalPage }) => {
test('VENDOR-AF2-008 切换20条每页页面正常且列表同步', async ({ vendorAuthFinalPage }) => {
await vendorAuthFinalPage.open();
await vendorAuthFinalPage.filterMakeDateSameDay();
await vendorAuthFinalPage.query();
const { total, rowsBefore, rowsAfter, pageSizeLabel } = await vendorAuthFinalPage.switchToSmallerPageSize();
const sizeNum = Number((pageSizeLabel.match(/\d+/) ?? ['20'])[0]);
const expectedRows = Math.min(total, sizeNum);
expect(rowsAfter, `当前页行数应与 ${pageSizeLabel} 及总条数一致`).toBe(expectedRows);
if (total > sizeNum) {
expect(rowsAfter, '切换后可见行应随每页条数变化').toBeLessThan(rowsBefore);
}
expect(await vendorAuthFinalPage.getTotalCount(), '总条数应不变').toBe(total);
await expect(vendorAuthFinalPage.pageSizeChanger(), '每页条数').toContainText(new RegExp(String(sizeNum)));
});
test('VENDOR-AF2-010 多条件组合查询(制单日期等7项)', async ({ vendorAuthFinalPage }) => {
});
test.describe('授权变更终审 · 列设置', () => {
test.describe.configure({ mode: 'serial', timeout: 120_000 });
test.beforeEach(async ({ vendorAuthFinalPage }) => {
await vendorAuthFinalPage.open();
await vendorAuthFinalPage.filterCombination();
await vendorAuthFinalPage.query();
});
test('VENDOR-AF2-004 列设置取消勾选后再勾选列表列恢复', async ({ vendorAuthFinalPage }) => {
await vendorAuthFinalPage.executeColumnSettingsToggleRestoreTest();
});
});
test.describe('授权变更终审 · 详情', () => {
test('VENDOR-AF2-007 打开详情后返回', async ({ vendorAuthFinalPage }) => {
await vendorAuthFinalPage.open();
await vendorAuthFinalPage.detailAndBack();
});
test('VENDOR-AF2-009 与初审单据衔接不串单', async ({ vendorAuthFinalPage, vendorAuthFirstPage }) => {
test('VENDOR-AF2-005 点击详情进入详情页后返回', async ({ vendorAuthFinalPage }) => {
await vendorAuthFinalPage.open();
await vendorAuthFinalPage.expectPeerHandoff(vendorAuthFirstPage);
await vendorAuthFinalPage.openDetailAndBack();
});
});
test.describe('注册证变更初审 · 页面进入', () => {
test('VENDOR-CF1-001 菜单进入注册证变更初审页', { tag: '@smoke' }, async ({ vendorCertFirstPage }) => {
await smokeEnter(vendorCertFirstPage);
test.describe('授权变更终审 · 组合查询', () => {
test('VENDOR-AF2-006 首行七项组合查询', async ({ vendorAuthFinalPage }) => {
await vendorAuthFinalPage.open();
const sample = await vendorAuthFinalPage.queryFirstRowSevenFieldCombo();
await assertListOrEmpty(await vendorAuthFinalPage.snapshotList(), '首行七项组合查询');
expect(
await vendorAuthFinalPage.rowsMatchKeyword('单号', sample.orderNo),
'结果行单号应含首行取值',
).toBeTruthy();
});
});
test.describe('注册证变更初审 · 筛选与列表', () => {
test('VENDOR-CF1-002 默认查询列表有数据或空态明确', { tag: '@smoke' }, async ({ vendorCertFirstPage }) => {
await smokeQuery(vendorCertFirstPage);
test('VENDOR-CF1-001 重置恢复默认', async ({ vendorCertFirstPage }) => {
await vendorCertFirstPage.open({ keepQueryDefaults: true });
await vendorCertFirstPage.resetFilters();
});
test('VENDOR-CF1-003 按单号筛选', async ({ vendorCertFirstPage }) => {
await vendorCertFirstPage.open();
await vendorCertFirstPage.filterByOrderNo();
test('VENDOR-CF1-002 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorCertFirstPage }) => {
await smokeMockEmpty(vendorCertFirstPage);
});
test('VENDOR-CF1-004 按注册证号(新)筛选', async ({ vendorCertFirstPage }) => {
test('VENDOR-CF1-004 筛选区展开与收起正常使用', async ({ vendorCertFirstPage }) => {
await vendorCertFirstPage.open();
await vendorCertFirstPage.filterBySupplierOrCert();
await vendorCertFirstPage.expectFilterExpandCollapseWorks();
});
test('VENDOR-CF1-005 重置恢复默认', async ({ vendorCertFirstPage }) => {
test('VENDOR-CF1-006 分页翻至第 2 页', async ({ vendorCertFirstPage }) => {
await vendorCertFirstPage.open();
await vendorCertFirstPage.resetFilters();
});
test('VENDOR-CF1-006 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorCertFirstPage }) => {
await smokeMockEmpty(vendorCertFirstPage);
await vendorCertFirstPage.query();
await vendorCertFirstPage.goToPage2();
const state = await vendorCertFirstPage.snapshotList();
expect(state.rows, '第 2 页应有数据').toBeGreaterThan(0);
});
test('VENDOR-CF1-008 制单日期起止同一天', async ({ vendorCertFirstPage }) => {
test('VENDOR-CF1-007 切换20条每页页面正常且列表同步', async ({ vendorCertFirstPage }) => {
await vendorCertFirstPage.open();
await vendorCertFirstPage.filterMakeDateSameDay();
await vendorCertFirstPage.query();
const { total, rowsBefore, rowsAfter, pageSizeLabel } = await vendorCertFirstPage.switchToSmallerPageSize();
const sizeNum = Number((pageSizeLabel.match(/\d+/) ?? ['20'])[0]);
const expectedRows = Math.min(total, sizeNum);
expect(rowsAfter, `当前页行数应与 ${pageSizeLabel} 及总条数一致`).toBe(expectedRows);
if (total > sizeNum) {
expect(rowsAfter, '切换后可见行应随每页条数变化').toBeLessThan(rowsBefore);
}
expect(await vendorCertFirstPage.getTotalCount(), '总条数应不变').toBe(total);
await expect(vendorCertFirstPage.pageSizeChanger(), '每页条数').toContainText(new RegExp(String(sizeNum)));
});
test('VENDOR-CF1-010 多条件组合查询(制单日期等6项)', async ({ vendorCertFirstPage }) => {
});
test.describe('注册证变更初审 · 列设置', () => {
test.describe.configure({ mode: 'serial', timeout: 120_000 });
test.beforeEach(async ({ vendorCertFirstPage }) => {
await vendorCertFirstPage.open();
await vendorCertFirstPage.filterCombination();
await vendorCertFirstPage.query();
});
test('VENDOR-CF1-003 列设置取消勾选后再勾选列表列恢复', async ({ vendorCertFirstPage }) => {
await vendorCertFirstPage.executeColumnSettingsToggleRestoreTest();
});
});
test.describe('注册证变更初审 · 详情', () => {
test('VENDOR-CF1-007 打开详情后返回', async ({ vendorCertFirstPage }) => {
await vendorCertFirstPage.open();
await vendorCertFirstPage.detailAndBack();
});
test('VENDOR-CF1-009 与终审单据衔接不串单', async ({ vendorCertFirstPage, vendorCertFinalPage }) => {
test('VENDOR-CF1-005 点击详情进入详情页后返回', async ({ vendorCertFirstPage }) => {
await vendorCertFirstPage.open();
await vendorCertFirstPage.expectPeerHandoff(vendorCertFinalPage);
await vendorCertFirstPage.openDetailAndBack();
});
});
test.describe('注册证变更终审 · 页面进入', () => {
test('VENDOR-CF2-001 菜单进入注册证变更终审页', { tag: '@smoke' }, async ({ vendorCertFinalPage }) => {
await smokeEnter(vendorCertFinalPage);
test.describe('注册证变更初审 · 组合查询', () => {
test('VENDOR-CF1-008 首行六项组合查询', async ({ vendorCertFirstPage }) => {
await vendorCertFirstPage.open();
const sample = await vendorCertFirstPage.queryFirstRowSixFieldCombo();
await assertListOrEmpty(await vendorCertFirstPage.snapshotList(), '首行六项组合查询');
expect(
await vendorCertFirstPage.rowsMatchKeyword('单号', sample.orderNo),
'结果行单号应含首行取值',
).toBeTruthy();
});
});
test.describe('注册证变更终审 · 筛选与列表', () => {
test('VENDOR-CF2-002 默认查询列表有数据或空态明确', { tag: '@smoke' }, async ({ vendorCertFinalPage }) => {
await smokeQuery(vendorCertFinalPage);
test('VENDOR-CF2-001 重置恢复默认', async ({ vendorCertFinalPage }) => {
await vendorCertFinalPage.open({ keepQueryDefaults: true });
await vendorCertFinalPage.resetFilters();
});
test('VENDOR-CF2-003 按单号筛选', async ({ vendorCertFinalPage }) => {
await vendorCertFinalPage.open();
await vendorCertFinalPage.filterByOrderNo();
test('VENDOR-CF2-002 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorCertFinalPage }) => {
await smokeMockEmpty(vendorCertFinalPage);
});
test('VENDOR-CF2-004 按注册证号(新)筛选', async ({ vendorCertFinalPage }) => {
test('VENDOR-CF2-004 筛选区展开与收起正常使用', async ({ vendorCertFinalPage }) => {
await vendorCertFinalPage.open();
await vendorCertFinalPage.filterBySupplierOrCert();
await vendorCertFinalPage.expectFilterExpandCollapseWorks();
});
test('VENDOR-CF2-005 重置恢复默认', async ({ vendorCertFinalPage }) => {
test('VENDOR-CF2-006 分页翻至第 2 页', async ({ vendorCertFinalPage }) => {
await vendorCertFinalPage.open();
await vendorCertFinalPage.resetFilters();
});
test('VENDOR-CF2-006 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorCertFinalPage }) => {
await smokeMockEmpty(vendorCertFinalPage);
await vendorCertFinalPage.query();
await vendorCertFinalPage.goToPage2();
const state = await vendorCertFinalPage.snapshotList();
expect(state.rows, '第 2 页应有数据').toBeGreaterThan(0);
});
test('VENDOR-CF2-008 制单日期起止同一天', async ({ vendorCertFinalPage }) => {
test('VENDOR-CF2-007 切换20条每页页面正常且列表同步', async ({ vendorCertFinalPage }) => {
await vendorCertFinalPage.open();
await vendorCertFinalPage.filterMakeDateSameDay();
await vendorCertFinalPage.query();
const { total, rowsBefore, rowsAfter, pageSizeLabel } = await vendorCertFinalPage.switchToSmallerPageSize();
const sizeNum = Number((pageSizeLabel.match(/\d+/) ?? ['20'])[0]);
const expectedRows = Math.min(total, sizeNum);
expect(rowsAfter, `当前页行数应与 ${pageSizeLabel} 及总条数一致`).toBe(expectedRows);
if (total > sizeNum) {
expect(rowsAfter, '切换后可见行应随每页条数变化').toBeLessThan(rowsBefore);
}
expect(await vendorCertFinalPage.getTotalCount(), '总条数应不变').toBe(total);
await expect(vendorCertFinalPage.pageSizeChanger(), '每页条数').toContainText(new RegExp(String(sizeNum)));
});
test('VENDOR-CF2-010 多条件组合查询(制单日期等5项)', async ({ vendorCertFinalPage }) => {
});
test.describe('注册证变更终审 · 列设置', () => {
test.describe.configure({ mode: 'serial', timeout: 120_000 });
test.beforeEach(async ({ vendorCertFinalPage }) => {
await vendorCertFinalPage.open();
await vendorCertFinalPage.filterCombination();
await vendorCertFinalPage.query();
});
test('VENDOR-CF2-003 列设置取消勾选后再勾选列表列恢复', async ({ vendorCertFinalPage }) => {
await vendorCertFinalPage.executeColumnSettingsToggleRestoreTest();
});
});
test.describe('注册证变更终审 · 详情', () => {
test('VENDOR-CF2-007 打开详情后返回', async ({ vendorCertFinalPage }) => {
test('VENDOR-CF2-005 点击详情进入详情页后返回', async ({ vendorCertFinalPage }) => {
await vendorCertFinalPage.open();
await vendorCertFinalPage.detailAndBack();
await vendorCertFinalPage.openDetailAndBack();
});
test('VENDOR-CF2-009 与初审单据衔接不串单', async ({ vendorCertFinalPage, vendorCertFirstPage }) => {
});
test.describe('注册证变更终审 · 组合查询', () => {
test('VENDOR-CF2-008 首行六项组合查询', async ({ vendorCertFinalPage }) => {
await vendorCertFinalPage.open();
await vendorCertFinalPage.expectPeerHandoff(vendorCertFirstPage);
const sample = await vendorCertFinalPage.queryFirstRowSixFieldCombo();
await assertListOrEmpty(await vendorCertFinalPage.snapshotList(), '首行六项组合查询');
expect(
await vendorCertFinalPage.rowsMatchKeyword('单号', sample.orderNo),
'结果行单号应含首行取值',
).toBeTruthy();
});
});
});
import { test } from '../../fixtures';
import { expect, test } from '../../fixtures';
import type { VendorCertDiffPage } from '../../pages/spd/vendor-cert-diff.page';
import { assertListOrEmpty, assertMockEmpty } from './helpers/vendor-assert.helper';
async function smokeMockEmpty(po: VendorCertDiffPage): Promise<void> {
await po.open();
await po.mockEmpty();
await assertMockEmpty(await po.snapshotList());
}
/**
* 全量用例:与 testcase/基础管理-厂商管理-注册证差异对比-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:vendor-cert-diff:all
*/
test.describe('基础设置 · 厂商管理', () => {
test.describe('注册证差异对比 · 页面进入', () => {
test('VENDOR-CDF-001 菜单进入注册证差异对比页', { tag: '@smoke' }, async ({ vendorCertDiffPage }) => {
test.describe('注册证差异对比 · 筛选与列表', () => {
test('VENDOR-CDF-001 重置恢复默认', async ({ vendorCertDiffPage }) => {
test.setTimeout(120_000);
await vendorCertDiffPage.openFromMenu();
await vendorCertDiffPage.expectEntered();
await vendorCertDiffPage.open({ keepQueryDefaults: true });
await vendorCertDiffPage.resetFilters();
});
});
test.describe('注册证差异对比 · 筛选与对比', () => {
test('VENDOR-CDF-002 默认查询列表有数据或空态明确', { tag: '@smoke' }, async ({ vendorCertDiffPage }) => {
test('VENDOR-CDF-002 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorCertDiffPage }) => {
test.setTimeout(120_000);
await vendorCertDiffPage.open();
await vendorCertDiffPage.queryDefault();
await smokeMockEmpty(vendorCertDiffPage);
});
test('VENDOR-CDF-003 切换不一致 Tab', async ({ vendorCertDiffPage }) => {
test('VENDOR-CDF-004 筛选区展开与收起正常使用', async ({ vendorCertDiffPage }) => {
test.setTimeout(120_000);
await vendorCertDiffPage.open();
await vendorCertDiffPage.switchInconsistent();
await vendorCertDiffPage.expectFilterExpandCollapseWorks();
});
test('VENDOR-CDF-004 切换一致 Tab', async ({ vendorCertDiffPage }) => {
test('VENDOR-CDF-006 分页翻至第 2 页', async ({ vendorCertDiffPage }) => {
test.setTimeout(120_000);
await vendorCertDiffPage.open();
await vendorCertDiffPage.switchConsistent();
await vendorCertDiffPage.query();
await vendorCertDiffPage.goToPage2();
const state = await vendorCertDiffPage.snapshotList();
expect(state.rows, '第 2 页应有数据').toBeGreaterThan(0);
});
test('VENDOR-CDF-005 按物料名称筛选', async ({ vendorCertDiffPage }) => {
test.setTimeout(120_000);
await vendorCertDiffPage.open();
await vendorCertDiffPage.filterByMaterialSample();
});
test('VENDOR-CDF-006 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorCertDiffPage }) => {
test('VENDOR-CDF-007 切换20条每页页面正常且列表同步', async ({ vendorCertDiffPage }) => {
test.setTimeout(120_000);
await vendorCertDiffPage.open();
await vendorCertDiffPage.mockEmpty();
await vendorCertDiffPage.query();
const { total, rowsBefore, rowsAfter, pageSizeLabel } = await vendorCertDiffPage.switchToSmallerPageSize();
const sizeNum = Number((pageSizeLabel.match(/\d+/) ?? ['20'])[0]);
const expectedRows = Math.min(total, sizeNum);
expect(rowsAfter, `当前页行数应与 ${pageSizeLabel} 及总条数一致`).toBe(expectedRows);
if (total > sizeNum) {
expect(rowsAfter, '切换后可见行应随每页条数变化').toBeLessThan(rowsBefore);
}
expect(await vendorCertDiffPage.getTotalCount(), '总条数应不变').toBe(total);
await expect(vendorCertDiffPage.pageSizeChanger(), '每页条数').toContainText(new RegExp(String(sizeNum)));
});
});
test('VENDOR-CDF-007 列表核心列完整', async ({ vendorCertDiffPage }) => {
test.setTimeout(120_000);
await vendorCertDiffPage.open();
await vendorCertDiffPage.expectCoreColumns();
});
test.describe('注册证差异对比 · 列设置', () => {
test.describe.configure({ mode: 'serial', timeout: 120_000 });
test('VENDOR-CDF-009 仅空格物料名称搜索', async ({ vendorCertDiffPage }) => {
test.setTimeout(120_000);
test.beforeEach(async ({ vendorCertDiffPage }) => {
await vendorCertDiffPage.open();
await vendorCertDiffPage.searchSpacesOnly();
await vendorCertDiffPage.query();
});
test('VENDOR-CDF-010 一致行两侧字段抽样一致', async ({ vendorCertDiffPage }) => {
test.setTimeout(120_000);
await vendorCertDiffPage.open();
await vendorCertDiffPage.expectConsistentRowAligned();
test('VENDOR-CDF-003 列设置取消勾选后再勾选列表列恢复', async ({ vendorCertDiffPage }) => {
await vendorCertDiffPage.executeColumnSettingsToggleRestoreTest();
});
});
test('VENDOR-CDF-011 不一致行至少一侧差异', async ({ vendorCertDiffPage }) => {
test.describe('注册证差异对比 · 详情', () => {
test('VENDOR-CDF-005 点击详情进入详情页后返回', async ({ vendorCertDiffPage }) => {
test.setTimeout(120_000);
await vendorCertDiffPage.open();
await vendorCertDiffPage.expectInconsistentRowDiffers();
});
test('VENDOR-CDF-012 多条件组合查询(物料名称等8项)', async ({ vendorCertDiffPage }) => {
await vendorCertDiffPage.open();
await vendorCertDiffPage.filterCombination();
await vendorCertDiffPage.openDetailAndBack();
});
});
test.describe('注册证差异对比 · 导出', () => {
test('VENDOR-CDF-008 导出按钮可见', async ({ vendorCertDiffPage }) => {
test.describe('注册证差异对比 · 组合查询', () => {
test('VENDOR-CDF-008 首行八项组合查询', async ({ vendorCertDiffPage }) => {
test.setTimeout(120_000);
await vendorCertDiffPage.open();
await vendorCertDiffPage.expectExportVisible();
const sample = await vendorCertDiffPage.queryFirstRowEightFieldCombo();
await assertListOrEmpty(await vendorCertDiffPage.snapshotList(), '首行八项组合查询');
expect(
await vendorCertDiffPage.rowsMatchKeyword('物料名称', sample.materialName),
'结果行物料名称应含首行取值',
).toBeTruthy();
});
});
});
import { test } from '../../fixtures';
import { expect, test } from '../../fixtures';
import { assertListOrEmpty } from './helpers/vendor-assert.helper';
/**
* 全量用例:与 testcase/基础管理-厂商管理-评价指标维护-UI自动化测试用例-01.csv 严格一致
* 与 testcase/基础管理-厂商管理-评价指标维护-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:vendor-eval-indicator:all
*/
test.describe('基础设置 · 厂商管理', () => {
test.describe('评价指标维护 · 页面进入', () => {
test('VENDOR-EVI-001 菜单进入评价指标维护页', { tag: '@smoke' }, async ({ vendorEvalIndicatorPage }) => {
await vendorEvalIndicatorPage.openFromMenu();
await vendorEvalIndicatorPage.expectEntered();
});
});
test.describe('评价指标维护 · 树与列表', () => {
test('VENDOR-EVI-002 默认查询列表有数据或空态明确', { tag: '@smoke' }, async ({ vendorEvalIndicatorPage }) => {
test('VENDOR-EVI-001 点击左侧分类可正常展开', { tag: '@smoke' }, async ({ vendorEvalIndicatorPage }) => {
await vendorEvalIndicatorPage.open();
await vendorEvalIndicatorPage.queryDefault();
await vendorEvalIndicatorPage.expandLeftCategory();
});
test('VENDOR-EVI-003 点击左侧分类树', async ({ vendorEvalIndicatorPage }) => {
test('VENDOR-EVI-002 切换左侧不同分类右侧内容同步变化', async ({ vendorEvalIndicatorPage }) => {
await vendorEvalIndicatorPage.open();
await vendorEvalIndicatorPage.clickFirstTreeNode();
await vendorEvalIndicatorPage.switchCategoriesRightContentSyncs();
});
test('VENDOR-EVI-004 按指标编码筛选', async ({ vendorEvalIndicatorPage }) => {
test('VENDOR-EVI-003 选中左侧分类首行同步分类名称查询条件', async ({ vendorEvalIndicatorPage }) => {
await vendorEvalIndicatorPage.open();
await vendorEvalIndicatorPage.filterByIndicatorCode();
await vendorEvalIndicatorPage.selectFirstCategoryAndExpectCategoryNameFilter();
});
});
test.describe('评价指标维护 · 指标一级分类右侧列表', () => {
test.describe.configure({ timeout: 120_000 });
test('VENDOR-EVI-005 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorEvalIndicatorPage }) => {
test.beforeEach(async ({ vendorEvalIndicatorPage }) => {
await vendorEvalIndicatorPage.open();
await vendorEvalIndicatorPage.mockEmpty();
await vendorEvalIndicatorPage.prepareLevel1CategoryRightList();
});
test('VENDOR-EVI-006 列表核心列完整', async ({ vendorEvalIndicatorPage }) => {
await vendorEvalIndicatorPage.open();
await vendorEvalIndicatorPage.expectCoreColumns();
test('VENDOR-EVI-004 指标编号指标名称状态列可排序', async ({ vendorEvalIndicatorPage }) => {
await vendorEvalIndicatorPage.expectSortableColumnsUnderLevel1();
});
test('VENDOR-EVI-008 启用指标可供方案使用', async ({ vendorEvalIndicatorPage, vendorEvalSchemePage }) => {
await vendorEvalIndicatorPage.open();
await vendorEvalIndicatorPage.expectEnabledUsableInScheme(vendorEvalSchemePage);
test('VENDOR-EVI-005 首行指标编码与指标名称组合查询', async ({ vendorEvalIndicatorPage }) => {
const sample = await vendorEvalIndicatorPage.queryFirstRowCodeAndNameCombo();
await assertListOrEmpty(await vendorEvalIndicatorPage.snapshotList(), '指标编码与指标名称组合查询');
expect(
await vendorEvalIndicatorPage.rowsMatchKeyword(sample.codeColumn, sample.code),
`结果行${sample.codeColumn}应含首行取值`,
).toBeTruthy();
expect(
await vendorEvalIndicatorPage.rowsMatchKeyword('指标名称', sample.name),
'结果行指标名称应含首行取值',
).toBeTruthy();
});
test('VENDOR-EVI-009 多条件组合查询(指标编码等2项)', async ({ vendorEvalIndicatorPage }) => {
await vendorEvalIndicatorPage.open();
await vendorEvalIndicatorPage.filterCombination();
test('VENDOR-EVI-006 重置清空指标编码与指标名称筛选', async ({ vendorEvalIndicatorPage }) => {
await vendorEvalIndicatorPage.expectResetClearsCodeAndNameFilters();
});
});
test.describe('评价指标维护 · 详情', () => {
test('VENDOR-EVI-007 打开详情后返回', async ({ vendorEvalIndicatorPage }) => {
await vendorEvalIndicatorPage.open();
await vendorEvalIndicatorPage.openDetailAndBack();
test('VENDOR-EVI-007 列设置取消勾选后再勾选列表列恢复', async ({ vendorEvalIndicatorPage }) => {
await vendorEvalIndicatorPage.executeColumnSettingsToggleRestoreTest();
});
});
});
import { vendorEvalSchemeData } from '../../data/vendor-eval-scheme.data';
import { expect, test } from '../../fixtures';
import { assertListOrEmpty, assertMockEmpty } from './helpers/vendor-assert.helper';
import { assertListOrEmpty } from './helpers/vendor-assert.helper';
/**
* 全量用例:与 testcase/基础管理-厂商管理-评价方案维护-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:vendor-eval-scheme:all
*/
test.describe('基础设置 · 厂商管理', () => {
test.describe('评价方案维护 · 页面进入', () => {
test('VENDOR-EVS-001 菜单进入评价方案维护页', { tag: '@smoke' }, async ({ vendorEvalSchemePage }) => {
test.describe('评价方案维护 · 筛选与维护', () => {
test('VENDOR-EVS-001 默认创建日期区间内首行四字段组合查询', { tag: '@smoke' }, async ({
vendorEvalSchemePage,
}) => {
await vendorEvalSchemePage.openFromMenu();
await vendorEvalSchemePage.expectOnPage();
await expect(vendorEvalSchemePage.button('查询').first(), '查询').toBeVisible();
await expect(vendorEvalSchemePage.button('新增').first(), '新增').toBeVisible();
expect(vendorEvalSchemePage.browserPage.url()).toContain('evaluationPlan');
});
});
test.describe('评价方案维护 · 筛选与维护', () => {
test('VENDOR-EVS-002 默认查询列表有数据或空态明确', { tag: '@smoke' }, async ({ vendorEvalSchemePage }) => {
await vendorEvalSchemePage.open();
await vendorEvalSchemePage.query();
await assertListOrEmpty(await vendorEvalSchemePage.snapshotList());
const sample = await vendorEvalSchemePage.queryWithFirstRowFourFieldCombo();
await assertListOrEmpty(await vendorEvalSchemePage.snapshotList(), '首行四字段组合查询');
expect(
await vendorEvalSchemePage.rowsMatchKeyword('方案编码', sample.schemeCode),
'结果行方案编码应含首行取值',
).toBeTruthy();
expect(
await vendorEvalSchemePage.rowsMatchKeyword('方案名称', sample.schemeName),
'结果行方案名称应含首行取值',
).toBeTruthy();
});
test('VENDOR-EVS-003 按方案编码筛选', async ({ vendorEvalSchemePage }) => {
test('VENDOR-EVS-014 筛选区展开与收起正常使用', async ({ vendorEvalSchemePage }) => {
await vendorEvalSchemePage.open();
await vendorEvalSchemePage.filterBySchemeCode();
await assertListOrEmpty(await vendorEvalSchemePage.snapshotList(), '方案编码筛选');
await vendorEvalSchemePage.expectFilterExpandCollapseWorks();
});
});
test('VENDOR-EVS-004 重置恢复默认', async ({ vendorEvalSchemePage }) => {
await vendorEvalSchemePage.open();
await vendorEvalSchemePage.resetFilters();
await assertListOrEmpty(await vendorEvalSchemePage.snapshotList(), '重置后');
});
test.describe('评价方案维护 · 列设置', () => {
test.describe.configure({ mode: 'serial', timeout: 120_000 });
test('VENDOR-EVS-005 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorEvalSchemePage }) => {
test.beforeEach(async ({ vendorEvalSchemePage }) => {
await vendorEvalSchemePage.open();
await vendorEvalSchemePage.mockEmpty();
await assertMockEmpty(await vendorEvalSchemePage.snapshotList());
await vendorEvalSchemePage.prepareListForColumnSettings();
});
test('VENDOR-EVS-006 列表核心列完整', async ({ vendorEvalSchemePage }) => {
await vendorEvalSchemePage.open();
await vendorEvalSchemePage.query();
const headers = await vendorEvalSchemePage.headerTexts();
for (const name of ['方案编码', '方案名称', '创建人', '创建时间', '状态', '操作']) {
expect(headers.join(' '), `表头应含「${name}」`).toContain(name.replace(/\s/g, ''));
}
test('VENDOR-EVS-002 打开列设置面板', async ({ vendorEvalSchemePage }) => {
await vendorEvalSchemePage.openColumnSettings();
await vendorEvalSchemePage.expectColumnSettingsPanel();
await vendorEvalSchemePage.closeColumnSettingsPanel();
});
test('VENDOR-EVS-009 方案与评价指标可关联', async ({ vendorEvalSchemePage }) => {
await vendorEvalSchemePage.open();
await vendorEvalSchemePage.expectIndicatorLinkable();
});
test('VENDOR-EVS-010 多条件组合查询(创建日期等4项)', async ({ vendorEvalSchemePage }) => {
await vendorEvalSchemePage.open();
await vendorEvalSchemePage.filterCombination();
test('VENDOR-EVS-003 列设置取消勾选后再勾选列表列恢复', async ({ vendorEvalSchemePage }) => {
await vendorEvalSchemePage.executeColumnSettingsToggleRestoreTest();
});
});
test.describe('评价方案维护 · 新增', () => {
test('VENDOR-EVS-007 打开新增后取消', async ({ vendorEvalSchemePage }) => {
await vendorEvalSchemePage.open();
await vendorEvalSchemePage.openAddAndCancel();
await assertListOrEmpty(await vendorEvalSchemePage.snapshotList(), '取消新增后');
});
test.describe('评价方案维护 · 列表排序', () => {
test.describe.configure({ timeout: 120_000 });
test('VENDOR-EVS-008 必填为空提交拦截', async ({ vendorEvalSchemePage }) => {
test.beforeEach(async ({ vendorEvalSchemePage }) => {
await vendorEvalSchemePage.open();
await vendorEvalSchemePage.emptyRequiredBlocked();
await vendorEvalSchemePage.prepareListForColumnSettings();
});
for (const { id, column } of vendorEvalSchemeData.sortColumnCases) {
test(`${id} ${column}列升序降序切换`, async ({ vendorEvalSchemePage }) => {
await vendorEvalSchemePage.expectColumnSortCase(column);
});
}
});
});
......@@ -5,27 +5,14 @@ import { expect, test } from '../../fixtures';
* 运行:npm run test:vendor-holiday:all
*/
test.describe('基础设置 · 厂商管理', () => {
test.describe('供应商节假日管理 · 页面进入', () => {
test('VENDOR-HLD-001 菜单进入供应商节假日管理页', { tag: '@smoke' }, async ({ vendorHolidayPage }) => {
await vendorHolidayPage.openFromMenu();
await vendorHolidayPage.expectOnPage();
await expect(
vendorHolidayPage.browserPage.getByText(/供应商节假日|默认假日|节假日设置/).first(),
'节假日主区',
).toBeVisible({ timeout: 15_000 });
await expect(vendorHolidayPage.button('新增').first(), '新增').toBeVisible();
expect(vendorHolidayPage.browserPage.url()).toContain('prov/holiday');
});
});
test.describe('供应商节假日管理 · 左右分栏', () => {
test('VENDOR-HLD-002 选中左侧节假日展示详情', { tag: '@smoke' }, async ({ vendorHolidayPage }) => {
test('VENDOR-HLD-001 选中左侧节假日展示详情', { tag: '@smoke' }, async ({ vendorHolidayPage }) => {
await vendorHolidayPage.open();
await vendorHolidayPage.selectFirstHoliday();
await expect(vendorHolidayPage.browserPage.getByText(/默认假日详情|供应商自定义/).first()).toBeVisible();
});
test('VENDOR-HLD-003 左侧搜索无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorHolidayPage }) => {
test('VENDOR-HLD-002 左侧搜索无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorHolidayPage }) => {
await vendorHolidayPage.open();
await vendorHolidayPage.mockEmptyLeft();
const rows = vendorHolidayPage.browserPage.locator(
......@@ -36,25 +23,53 @@ test.describe('基础设置 · 厂商管理', () => {
expect(count === 0 || empty, '左侧无匹配应空态').toBeTruthy();
});
test('VENDOR-HLD-005 自定义节假日列表区可见', async ({ vendorHolidayPage }) => {
test('VENDOR-HLD-006 切换列表行右侧详情名称年度一致', { tag: '@smoke' }, async ({ vendorHolidayPage }) => {
await vendorHolidayPage.open();
await vendorHolidayPage.selectFirstHoliday();
await expect(vendorHolidayPage.browserPage.getByText('供应商自定义节假日列表').first()).toBeVisible();
await vendorHolidayPage.expectSwitchRowsDetailSync();
});
test('VENDOR-HLD-006 进院供应商主数据一致', async ({ vendorHolidayPage }) => {
test('VENDOR-HLD-005 首行名称或年度搜索验证', { tag: '@smoke' }, async ({ vendorHolidayPage }) => {
await vendorHolidayPage.open();
await vendorHolidayPage.expectSupplierMatchesMaster();
const { keyword, field } = await vendorHolidayPage.searchLeftByFirstRowSample();
expect(
await vendorHolidayPage.leftRowsMatchKeyword(field, keyword),
`左侧列表「${field}」应匹配关键字`,
).toBeTruthy();
});
});
test.describe('供应商节假日管理 · 维护', () => {
test('VENDOR-HLD-004 左侧新增取消', async ({ vendorHolidayPage }) => {
test('VENDOR-HLD-003 点击左侧新增弹出新增弹框', { tag: '@smoke' }, async ({ vendorHolidayPage }) => {
await vendorHolidayPage.open();
const dialog = await vendorHolidayPage.openLeftAddDialog();
await expect(dialog, '应为新增表单层').toContainText(/新增|假日|节假日/);
await vendorHolidayPage.leaveWithoutCommit();
await vendorHolidayPage.expectOnPage();
});
test('VENDOR-HLD-004 选中首行点击编辑弹出编辑弹框', { tag: '@smoke' }, async ({ vendorHolidayPage }) => {
await vendorHolidayPage.open();
await vendorHolidayPage.openLeftAddAndCancel();
expect(vendorHolidayPage.browserPage.url()).toContain('prov/holiday');
const dialog = await vendorHolidayPage.openLeftEditDialogFromFirstRow();
await expect(dialog, '应为编辑表单层').toContainText(/编辑|假日|节假日/);
await vendorHolidayPage.leaveWithoutCommit();
await vendorHolidayPage.expectOnPage();
});
});
test('VENDOR-HLD-007 默认假日详情区点击右侧新增弹出弹框', { tag: '@smoke' }, async ({ vendorHolidayPage }) => {
await vendorHolidayPage.open();
const dialog = await vendorHolidayPage.openRightAddDialogWithDefaultDetail();
await expect(dialog, '应为新增表单层').toContainText(/新增|假日|节假日|供应商/);
await vendorHolidayPage.leaveWithoutCommit();
await vendorHolidayPage.expectOnPage();
});
});
test.describe('供应商节假日管理 · 列设置', () => {
test('VENDOR-HLD-008 右侧自定义列表打开列设置面板', async ({ vendorHolidayPage }) => {
await vendorHolidayPage.open();
await vendorHolidayPage.openRightColumnSettings();
await vendorHolidayPage.expectRightColumnSettingsPanel();
await vendorHolidayPage.closeRightColumnSettingsPanel();
});
});
});
import { test } from '../../fixtures';
import { vendorQualColumnSettingsOtherTabs } from '../../data/vendor-qual-column-settings-cases';
/**
* 各主 Tab 列设置(CSV VENDOR-QUL-058~073;证件效期提醒 QUL-005/006 见 vendor-qual.spec.ts)。
*/
for (const { tab, openCaseId, toggleCaseId } of vendorQualColumnSettingsOtherTabs) {
test.describe(`供应商资质管理 · ${tab} · 列设置`, () => {
test.describe.configure({ mode: 'serial', timeout: 120_000 });
test.beforeEach(async ({ vendorQualPage }) => {
await vendorQualPage.openOnMainTab(tab);
await vendorQualPage.query();
});
test(`${openCaseId} ${tab}·打开列设置面板`, async ({ vendorQualPage }) => {
await vendorQualPage.openColumnSettings();
await vendorQualPage.expectColumnSettingsPanel();
await vendorQualPage.closeColumnSettingsPanel();
});
test(`${toggleCaseId} ${tab}·列设置取消勾选后再勾选列表列恢复`, async ({ vendorQualPage }) => {
await vendorQualPage.executeColumnSettingsToggleRestoreTest();
});
});
}
import { expect, test } from '../../fixtures';
import { listSubTabTitleSummary } from '../../data/vendor-qual-subtabs.data';
import {
vendorQualComboTestLabel,
vendorQualResetTestLabel,
vendorQualSyncTabs,
} from '../../data/vendor-qual-tab-cases';
function expectDetailSupplierMatchesList(listSupplier: string, detailSupplier: string): void {
const listNorm = listSupplier.replace(/\s/g, '');
const detailNorm = detailSupplier.replace(/\s/g, '');
expect(detailNorm.length, '详情应展示销售商(自定义)').toBeGreaterThan(0);
expect(
detailNorm.includes(listNorm) || listNorm.includes(detailNorm),
'详情销售商(自定义)应与列表首行一致',
).toBeTruthy();
}
/**
* 与 testcase/…供应商资质管理-UI自动化测试用例-01.csv 中 VENDOR-QUL-010 起各主 Tab 用例一致。
*/
for (const tabCase of vendorQualSyncTabs) {
const { tab, caseIds } = tabCase;
test.describe(`供应商资质管理 · ${tab}`, () => {
test(`${caseIds.combo} ${tab}·${vendorQualComboTestLabel(tabCase)}组合查询`, async ({ vendorQualPage }) => {
const sample = await vendorQualPage.queryByFirstRowCombo(tabCase);
await vendorQualPage.expectQueryMatchesCombo(
tabCase,
sample.supplierKeyword,
sample.secondValue,
sample.extraFields,
);
});
test(`${caseIds.reset} ${tab}·${vendorQualResetTestLabel(tabCase)}`, async ({ vendorQualPage }) => {
await vendorQualPage.resetClearsSupplierFilterAfterFill(tabCase);
});
test(`${caseIds.export} ${tab}·查询后导出无报错`, async ({ vendorQualPage }) => {
await vendorQualPage.exportAfterQueryWithFirstRow(tabCase);
});
test(`${caseIds.view} ${tab}·首行查看详情销售商(自定义)一致`, async ({ vendorQualPage }) => {
const { listSupplier, detailSupplier } = await vendorQualPage.viewFirstRowAndReadSuppliers(tabCase);
expectDetailSupplierMatchesList(listSupplier, detailSupplier);
});
if (tabCase.hasExpirySubTabs && caseIds.expirySwitch && caseIds.expiryCount) {
test(`${caseIds.expirySwitch} ${tab}·列表子 Tab ${listSubTabTitleSummary(tab)}可切换`, async ({
vendorQualPage,
}) => {
await vendorQualPage.switchAllExpirySubTabs(tabCase);
});
test(`${caseIds.expiryCount} ${tab}·列表子 Tab 计数与列表一致`, async ({ vendorQualPage }) => {
await vendorQualPage.expectExpirySubTabCountsMatchList(tabCase);
});
}
});
}
import { expect, test } from '../../fixtures';
import { assertHeadersContain, assertListOrEmpty, assertMockEmpty } from './helpers/vendor-assert.helper';
/**
* 全量用例:与 testcase/基础管理-厂商管理-供应商资质管理-UI自动化测试用例-01.csv 严格一致
* 断言在用例;PO 负责动作/取数。运行:npm run test:vendor-qual:all
* 证件效期提醒 Tab:VENDOR-QUL-001~009、005–006(列设置)、007–008(列表效期子 Tab)。
* 其它主 Tab:vendor-qual-sync-tabs.spec.ts(QUL-010~057);各 Tab 列设置:005/006(证件效期提醒)、058~073(vendor-qual-column-settings.spec.ts)。运行:npm run test:vendor-qual:all
*/
test.describe('基础设置 · 厂商管理', () => {
test.describe('供应商资质管理 · 页面进入', () => {
test('VENDOR-QUL-001 菜单进入供应商资质管理页', { tag: '@smoke' }, async ({ vendorQualPage }) => {
test('VENDOR-QUL-001 进入页面列表 Tab 默认证件效期提醒', { tag: '@smoke' }, async ({ vendorQualPage }) => {
await vendorQualPage.openFromMenu();
await vendorQualPage.expectOnPage();
await expect(vendorQualPage.button('查询').first(), '查询').toBeVisible();
await expect(vendorQualPage.button('重置').first(), '重置').toBeVisible();
expect(vendorQualPage.browserPage.url()).toContain('basic/qcManage');
await vendorQualPage.expectTabActive('证件效期提醒');
});
});
test.describe('供应商资质管理 · 筛选与 Tab', () => {
test('VENDOR-QUL-002 默认查询列表有数据或空态明确', { tag: '@smoke' }, async ({ vendorQualPage }) => {
await vendorQualPage.open();
await vendorQualPage.query();
await assertListOrEmpty(await vendorQualPage.snapshotList());
test.describe('供应商资质管理 · 证件效期提醒', () => {
test('VENDOR-QUL-002 首行选中销售商(自定义)名称与证件类型组合查询', { tag: '@smoke' }, async ({
vendorQualPage,
}) => {
const sample = await vendorQualPage.queryByFirstRowSupplierAndCertType();
await vendorQualPage.expectQueryMatchesSupplierAndCertType(sample.supplierKeyword, sample.certType);
});
test('VENDOR-QUL-003 切换授权链路效期预警 Tab', async ({ vendorQualPage }) => {
await vendorQualPage.open();
await vendorQualPage.switchAuthLinkWarning();
await assertListOrEmpty(await vendorQualPage.snapshotList(), '授权链路效期预警');
test('VENDOR-QUL-003 填写销售商(自定义)名称后重置清空条件', async ({ vendorQualPage }) => {
await vendorQualPage.resetClearsSupplierFilterAfterFill();
});
test('VENDOR-QUL-004 近三个月到期计数一致', async ({ vendorQualPage }) => {
await vendorQualPage.open();
await vendorQualPage.switchExpiringThreeMonths();
await assertListOrEmpty(await vendorQualPage.snapshotList(), '近三个月到期');
test('VENDOR-QUL-004 查询后导出无报错', async ({ vendorQualPage }) => {
await vendorQualPage.exportAfterQueryWithFirstRow();
});
test('VENDOR-QUL-005 按进院供应商筛选', async ({ vendorQualPage }) => {
await vendorQualPage.open();
await vendorQualPage.filterBySupplierSample();
await assertListOrEmpty(await vendorQualPage.snapshotList(), '进院供应商筛选');
test('VENDOR-QUL-009 首行查看详情销售商(自定义)与列表一致', { tag: '@smoke' }, async ({ vendorQualPage }) => {
const { listSupplier, detailSupplier } = await vendorQualPage.viewFirstRowAndReadSuppliers();
const listNorm = listSupplier.replace(/\s/g, '');
const detailNorm = detailSupplier.replace(/\s/g, '');
expect(detailNorm.length, '详情应展示销售商(自定义)').toBeGreaterThan(0);
expect(
detailNorm.includes(listNorm) || listNorm.includes(detailNorm),
'详情销售商(自定义)应与列表首行一致',
).toBeTruthy();
});
});
test('VENDOR-QUL-006 重置恢复默认', async ({ vendorQualPage }) => {
await vendorQualPage.open();
await vendorQualPage.resetFilters();
await assertListOrEmpty(await vendorQualPage.snapshotList(), '重置后');
});
test.describe('供应商资质管理 · 列设置', () => {
test.describe.configure({ mode: 'serial', timeout: 120_000 });
test('VENDOR-QUL-007 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorQualPage }) => {
await vendorQualPage.open();
await vendorQualPage.mockEmpty();
await assertMockEmpty(await vendorQualPage.snapshotList());
test.beforeEach(async ({ vendorQualPage }) => {
await vendorQualPage.openOnCertExpiryReminder();
await vendorQualPage.query();
});
test('VENDOR-QUL-009 制单/效期日期起止同一天', async ({ vendorQualPage }) => {
await vendorQualPage.open();
await vendorQualPage.filterSameDayExpiryOrMakeDate();
await assertListOrEmpty(await vendorQualPage.snapshotList(), '同日日期筛选');
test('VENDOR-QUL-005 打开列设置面板', async ({ vendorQualPage }) => {
await vendorQualPage.openColumnSettings();
await vendorQualPage.expectColumnSettingsPanel();
await vendorQualPage.closeColumnSettingsPanel();
});
test('VENDOR-QUL-010 多条件组合查询(销售商名称等2项)', async ({ vendorQualPage }) => {
await vendorQualPage.open();
await vendorQualPage.filterCombination();
test('VENDOR-QUL-006 列设置取消勾选后再勾选列表列恢复', async ({ vendorQualPage }) => {
await vendorQualPage.executeColumnSettingsToggleRestoreTest();
});
});
test.describe('供应商资质管理 · 查看与导出', () => {
test('VENDOR-QUL-008 导出按钮可见', async ({ vendorQualPage }) => {
await vendorQualPage.open();
const exportBtn = vendorQualPage.button('导出').or(vendorQualPage.button('导出明细')).first();
await expect(exportBtn, '导出按钮').toBeVisible();
test.describe('供应商资质管理 · 证件效期提醒 · 效期子 Tab', () => {
test('VENDOR-QUL-007 效期子 Tab 三个月内/一个月内/已过期可切换', async ({ vendorQualPage }) => {
await vendorQualPage.switchAllExpirySubTabs();
});
test('VENDOR-QUL-008 效期子 Tab 计数与列表总数一致', async ({ vendorQualPage }) => {
await vendorQualPage.expectExpirySubTabCountsMatchList();
});
});
});
import { vendorData } from '../../data/vendor.data';
import { expect, test } from '../../fixtures';
import { assertHeadersContain, assertListOrEmpty, assertMockEmpty } from './helpers/vendor-assert.helper';
import { assertListOrEmpty, assertMockEmpty } from './helpers/vendor-assert.helper';
/**
* 全量用例:与 testcase/基础管理-厂商管理-厂商查询-UI自动化测试用例-01.csv 严格一致
......@@ -7,74 +8,33 @@ import { assertHeadersContain, assertListOrEmpty, assertMockEmpty } from './help
* 运行:npm run test:vendor-query:all
*/
test.describe('基础设置 · 厂商管理', () => {
test.describe('厂商查询 · 页面进入', () => {
test('VENDOR-QRY-001 菜单进入厂商查询页', { tag: '@smoke' }, async ({ vendorQueryPage }) => {
await vendorQueryPage.openFromMenu();
await vendorQueryPage.ready();
await expect(vendorQueryPage.registrantTab(), '器械注册人 Tab').toBeVisible();
await expect(vendorQueryPage.distributorTab(), '经销商 Tab').toBeVisible();
await expect(vendorQueryPage.nameSearch(), '厂商名称搜索').toBeVisible();
expect(vendorQueryPage.browserPage.url(), 'URL 应含厂商查询 path').toContain('mfrsName/factory');
});
test.describe('未登录', () => {
test.use({ storageState: { cookies: [], origins: [] } });
test('VENDOR-QRY-010 未登录访问拦截', async ({ vendorQueryPage }) => {
const probe = await vendorQueryPage.probeUnauthAccess();
expect(probe.onLogin || !probe.hasBusinessRow, '未登录不可见厂商业务列表').toBeTruthy();
});
});
});
test.describe('厂商查询 · Tab 与搜索', () => {
test('VENDOR-QRY-002 默认器械注册人列表有数据或空态明确', { tag: '@smoke' }, async ({ vendorQueryPage }) => {
await vendorQueryPage.open();
await vendorQueryPage.switchRegistrant();
await assertListOrEmpty(await vendorQueryPage.snapshotList(), '器械注册人');
});
test('VENDOR-QRY-003 切换经销商 Tab', { tag: '@smoke' }, async ({ vendorQueryPage }) => {
test('VENDOR-QRY-001 切换经销商 Tab', { tag: '@smoke' }, async ({ vendorQueryPage }) => {
await vendorQueryPage.open();
await vendorQueryPage.switchDistributor();
await assertListOrEmpty(await vendorQueryPage.snapshotList(), '经销商');
});
test('VENDOR-QRY-004 按厂商名称搜索', async ({ vendorQueryPage }) => {
test('VENDOR-QRY-002 按厂商名称搜索', async ({ vendorQueryPage }) => {
await vendorQueryPage.open();
const keyword = await vendorQueryPage.searchBySampleName();
expect(await vendorQueryPage.rowsMatchKeyword('厂商名称', keyword), '结果行厂商名称应匹配关键字').toBeTruthy();
});
test('VENDOR-QRY-005 清空搜索恢复', async ({ vendorQueryPage }) => {
test('VENDOR-QRY-003 清空搜索恢复', async ({ vendorQueryPage }) => {
await vendorQueryPage.open();
await vendorQueryPage.searchBySampleName();
const { before, after } = await vendorQueryPage.clearNameSearch();
expect(after, '清空后条数应不少于过滤后').toBeGreaterThanOrEqual(before);
});
test('VENDOR-QRY-006 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorQueryPage }) => {
test('VENDOR-QRY-004 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ vendorQueryPage }) => {
await vendorQueryPage.open();
await vendorQueryPage.searchMockEmpty();
await assertMockEmpty(await vendorQueryPage.snapshotList());
});
test('VENDOR-QRY-007 列表核心列完整', async ({ vendorQueryPage }) => {
await vendorQueryPage.open();
await vendorQueryPage.switchRegistrant();
assertHeadersContain(await vendorQueryPage.headerTexts(), [
'序号',
'厂商编号',
'厂商名称',
'产地',
'详细地址',
'简称',
'开户银行',
'银行账号',
]);
});
test('VENDOR-QRY-008 分页翻至第 2 页', async ({ vendorQueryPage }) => {
test('VENDOR-QRY-005 分页翻至第 2 页', async ({ vendorQueryPage }) => {
await vendorQueryPage.open();
await vendorQueryPage.switchRegistrant();
await vendorQueryPage.goToPage2();
......@@ -82,16 +42,48 @@ test.describe('基础设置 · 厂商管理', () => {
expect(state.rows, '第 2 页应有数据').toBeGreaterThan(0);
});
test('VENDOR-QRY-009 仅空格关键字搜索', async ({ vendorQueryPage }) => {
test('VENDOR-QRY-006 经销商选首行验证厂商名称查询条件', async ({ vendorQueryPage }) => {
await vendorQueryPage.open();
const keyword = await vendorQueryPage.searchByDistributorFirstRowSelection();
expect(await vendorQueryPage.rowsMatchKeyword('厂商名称', keyword), '按首行厂商名称查询应命中').toBeTruthy();
const filterValue = ((await vendorQueryPage.nameSearch().inputValue().catch(() => '')) ?? '').trim();
expect(filterValue.replace(/\s/g, ''), '厂商名称查询条件应已写入关键字').toContain(
keyword.replace(/\s/g, ''),
);
});
test('VENDOR-QRY-007 切换20条每页页面正常且列表同步', async ({ vendorQueryPage }) => {
await vendorQueryPage.open();
await vendorQueryPage.searchSpacesOnly();
await assertListOrEmpty(await vendorQueryPage.snapshotList(), '空格搜索');
await vendorQueryPage.switchRegistrant();
const { total, rowsBefore, rowsAfter, pageSizeLabel } = await vendorQueryPage.switchToSmallerPageSize();
const sizeNum = Number((pageSizeLabel.match(/\d+/) ?? ['20'])[0]);
const expectedRows = Math.min(total, sizeNum);
expect(rowsAfter, `当前页行数应与 ${pageSizeLabel} 及总条数一致`).toBe(expectedRows);
if (total > sizeNum) {
expect(rowsAfter, '切换后可见行应随每页条数变化').toBeLessThan(rowsBefore);
}
expect(await vendorQueryPage.getTotalCount(), '总条数应不变').toBe(total);
await expect(vendorQueryPage.pageSizeChanger(), '每页条数').toContainText(new RegExp(String(sizeNum)));
expect(pageSizeLabel, '与数据配置一致').toBe(vendorData.paginationPageSizeTo);
});
});
test('VENDOR-QRY-011 厂商名称与资质管理进院供应商可对照', async ({ vendorQueryPage, vendorQualPage }) => {
test.describe('厂商查询 · 列设置', () => {
test.describe.configure({ mode: 'serial', timeout: 120_000 });
test.beforeEach(async ({ vendorQueryPage }) => {
await vendorQueryPage.open();
await vendorQueryPage.searchQualWithNameKeyword(vendorQualPage);
await assertListOrEmpty(await vendorQualPage.snapshotList(), '资质管理对照');
await vendorQueryPage.switchRegistrant();
});
test('VENDOR-QRY-008 打开列设置面板', async ({ vendorQueryPage }) => {
await vendorQueryPage.openColumnSettings();
await vendorQueryPage.expectColumnSettingsPanel();
await vendorQueryPage.closeColumnSettingsPanel();
});
test('VENDOR-QRY-009 列设置取消勾选后再勾选列表列恢复', async ({ vendorQueryPage }) => {
await vendorQueryPage.executeColumnSettingsToggleRestoreTest();
});
});
});
......@@ -30,17 +30,9 @@ test.describe('基础设置 · 库房管理', () => {
});
test.describe('库区设置 · 左侧库房树', () => {
test('WH-ZON-003 库房树默认有选中项', { tag: '@smoke' }, async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
const names = await warehouseZonePage.visibleTreeNames();
expect(names.length, '库房树至少 1 个节点').toBeGreaterThan(0);
const selected = await warehouseZonePage.selectedWarehouse();
expect(selected, '应有选中库房').toBeTruthy();
await assertListOrEmpty(await warehouseZonePage.snapshotList(), '当前库房库区');
});
test('WH-ZON-004 清空库房名称恢复全量树', async ({ warehouseZonePage }) => {
test('WH-ZON-003 清空库房名称恢复全量树', async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
const before = (await warehouseZonePage.visibleTreeNames()).length;
const sample = await warehouseZonePage.selectedWarehouse();
......@@ -50,7 +42,7 @@ test.describe('基础设置 · 库房管理', () => {
expect(after, '清空后树应恢复全量').toBe(before);
});
test('WH-ZON-005 切换库房刷新右侧列表', async ({ warehouseZonePage }) => {
test('WH-ZON-004 切换库房刷新右侧列表', async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
const rows = await warehouseZonePage.listRows();
const firstNo = (await rows.count()) > 0 ? await warehouseZonePage.tryCell(rows.first(), '库区编号') : '';
......@@ -65,7 +57,7 @@ test.describe('基础设置 · 库房管理', () => {
});
});
test.describe('库区设置 · 右侧库区列表与分页', () => {
test('WH-ZON-006 列表核心列完整', { tag: '@smoke' }, async ({ warehouseZonePage }) => {
test('WH-ZON-005 列表核心列完整', { tag: '@smoke' }, async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
assertHeadersContain(await warehouseZonePage.headerTexts(), [
'库区编号',
......@@ -87,7 +79,7 @@ test.describe('基础设置 · 库房管理', () => {
}
});
test('WH-ZON-007 默认库区以标签展示', async ({ warehouseZonePage }) => {
test('WH-ZON-006 默认库区以标签展示', async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
const headers = (await warehouseZonePage.headerTexts()).join(' ');
expect(headers.includes('默认库区'), '默认库区不是独立列').toBeFalsy();
......@@ -98,14 +90,14 @@ test.describe('基础设置 · 库房管理', () => {
});
test.describe('库区设置 · 库区搜索', () => {
test('WH-ZON-008 按库区编号搜索', { tag: '@smoke' }, async ({ warehouseZonePage }) => {
test('WH-ZON-007 按库区编号搜索', { tag: '@smoke' }, async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
const zoneNo = await warehouseZonePage.sampleCell('库区编号');
await warehouseZonePage.searchZone(zoneNo);
expect(await warehouseZonePage.rowsMatchKeyword('库区编号', zoneNo), '结果应含该编号').toBeTruthy();
});
test('WH-ZON-009 按库区名称搜索', async ({ warehouseZonePage }) => {
test('WH-ZON-008 按库区名称搜索', async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
const name = await warehouseZonePage.sampleCell('库区名称');
const keyword = name.replace(/默认库区/g, '').slice(0, Math.min(name.length, 6));
......@@ -113,7 +105,7 @@ test.describe('基础设置 · 库房管理', () => {
expect(await warehouseZonePage.rowsMatchKeyword('库区名称', keyword), '名称关键字应命中').toBeTruthy();
});
test('WH-ZON-010 无匹配库区空态(mock反例)', { tag: '@smoke' }, async ({ warehouseZonePage }) => {
test('WH-ZON-009 无匹配库区空态(mock反例)', { tag: '@smoke' }, async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
await warehouseZonePage.searchZone(warehouseData.mockZone);
await assertMockEmpty(await warehouseZonePage.snapshotList(), '库区 mock');
......@@ -121,7 +113,7 @@ test.describe('基础设置 · 库房管理', () => {
});
test.describe('库区设置 · 新增库区', () => {
test('WH-ZON-011 打开新增库区弹窗', { tag: '@smoke' }, async ({ warehouseZonePage }) => {
test('WH-ZON-010 打开新增库区弹窗', { tag: '@smoke' }, async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
const dialog = await warehouseZonePage.openAddDialog();
expect(await warehouseZonePage.dialogTitle(), '标题').toContain('新增库区');
......@@ -134,7 +126,7 @@ test.describe('基础设置 · 库房管理', () => {
await warehouseZonePage.cancelDialog();
});
test('WH-ZON-012 新增取消不落库', async ({ warehouseZonePage }) => {
test('WH-ZON-011 新增取消不落库', async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
const zoneNo = `AUTO${Date.now()}`;
await warehouseZonePage.openAddDialog();
......@@ -144,7 +136,7 @@ test.describe('基础设置 · 库房管理', () => {
await assertMockEmpty(await warehouseZonePage.snapshotList(), '取消新增');
});
test('WH-ZON-013 必填为空拦截', async ({ warehouseZonePage }) => {
test('WH-ZON-012 必填为空拦截', async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
await warehouseZonePage.openAddDialog();
await warehouseZonePage.confirmDialog();
......@@ -156,7 +148,7 @@ test.describe('基础设置 · 库房管理', () => {
});
test.describe('库区设置 · 编辑库区', () => {
test('WH-ZON-014 打开编辑并回填', async ({ warehouseZonePage }) => {
test('WH-ZON-013 打开编辑并回填', async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
const sample = await warehouseZonePage.openEditFirst();
expect(await warehouseZonePage.dialogTitle(), '标题').toContain('编辑库区信息');
......@@ -172,7 +164,7 @@ test.describe('基础设置 · 库房管理', () => {
await warehouseZonePage.cancelDialog();
});
test('WH-ZON-015 编辑取消不保存', async ({ warehouseZonePage }) => {
test('WH-ZON-014 编辑取消不保存', async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
const before = await warehouseZonePage.openEditFirst();
await warehouseZonePage.fill(warehouseZonePage.locators.shelfName, `临时${Date.now()}`, '改名称');
......@@ -182,7 +174,7 @@ test.describe('基础设置 · 库房管理', () => {
await warehouseZonePage.cancelDialog();
});
test('WH-ZON-016 编辑清空必填拦截', async ({ warehouseZonePage }) => {
test('WH-ZON-015 编辑清空必填拦截', async ({ warehouseZonePage }) => {
await warehouseZonePage.open();
const before = await warehouseZonePage.openEditFirst();
await warehouseZonePage.fill(warehouseZonePage.locators.shelfName, '', '清空库区名称');
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment