|
@@ -0,0 +1,580 @@
|
|
|
|
|
+import { test, expect } from '../../utils/test-setup';
|
|
|
|
|
+import { readFileSync } from 'fs';
|
|
|
|
|
+import { join, dirname } from 'path';
|
|
|
|
|
+import { fileURLToPath } from 'url';
|
|
|
|
|
+import { selectRadixOption } from '@d8d/e2e-test-utils';
|
|
|
|
|
+
|
|
|
|
|
+const __filename = fileURLToPath(import.meta.url);
|
|
|
|
|
+const __dirname = dirname(__filename);
|
|
|
|
|
+const testUsers = JSON.parse(readFileSync(join(__dirname, '../../fixtures/test-users.json'), 'utf-8'));
|
|
|
|
|
+
|
|
|
|
|
+// 超时配置常量
|
|
|
|
|
+const TIMEOUTS = {
|
|
|
|
|
+ SHORT: 300,
|
|
|
|
|
+ MEDIUM: 500,
|
|
|
|
|
+ LONG: 1000,
|
|
|
|
|
+ DIALOG: 5000,
|
|
|
|
|
+} as const;
|
|
|
|
|
+
|
|
|
|
|
+// 用于跟踪已创建的测试数据,便于清理
|
|
|
|
|
+const createdTestData: Array<{ name: string; idCard: string }> = [];
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 生成唯一的测试数据
|
|
|
|
|
+ */
|
|
|
|
|
+function generateUniqueTestData(suffix: string) {
|
|
|
|
|
+ const randomPart = Math.floor(Math.random() * 1000000);
|
|
|
|
|
+ const timestamp = Date.now();
|
|
|
|
|
+ return {
|
|
|
|
|
+ name: `银行卡${suffix}_${timestamp}_${randomPart}`,
|
|
|
|
|
+ gender: randomPart % 2 === 0 ? '男' : '女',
|
|
|
|
|
+ idCard: `42010119900101${String(randomPart % 10000).padStart(4, '0')}`,
|
|
|
|
|
+ disabilityId: `511001199001${String(randomPart % 10000).padStart(4, '0')}`,
|
|
|
|
|
+ disabilityType: ['视力残疾', '听力残疾', '言语残疾', '肢体残疾', '智力残疾', '精神残疾'][randomPart % 6],
|
|
|
|
|
+ disabilityLevel: ['一级', '二级', '三级', '四级'][randomPart % 4],
|
|
|
|
|
+ phone: `138${String(randomPart % 100000000).padStart(8, '0')}`,
|
|
|
|
|
+ idAddress: `湖北省武汉市测试街道${randomPart % 100}号`,
|
|
|
|
|
+ province: '湖北省',
|
|
|
|
|
+ city: '武汉市'
|
|
|
|
|
+ };
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+test.describe.serial('残疾人管理 - 银行卡管理功能', () => {
|
|
|
|
|
+ test.beforeEach(async ({ adminLoginPage, disabilityPersonPage }) => {
|
|
|
|
|
+ // 以管理员身份登录后台
|
|
|
|
|
+ await adminLoginPage.goto();
|
|
|
|
|
+ await adminLoginPage.login(testUsers.admin.username, testUsers.admin.password);
|
|
|
|
|
+ await adminLoginPage.expectLoginSuccess();
|
|
|
|
|
+ await disabilityPersonPage.goto();
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test.afterEach(async ({ disabilityPersonPage, page }) => {
|
|
|
|
|
+ // 清理测试数据
|
|
|
|
|
+ for (const data of createdTestData) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ await disabilityPersonPage.goto();
|
|
|
|
|
+ await disabilityPersonPage.searchByName(data.name);
|
|
|
|
|
+ const deleteButton = page.getByRole('button', { name: '删除' }).first();
|
|
|
|
|
+ if (await deleteButton.count() > 0) {
|
|
|
|
|
+ await deleteButton.click();
|
|
|
|
|
+ await page.getByRole('button', { name: '确认' }).click().catch(() => {});
|
|
|
|
|
+ await page.waitForTimeout(TIMEOUTS.MEDIUM);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.debug(` ⚠ 清理数据失败: ${data.name}`, error);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ createdTestData.length = 0;
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 辅助函数:在银行卡区域添加银行卡
|
|
|
|
|
+ */
|
|
|
|
|
+ async function addBankCardInline(page: any, bankCard: {
|
|
|
|
|
+ bankName: string;
|
|
|
|
|
+ subBankName: string;
|
|
|
|
|
+ cardNumber: string;
|
|
|
|
|
+ cardholderName: string;
|
|
|
|
|
+ cardType?: string;
|
|
|
|
|
+ isDefault?: boolean;
|
|
|
|
|
+ }) {
|
|
|
|
|
+ console.debug(` 添加银行卡: ${bankCard.bankName} - ${bankCard.cardNumber}`);
|
|
|
|
|
+
|
|
|
|
|
+ // 滚动到银行卡管理区域
|
|
|
|
|
+ const bankCardLabel = page.getByText('银行卡管理');
|
|
|
|
|
+ await bankCardLabel.scrollIntoViewIfNeeded();
|
|
|
|
|
+ await page.waitForTimeout(TIMEOUTS.SHORT);
|
|
|
|
|
+
|
|
|
|
|
+ // 获取当前银行卡数量
|
|
|
|
|
+ const currentCardCount = await page.locator('[data-testid^="remove-bank-card-"]').count();
|
|
|
|
|
+ console.debug(` 当前银行卡数量: ${currentCardCount}`);
|
|
|
|
|
+
|
|
|
|
|
+ // 点击"添加银行卡"按钮
|
|
|
|
|
+ const addButton = page.locator('[data-testid="add-bank-card-button"]');
|
|
|
|
|
+ await addButton.click();
|
|
|
|
|
+ await page.waitForTimeout(TIMEOUTS.MEDIUM);
|
|
|
|
|
+
|
|
|
|
|
+ // 等待新的银行卡卡片出现
|
|
|
|
|
+ const newCardCount = await page.locator('[data-testid^="remove-bank-card-"]').count();
|
|
|
|
|
+ console.debug(` 添加后银行卡数量: ${newCardCount}`);
|
|
|
|
|
+ expect(newCardCount).toBe(currentCardCount + 1);
|
|
|
|
|
+
|
|
|
|
|
+ // 新添加的银行卡索引
|
|
|
|
|
+ const cardIndex = currentCardCount;
|
|
|
|
|
+
|
|
|
|
|
+ // 填写银行卡信息
|
|
|
|
|
+ // 1. 选择银行名称
|
|
|
|
|
+ const bankSelectTrigger = page.locator(`[data-testid="bank-select-${cardIndex}"]`);
|
|
|
|
|
+ await bankSelectTrigger.click();
|
|
|
|
|
+ await page.waitForTimeout(TIMEOUTS.SHORT);
|
|
|
|
|
+ await page.getByRole('option', { name: bankCard.bankName }).click();
|
|
|
|
|
+ console.debug(` ✓ 银行名称: ${bankCard.bankName}`);
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 填写发卡支行
|
|
|
|
|
+ const subBankInput = page.locator(`[data-testid="sub-bank-name-input-${cardIndex}"]`);
|
|
|
|
|
+ await subBankInput.fill(bankCard.subBankName);
|
|
|
|
|
+ console.debug(` ✓ 发卡支行: ${bankCard.subBankName}`);
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 填写银行卡号
|
|
|
|
|
+ const cardNumberInput = page.locator(`[data-testid="card-number-input-${cardIndex}"]`);
|
|
|
|
|
+ await cardNumberInput.fill(bankCard.cardNumber);
|
|
|
|
|
+ console.debug(` ✓ 银行卡号: ${bankCard.cardNumber}`);
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 填写持卡人姓名
|
|
|
|
|
+ const cardholderInput = page.locator(`[data-testid="cardholder-name-input-${cardIndex}"]`);
|
|
|
|
|
+ await cardholderInput.fill(bankCard.cardholderName);
|
|
|
|
|
+ console.debug(` ✓ 持卡人姓名: ${bankCard.cardholderName}`);
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 选择银行卡类型(可选)
|
|
|
|
|
+ if (bankCard.cardType) {
|
|
|
|
|
+ const cardTypeTrigger = page.locator(`[data-testid="card-type-select-${cardIndex}"]`);
|
|
|
|
|
+ await cardTypeTrigger.click();
|
|
|
|
|
+ await page.waitForTimeout(TIMEOUTS.SHORT);
|
|
|
|
|
+ await page.getByRole('option', { name: bankCard.cardType }).click();
|
|
|
|
|
+ console.debug(` ✓ 银行卡类型: ${bankCard.cardType}`);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 6. 设置默认银行卡(可选)
|
|
|
|
|
+ if (bankCard.isDefault) {
|
|
|
|
|
+ const defaultSwitch = page.locator(`[data-testid="default-card-switch-${cardIndex}"]`);
|
|
|
|
|
+ await defaultSwitch.click();
|
|
|
|
|
+ console.debug(` ✓ 设为默认银行卡`);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ console.debug(` ✓ 银行卡 ${cardIndex} 添加完成`);
|
|
|
|
|
+ return cardIndex;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 辅助函数:编辑指定索引的银行卡
|
|
|
|
|
+ */
|
|
|
|
|
+ async function editBankCard(page: any, cardIndex: number, updatedData: {
|
|
|
|
|
+ bankName?: string;
|
|
|
|
|
+ subBankName?: string;
|
|
|
|
|
+ cardNumber?: string;
|
|
|
|
|
+ cardholderName?: string;
|
|
|
|
|
+ cardType?: string;
|
|
|
|
|
+ }) {
|
|
|
|
|
+ console.debug(` 编辑银行卡 ${cardIndex}`);
|
|
|
|
|
+
|
|
|
|
|
+ // 编辑银行名称
|
|
|
|
|
+ if (updatedData.bankName !== undefined) {
|
|
|
|
|
+ const bankSelectTrigger = page.locator(`[data-testid="bank-select-${cardIndex}"]`);
|
|
|
|
|
+ await bankSelectTrigger.click();
|
|
|
|
|
+ await page.waitForTimeout(TIMEOUTS.SHORT);
|
|
|
|
|
+ await page.getByRole('option', { name: updatedData.bankName }).click();
|
|
|
|
|
+ console.debug(` ✓ 更新银行名称: ${updatedData.bankName}`);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 编辑发卡支行
|
|
|
|
|
+ if (updatedData.subBankName !== undefined) {
|
|
|
|
|
+ const subBankInput = page.locator(`[data-testid="sub-bank-name-input-${cardIndex}"]`);
|
|
|
|
|
+ await subBankInput.clear();
|
|
|
|
|
+ await subBankInput.fill(updatedData.subBankName);
|
|
|
|
|
+ console.debug(` ✓ 更新发卡支行: ${updatedData.subBankName}`);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 编辑银行卡号
|
|
|
|
|
+ if (updatedData.cardNumber !== undefined) {
|
|
|
|
|
+ const cardNumberInput = page.locator(`[data-testid="card-number-input-${cardIndex}"]`);
|
|
|
|
|
+ await cardNumberInput.clear();
|
|
|
|
|
+ await cardNumberInput.fill(updatedData.cardNumber);
|
|
|
|
|
+ console.debug(` ✓ 更新银行卡号: ${updatedData.cardNumber}`);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 编辑持卡人姓名
|
|
|
|
|
+ if (updatedData.cardholderName !== undefined) {
|
|
|
|
|
+ const cardholderInput = page.locator(`[data-testid="cardholder-name-input-${cardIndex}"]`);
|
|
|
|
|
+ await cardholderInput.clear();
|
|
|
|
|
+ await cardholderInput.fill(updatedData.cardholderName);
|
|
|
|
|
+ console.debug(` ✓ 更新持卡人姓名: ${updatedData.cardholderName}`);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 编辑银行卡类型
|
|
|
|
|
+ if (updatedData.cardType !== undefined) {
|
|
|
|
|
+ const cardTypeTrigger = page.locator(`[data-testid="card-type-select-${cardIndex}"]`);
|
|
|
|
|
+ await cardTypeTrigger.click();
|
|
|
|
|
+ await page.waitForTimeout(TIMEOUTS.SHORT);
|
|
|
|
|
+ await page.getByRole('option', { name: updatedData.cardType }).click();
|
|
|
|
|
+ console.debug(` ✓ 更新银行卡类型: ${updatedData.cardType}`);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ console.debug(` ✓ 银行卡 ${cardIndex} 编辑完成`);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 辅助函数:删除指定索引的银行卡
|
|
|
|
|
+ */
|
|
|
|
|
+ async function deleteBankCard(page: any, cardIndex: number) {
|
|
|
|
|
+ console.debug(` 删除银行卡 ${cardIndex}`);
|
|
|
|
|
+
|
|
|
|
|
+ const removeButton = page.locator(`[data-testid="remove-bank-card-${cardIndex}"]`);
|
|
|
|
|
+ await removeButton.click();
|
|
|
|
|
+ await page.waitForTimeout(TIMEOUTS.MEDIUM);
|
|
|
|
|
+
|
|
|
|
|
+ console.debug(` ✓ 银行卡 ${cardIndex} 已删除`);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 辅助函数:获取银行卡列表信息
|
|
|
|
|
+ */
|
|
|
|
|
+ async function getBankCardList(page: any): Promise<string[]> {
|
|
|
|
|
+ const cards: string[] = [];
|
|
|
|
|
+ const cardCount = await page.locator('[data-testid^="remove-bank-card-"]').count();
|
|
|
|
|
+
|
|
|
|
|
+ for (let i = 0; i < cardCount; i++) {
|
|
|
|
|
+ // 获取银行卡号输入框的值
|
|
|
|
|
+ const cardNumberInput = page.locator(`[data-testid="card-number-input-${i}"]`);
|
|
|
|
|
+ const cardNumber = await cardNumberInput.inputValue();
|
|
|
|
|
+ cards.push(cardNumber);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return cards;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 辅助函数:获取默认银行卡的索引
|
|
|
|
|
+ */
|
|
|
|
|
+ async function getDefaultBankCardIndex(page: any): Promise<number | null> {
|
|
|
|
|
+ const cardCount = await page.locator('[data-testid^="remove-bank-card-"]').count();
|
|
|
|
|
+
|
|
|
|
|
+ for (let i = 0; i < cardCount; i++) {
|
|
|
|
|
+ const defaultSwitch = page.locator(`[data-testid="default-card-switch-${i}"]`);
|
|
|
|
|
+ const isChecked = await defaultSwitch.isChecked();
|
|
|
|
|
+ if (isChecked) {
|
|
|
|
|
+ return i;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ test('应该成功添加单张银行卡', async ({ disabilityPersonPage, page }) => {
|
|
|
|
|
+ const testData = generateUniqueTestData('单张银行卡');
|
|
|
|
|
+ createdTestData.push({ name: testData.name, idCard: testData.idCard });
|
|
|
|
|
+
|
|
|
|
|
+ console.log('\n========== 单张银行卡添加测试 ==========');
|
|
|
|
|
+
|
|
|
|
|
+ // 打开对话框并填写基本信息
|
|
|
|
|
+ await disabilityPersonPage.openCreateDialog();
|
|
|
|
|
+ await disabilityPersonPage.fillBasicForm(testData);
|
|
|
|
|
+
|
|
|
|
|
+ // 滚动到银行卡管理区域
|
|
|
|
|
+ await disabilityPersonPage.scrollToSection('银行卡管理');
|
|
|
|
|
+
|
|
|
|
|
+ // 添加银行卡
|
|
|
|
|
+ const bankCard = {
|
|
|
|
|
+ bankName: '中国工商银行',
|
|
|
|
|
+ subBankName: '北京分行朝阳支行',
|
|
|
|
|
+ cardNumber: '6222021234567890123',
|
|
|
|
|
+ cardholderName: testData.name,
|
|
|
|
|
+ isDefault: true,
|
|
|
|
|
+ };
|
|
|
|
|
+ await addBankCardInline(page, bankCard);
|
|
|
|
|
+
|
|
|
|
|
+ // 验证银行卡已添加
|
|
|
|
|
+ const bankCardList = await getBankCardList(page);
|
|
|
|
|
+ expect(bankCardList).toHaveLength(1);
|
|
|
|
|
+ console.debug(' ✓ 银行卡列表数量: 1');
|
|
|
|
|
+
|
|
|
|
|
+ // 验证默认银行卡
|
|
|
|
|
+ const defaultIndex = await getDefaultBankCardIndex(page);
|
|
|
|
|
+ expect(defaultIndex).toBe(0);
|
|
|
|
|
+ console.debug(' ✓ 默认银行卡索引: 0');
|
|
|
|
|
+
|
|
|
|
|
+ console.log('✅ 单张银行卡添加测试通过');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('应该成功编辑银行卡信息', async ({ disabilityPersonPage, page }) => {
|
|
|
|
|
+ const testData = generateUniqueTestData('编辑银行卡');
|
|
|
|
|
+ createdTestData.push({ name: testData.name, idCard: testData.idCard });
|
|
|
|
|
+
|
|
|
|
|
+ console.log('\n========== 银行卡编辑测试 ==========');
|
|
|
|
|
+
|
|
|
|
|
+ // 打开对话框并填写基本信息
|
|
|
|
|
+ await disabilityPersonPage.openCreateDialog();
|
|
|
|
|
+ await disabilityPersonPage.fillBasicForm(testData);
|
|
|
|
|
+
|
|
|
|
|
+ // 添加原始银行卡
|
|
|
|
|
+ const originalCard = {
|
|
|
|
|
+ bankName: '中国工商银行',
|
|
|
|
|
+ subBankName: '北京分行朝阳支行',
|
|
|
|
|
+ cardNumber: '6222021234567890123',
|
|
|
|
|
+ cardholderName: testData.name,
|
|
|
|
|
+ };
|
|
|
|
|
+ await addBankCardInline(page, originalCard);
|
|
|
|
|
+
|
|
|
|
|
+ // 编辑银行卡
|
|
|
|
|
+ const updatedCard = {
|
|
|
|
|
+ bankName: '中国建设银行',
|
|
|
|
|
+ subBankName: '上海分行浦东支行',
|
|
|
|
|
+ cardNumber: '6227001234567890123',
|
|
|
|
|
+ };
|
|
|
|
|
+ await editBankCard(page, 0, updatedCard);
|
|
|
|
|
+
|
|
|
|
|
+ // 验证更新后的信息
|
|
|
|
|
+ const bankCardList = await getBankCardList(page);
|
|
|
|
|
+ expect(bankCardList).toHaveLength(1);
|
|
|
|
|
+
|
|
|
|
|
+ // 验证银行卡号已更新(格式化后可能包含空格)
|
|
|
|
|
+ const cardNumberInput = page.locator('[data-testid="card-number-input-0"]');
|
|
|
|
|
+ const cardNumberValue = await cardNumberInput.inputValue();
|
|
|
|
|
+ expect(cardNumberValue).toContain('6227');
|
|
|
|
|
+ console.debug(' ✓ 银行卡号已更新');
|
|
|
|
|
+
|
|
|
|
|
+ console.log('✅ 银行卡编辑测试通过');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('应该成功删除银行卡', async ({ disabilityPersonPage, page }) => {
|
|
|
|
|
+ const testData = generateUniqueTestData('删除银行卡');
|
|
|
|
|
+ createdTestData.push({ name: testData.name, idCard: testData.idCard });
|
|
|
|
|
+
|
|
|
|
|
+ console.log('\n========== 银行卡删除测试 ==========');
|
|
|
|
|
+
|
|
|
|
|
+ // 打开对话框并填写基本信息
|
|
|
|
|
+ await disabilityPersonPage.openCreateDialog();
|
|
|
|
|
+ await disabilityPersonPage.fillBasicForm(testData);
|
|
|
|
|
+
|
|
|
|
|
+ // 添加银行卡
|
|
|
|
|
+ const bankCard = {
|
|
|
|
|
+ bankName: '中国工商银行',
|
|
|
|
|
+ subBankName: '北京分行朝阳支行',
|
|
|
|
|
+ cardNumber: '6222021234567890123',
|
|
|
|
|
+ cardholderName: testData.name,
|
|
|
|
|
+ };
|
|
|
|
|
+ await addBankCardInline(page, bankCard);
|
|
|
|
|
+
|
|
|
|
|
+ // 验证银行卡存在
|
|
|
|
|
+ let bankCardList = await getBankCardList(page);
|
|
|
|
|
+ expect(bankCardList).toHaveLength(1);
|
|
|
|
|
+ console.debug(' ✓ 银行卡已添加');
|
|
|
|
|
+
|
|
|
|
|
+ // 删除银行卡
|
|
|
|
|
+ await deleteBankCard(page, 0);
|
|
|
|
|
+
|
|
|
|
|
+ // 验证银行卡已被删除
|
|
|
|
|
+ bankCardList = await getBankCardList(page);
|
|
|
|
|
+ expect(bankCardList).toHaveLength(0);
|
|
|
|
|
+ console.debug(' ✓ 银行卡已删除');
|
|
|
|
|
+
|
|
|
|
|
+ console.log('✅ 银行卡删除测试通过');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('应该支持添加多张银行卡', async ({ disabilityPersonPage, page }) => {
|
|
|
|
|
+ const testData = generateUniqueTestData('多张银行卡');
|
|
|
|
|
+ createdTestData.push({ name: testData.name, idCard: testData.idCard });
|
|
|
|
|
+
|
|
|
|
|
+ console.log('\n========== 多张银行卡管理测试 ==========');
|
|
|
|
|
+
|
|
|
|
|
+ // 打开对话框并填写基本信息
|
|
|
|
|
+ await disabilityPersonPage.openCreateDialog();
|
|
|
|
|
+ await disabilityPersonPage.fillBasicForm(testData);
|
|
|
|
|
+
|
|
|
|
|
+ // 滚动到银行卡管理区域
|
|
|
|
|
+ await disabilityPersonPage.scrollToSection('银行卡管理');
|
|
|
|
|
+
|
|
|
|
|
+ // 添加三张银行卡
|
|
|
|
|
+ await addBankCardInline(page, {
|
|
|
|
|
+ bankName: '中国工商银行',
|
|
|
|
|
+ subBankName: '北京分行朝阳支行',
|
|
|
|
|
+ cardNumber: '6222021234567890123',
|
|
|
|
|
+ cardholderName: testData.name,
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ await addBankCardInline(page, {
|
|
|
|
|
+ bankName: '中国建设银行',
|
|
|
|
|
+ subBankName: '上海分行浦东支行',
|
|
|
|
|
+ cardNumber: '6227001234567890123',
|
|
|
|
|
+ cardholderName: testData.name,
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ await addBankCardInline(page, {
|
|
|
|
|
+ bankName: '中国农业银行',
|
|
|
|
|
+ subBankName: '广州分行天河支行',
|
|
|
|
|
+ cardNumber: '6228481234567890123',
|
|
|
|
|
+ cardholderName: testData.name,
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 验证所有银行卡都显示
|
|
|
|
|
+ const bankCardList = await getBankCardList(page);
|
|
|
|
|
+ expect(bankCardList).toHaveLength(3);
|
|
|
|
|
+ console.debug(' ✓ 银行卡数量: 3');
|
|
|
|
|
+
|
|
|
|
|
+ console.log('✅ 多张银行卡管理测试通过');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('应该能够设置默认银行卡', async ({ disabilityPersonPage, page }) => {
|
|
|
|
|
+ const testData = generateUniqueTestData('默认银行卡');
|
|
|
|
|
+ createdTestData.push({ name: testData.name, idCard: testData.idCard });
|
|
|
|
|
+
|
|
|
|
|
+ console.log('\n========== 默认银行卡设置测试 ==========');
|
|
|
|
|
+
|
|
|
|
|
+ // 打开对话框并填写基本信息
|
|
|
|
|
+ await disabilityPersonPage.openCreateDialog();
|
|
|
|
|
+ await disabilityPersonPage.fillBasicForm(testData);
|
|
|
|
|
+
|
|
|
|
|
+ // 滚动到银行卡管理区域
|
|
|
|
|
+ await disabilityPersonPage.scrollToSection('银行卡管理');
|
|
|
|
|
+
|
|
|
|
|
+ // 添加第一张银行卡(设为默认)
|
|
|
|
|
+ await addBankCardInline(page, {
|
|
|
|
|
+ bankName: '中国工商银行',
|
|
|
|
|
+ subBankName: '北京分行朝阳支行',
|
|
|
|
|
+ cardNumber: '6222021234567890123',
|
|
|
|
|
+ cardholderName: testData.name,
|
|
|
|
|
+ isDefault: true,
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 添加第二张银行卡(不设为默认)
|
|
|
|
|
+ await addBankCardInline(page, {
|
|
|
|
|
+ bankName: '中国建设银行',
|
|
|
|
|
+ subBankName: '上海分行浦东支行',
|
|
|
|
|
+ cardNumber: '6227001234567890123',
|
|
|
|
|
+ cardholderName: testData.name,
|
|
|
|
|
+ isDefault: false,
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 验证默认银行卡是第一张(索引0)
|
|
|
|
|
+ const defaultIndex = await getDefaultBankCardIndex(page);
|
|
|
|
|
+ expect(defaultIndex).toBe(0);
|
|
|
|
|
+ console.debug(' ✓ 默认银行卡是第一张');
|
|
|
|
|
+
|
|
|
|
|
+ // 将第二张设为默认
|
|
|
|
|
+ const defaultSwitch1 = page.locator('[data-testid="default-card-switch-1"]');
|
|
|
|
|
+ await defaultSwitch1.click();
|
|
|
|
|
+ await page.waitForTimeout(TIMEOUTS.SHORT);
|
|
|
|
|
+
|
|
|
|
|
+ // 验证默认银行卡变为第二张,第一张不再是默认
|
|
|
|
|
+ const defaultSwitch0 = page.locator('[data-testid="default-card-switch-0"]');
|
|
|
|
|
+ const isDefault0 = await defaultSwitch0.isChecked();
|
|
|
|
|
+ const isDefault1 = await defaultSwitch1.isChecked();
|
|
|
|
|
+
|
|
|
|
|
+ expect(isDefault0).toBe(false);
|
|
|
|
|
+ expect(isDefault1).toBe(true);
|
|
|
|
|
+ console.debug(' ✓ 默认银行卡已切换到第二张');
|
|
|
|
|
+
|
|
|
|
|
+ console.log('✅ 默认银行卡设置测试通过');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('应该支持选择银行卡类型', async ({ disabilityPersonPage, page }) => {
|
|
|
|
|
+ const testData = generateUniqueTestData('银行卡类型');
|
|
|
|
|
+ createdTestData.push({ name: testData.name, idCard: testData.idCard });
|
|
|
|
|
+
|
|
|
|
|
+ console.log('\n========== 银行卡类型选择测试 ==========');
|
|
|
|
|
+
|
|
|
|
|
+ // 打开对话框并填写基本信息
|
|
|
|
|
+ await disabilityPersonPage.openCreateDialog();
|
|
|
|
|
+ await disabilityPersonPage.fillBasicForm(testData);
|
|
|
|
|
+
|
|
|
|
|
+ // 添加一类卡
|
|
|
|
|
+ await addBankCardInline(page, {
|
|
|
|
|
+ bankName: '中国工商银行',
|
|
|
|
|
+ subBankName: '北京分行朝阳支行',
|
|
|
|
|
+ cardNumber: '6222021234567890123',
|
|
|
|
|
+ cardholderName: testData.name,
|
|
|
|
|
+ cardType: '一类卡',
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 验证银行卡类型
|
|
|
|
|
+ const cardTypeTrigger = page.locator('[data-testid="card-type-select-0"]');
|
|
|
|
|
+ const selectedText = await cardTypeTrigger.textContent();
|
|
|
|
|
+ expect(selectedText).toContain('一类卡');
|
|
|
|
|
+ console.debug(' ✓ 银行卡类型: 一类卡');
|
|
|
|
|
+
|
|
|
|
|
+ console.log('✅ 银行卡类型选择测试通过');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('应该限制最多添加5张银行卡', async ({ disabilityPersonPage, page }) => {
|
|
|
|
|
+ const testData = generateUniqueTestData('银行卡数量限制');
|
|
|
|
|
+ createdTestData.push({ name: testData.name, idCard: testData.idCard });
|
|
|
|
|
+
|
|
|
|
|
+ console.log('\n========== 银行卡数量限制测试 ==========');
|
|
|
|
|
+
|
|
|
|
|
+ // 打开对话框并填写基本信息
|
|
|
|
|
+ await disabilityPersonPage.openCreateDialog();
|
|
|
|
|
+ await disabilityPersonPage.fillBasicForm(testData);
|
|
|
|
|
+
|
|
|
|
|
+ // 滚动到银行卡管理区域
|
|
|
|
|
+ await disabilityPersonPage.scrollToSection('银行卡管理');
|
|
|
|
|
+
|
|
|
|
|
+ // 尝试添加5张银行卡
|
|
|
|
|
+ const banks = ['中国工商银行', '中国建设银行', '中国农业银行', '中国银行', '交通银行'];
|
|
|
|
|
+ for (let i = 0; i < 5; i++) {
|
|
|
|
|
+ await addBankCardInline(page, {
|
|
|
|
|
+ bankName: banks[i],
|
|
|
|
|
+ subBankName: `${i}分行`,
|
|
|
|
|
+ cardNumber: `622202123456789${String(i).padStart(3, '0')}`,
|
|
|
|
|
+ cardholderName: testData.name,
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 验证有5张银行卡
|
|
|
|
|
+ let bankCardList = await getBankCardList(page);
|
|
|
|
|
+ expect(bankCardList).toHaveLength(5);
|
|
|
|
|
+ console.debug(' ✓ 已添加 5 张银行卡');
|
|
|
|
|
+
|
|
|
|
|
+ // 尝试添加第6张银行卡
|
|
|
|
|
+ const addButton = page.locator('[data-testid="add-bank-card-button"]');
|
|
|
|
|
+ const isDisabled = await addButton.isDisabled();
|
|
|
|
|
+ expect(isDisabled).toBe(true);
|
|
|
|
|
+ console.debug(' ✓ 添加按钮已禁用(达到最大数量)');
|
|
|
|
|
+
|
|
|
|
|
+ console.log('✅ 银行卡数量限制测试通过');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('完整流程:添加多张银行卡并提交', async ({ disabilityPersonPage, page }) => {
|
|
|
|
|
+ const testData = generateUniqueTestData('完整流程');
|
|
|
|
|
+ createdTestData.push({ name: testData.name, idCard: testData.idCard });
|
|
|
|
|
+
|
|
|
|
|
+ console.log('\n========== 银行卡完整流程测试 ==========');
|
|
|
|
|
+
|
|
|
|
|
+ // 打开对话框并填写基本信息
|
|
|
|
|
+ await disabilityPersonPage.openCreateDialog();
|
|
|
|
|
+ await disabilityPersonPage.fillBasicForm(testData);
|
|
|
|
|
+
|
|
|
|
|
+ // 滚动到银行卡管理区域
|
|
|
|
|
+ await disabilityPersonPage.scrollToSection('银行卡管理');
|
|
|
|
|
+
|
|
|
|
|
+ // 添加多张银行卡
|
|
|
|
|
+ await addBankCardInline(page, {
|
|
|
|
|
+ bankName: '中国工商银行',
|
|
|
|
|
+ subBankName: '北京分行朝阳支行',
|
|
|
|
|
+ cardNumber: '6222021234567890123',
|
|
|
|
|
+ cardholderName: testData.name,
|
|
|
|
|
+ cardType: '一类卡',
|
|
|
|
|
+ isDefault: true,
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ await addBankCardInline(page, {
|
|
|
|
|
+ bankName: '中国建设银行',
|
|
|
|
|
+ subBankName: '上海分行浦东支行',
|
|
|
|
|
+ cardNumber: '6227001234567890123',
|
|
|
|
|
+ cardholderName: testData.name,
|
|
|
|
|
+ cardType: '二类卡',
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 验证银行卡数量
|
|
|
|
|
+ const bankCardList = await getBankCardList(page);
|
|
|
|
|
+ expect(bankCardList).toHaveLength(2);
|
|
|
|
|
+
|
|
|
|
|
+ // 提交表单
|
|
|
|
|
+ const result = await disabilityPersonPage.submitForm();
|
|
|
|
|
+
|
|
|
|
|
+ console.log('\n========== 测试结果 ==========');
|
|
|
|
|
+ console.log('有错误提示:', result.hasError);
|
|
|
|
|
+ console.log('有成功提示:', result.hasSuccess);
|
|
|
|
|
+
|
|
|
|
|
+ if (result.hasError) {
|
|
|
|
|
+ console.log('错误消息:', result.errorMessage);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (result.hasSuccess) {
|
|
|
|
|
+ console.log('成功消息:', result.successMessage);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 验证对话框关闭
|
|
|
|
|
+ await disabilityPersonPage.waitForDialogClosed();
|
|
|
|
|
+
|
|
|
|
|
+ console.log('✅ 银行卡完整流程测试完成');
|
|
|
|
|
+ });
|
|
|
|
|
+});
|