bank-name-search.spec.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import { test, expect } from '../../utils/test-setup';
  2. import { readFileSync } from 'fs';
  3. import { join, dirname } from 'path';
  4. import { fileURLToPath } from 'url';
  5. const __filename = fileURLToPath(import.meta.url);
  6. const __dirname = dirname(__filename);
  7. const testUsers = JSON.parse(readFileSync(join(__dirname, '../../fixtures/test-users.json'), 'utf-8'));
  8. test.describe.serial('银行名称功能验证', () => {
  9. test.beforeEach(async ({ adminLoginPage }) => {
  10. await adminLoginPage.goto();
  11. await adminLoginPage.login(testUsers.admin.username, testUsers.admin.password);
  12. await adminLoginPage.expectLoginSuccess();
  13. });
  14. test('输入中文后按 Enter 键不应该刷新页面', async ({ page }) => {
  15. console.log('1. 导航到银行名称管理页面...');
  16. await page.goto('http://localhost:8080/admin/bank-names');
  17. await page.waitForLoadState('domcontentloaded');
  18. await page.waitForTimeout(1000);
  19. console.log('2. 查找搜索输入框...');
  20. const searchInput = page.getByTestId('search-input');
  21. await expect(searchInput).toBeVisible();
  22. console.log('3. 输入中文"中国"...');
  23. await searchInput.fill('中国');
  24. await page.waitForTimeout(500);
  25. const beforeValue = await searchInput.inputValue();
  26. console.log('输入后的值:', beforeValue);
  27. console.log('4. 按 Enter 键...');
  28. await searchInput.press('Enter');
  29. await page.waitForTimeout(1000);
  30. const afterValue = await searchInput.inputValue();
  31. console.log('按 Enter 后的值:', afterValue);
  32. // 验证搜索内容保持不变
  33. expect(afterValue).toBe('中国');
  34. // 清空搜索内容
  35. await searchInput.fill('');
  36. await page.waitForTimeout(500);
  37. // 截图验证
  38. await page.screenshot({ path: 'test-results/bank-search-verification.png' });
  39. console.log('截图已保存到 test-results/bank-search-verification.png');
  40. });
  41. test('应该能够成功删除银行记录', async ({ page }) => {
  42. console.log('1. 导航到银行名称管理页面...');
  43. await page.goto('http://localhost:8080/admin/bank-names');
  44. await page.waitForLoadState('domcontentloaded');
  45. await page.waitForTimeout(1000);
  46. // 查找删除按钮
  47. console.log('2. 查找删除按钮...');
  48. const deleteButtons = page.locator('button[data-testid^="delete-button-"]');
  49. const count = await deleteButtons.count();
  50. console.log(' 找到 ' + count + ' 个删除按钮');
  51. if (count === 0) {
  52. console.log(' ⚠ 没有找到删除按钮');
  53. const tbodyRows = await page.locator('tbody tr').count();
  54. console.log(' tbody tr 数量: ' + tbodyRows);
  55. test.skip();
  56. return;
  57. }
  58. expect(count, '应该找到至少一个删除按钮').toBeGreaterThan(0);
  59. // 获取第一个删除按钮
  60. const firstButton = deleteButtons.first();
  61. const firstTestId = await firstButton.getAttribute('data-testid');
  62. console.log(' 使用删除按钮: ' + firstTestId);
  63. // 提取银行 ID
  64. const bankId = firstTestId?.replace('delete-button-', '') || '';
  65. // 获取删除前的记录数量
  66. const tableRows = page.locator('tr[data-testid^="type-row-"]');
  67. const initialCount = await tableRows.count();
  68. console.log(' 删除前有 ' + initialCount + ' 条记录');
  69. // 点击删除按钮
  70. console.log('3. 点击删除按钮...');
  71. await firstButton.click();
  72. await page.waitForTimeout(1500);
  73. await page.screenshot({ path: 'test-results/bank-delete-final-2-confirm.png' });
  74. // 验证删除对话框出现
  75. console.log('4. 验证删除对话框...');
  76. const deleteDialog = page.locator('[data-testid="delete-dialog"]');
  77. await expect(deleteDialog, '删除对话框应该出现').toBeVisible({ timeout: 5000 });
  78. console.log(' ✓ 删除对话框已出现');
  79. // 点击确认删除
  80. console.log('5. 点击确认删除...');
  81. const confirmButton = page.locator('[data-testid="delete-confirm-button"]');
  82. await confirmButton.click();
  83. // 等待删除完成
  84. await page.waitForTimeout(5000);
  85. await page.screenshot({ path: 'test-results/bank-delete-final-3-after.png' });
  86. // 检查结果
  87. console.log('6. 检查删除结果...');
  88. // 检查是否有错误提示
  89. const errorToast = page.locator('[data-sonner-toast][data-type="error"]');
  90. const hasError = await errorToast.isVisible({ timeout: 1000 }).catch(() => false);
  91. if (hasError) {
  92. const errorText = await errorToast.innerText();
  93. console.log(' 错误提示: "' + errorText + '"');
  94. if (errorText.includes('foreign key constraint') || errorText.includes('外键约束')) {
  95. console.log(' ⚠ 外键约束错误 - 该记录被引用,无法删除');
  96. console.log(' ✓ 删除功能本身工作正常,只是该记录不能被删除');
  97. // 验证对话框仍然显示
  98. const dialogStillVisible = await deleteDialog.isVisible().catch(() => false);
  99. expect(dialogStillVisible, '外键约束错误时对话框应保持打开').toBe(true);
  100. console.log(' ✓ 对话框保持打开状态');
  101. return;
  102. }
  103. throw new Error('删除失败: ' + errorText);
  104. }
  105. // 验证删除对话框已关闭
  106. const dialogStillVisible = await deleteDialog.isVisible().catch(() => false);
  107. console.log(' 删除对话框是否仍可见: ' + dialogStillVisible);
  108. expect(dialogStillVisible, '删除成功后对话框应该关闭').toBe(false);
  109. console.log(' ✓ 删除对话框已关闭');
  110. // 验证记录数量减少
  111. const finalCount = await tableRows.count();
  112. console.log(' 删除后有 ' + finalCount + ' 条记录');
  113. expect(finalCount, '记录数量应该减少').toBeLessThan(initialCount);
  114. console.log(' ✓ 记录数量已减少');
  115. // 验证已删除的记录不再显示
  116. if (bankId) {
  117. const deletedRow = page.locator(`tr[data-testid="type-row-${bankId}"]`);
  118. const deletedRowVisible = await deletedRow.isVisible().catch(() => false);
  119. expect(deletedRowVisible, '已删除的记录不应再显示').toBe(false);
  120. console.log(' ✓ 已删除的记录不再显示');
  121. }
  122. console.log('7. 测试完成 ✓');
  123. });
  124. });