region-code-case-sensitive.spec.ts 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. import { TIMEOUTS } from '../../utils/timeouts';
  2. import { test, expect } from '../../utils/test-setup';
  3. import { readFileSync } from 'fs';
  4. import { join, dirname } from 'path';
  5. import { fileURLToPath } from 'url';
  6. const __filename = fileURLToPath(import.meta.url);
  7. const __dirname = dirname(__filename);
  8. const testUsers = JSON.parse(readFileSync(join(__dirname, '../../fixtures/test-users.json'), 'utf-8'));
  9. /**
  10. * 测试区域编码大小写敏感性问题
  11. *
  12. * 测试场景:
  13. * 1. 创建测试省市区数据
  14. * 2. 编辑测试区,尝试使用大写编码 "HPY" 保存
  15. * 3. 捕获控制台错误日志和截图
  16. * 4. 然后尝试使用小写编码 "hpy" 保存
  17. * 5. 对比两种情况的差异
  18. */
  19. test.describe('区域编码大小写敏感性测试', () => {
  20. const createdProvinces: string[] = [];
  21. test.beforeEach(async ({ adminLoginPage, regionManagementPage }) => {
  22. // 以管理员身份登录后台
  23. await adminLoginPage.goto();
  24. await adminLoginPage.login(testUsers.admin.username, testUsers.admin.password);
  25. await adminLoginPage.expectLoginSuccess();
  26. await regionManagementPage.goto();
  27. await regionManagementPage.waitForTreeLoaded();
  28. });
  29. test.afterEach(async ({ regionManagementPage }) => {
  30. // 清理测试创建的数据
  31. for (const provinceName of createdProvinces) {
  32. try {
  33. await regionManagementPage.waitForTreeLoaded();
  34. const exists = await regionManagementPage.regionExists(provinceName);
  35. if (exists) {
  36. await regionManagementPage.deleteRegion(provinceName);
  37. console.debug(`✅ 已清理测试数据: ${provinceName}`);
  38. }
  39. } catch (error) {
  40. console.debug(`❌ 清理异常: ${provinceName}`, error);
  41. }
  42. }
  43. createdProvinces.length = 0;
  44. });
  45. test('测试区域编码 - 大写 "HPY" vs 小写 "hpy" 编码', async ({
  46. regionManagementPage,
  47. page,
  48. }) => {
  49. console.debug('========== 开始测试区域编码大小写敏感性 ==========');
  50. // 生成唯一的测试数据 - 在省一级测试
  51. const timestamp = Date.now();
  52. const provinceName = `测试省_${timestamp}`;
  53. const uppercaseCode = 'HPY';
  54. const lowercaseCode = 'hpy';
  55. // ============ 步骤 1: 创建测试省 ============
  56. console.debug(`步骤 1: 创建测试省数据`);
  57. console.debug(` 创建省: ${provinceName}`);
  58. await regionManagementPage.createProvince({
  59. name: provinceName,
  60. code: `PROV_${timestamp}`,
  61. level: 1,
  62. });
  63. createdProvinces.push(provinceName);
  64. // 刷新页面以确保新数据可见
  65. await regionManagementPage.refreshTree();
  66. // 验证测试省存在
  67. const provinceExists = await regionManagementPage.regionExists(provinceName);
  68. expect(provinceExists).toBe(true);
  69. console.debug(`✅ 测试数据创建成功: "${provinceName}"`);
  70. // ============ 步骤 2: 测试大写编码 "HPY" ============
  71. console.debug(`\n步骤 2: 测试大写编码 "${uppercaseCode}"`);
  72. // 收集控制台日志(创建新的监听器)
  73. const uppercaseConsoleErrors: string[] = [];
  74. const uppercaseConsoleWarnings: string[] = [];
  75. const uppercaseConsoleHandler = (msg: any) => {
  76. const text = msg.text();
  77. const type = msg.type();
  78. if (type === 'error') {
  79. uppercaseConsoleErrors.push(text);
  80. }
  81. if (type === 'warning') {
  82. uppercaseConsoleWarnings.push(text);
  83. }
  84. };
  85. page.on('console', uppercaseConsoleHandler);
  86. // 打开编辑对话框
  87. await regionManagementPage.openEditDialog(provinceName);
  88. // 填写大写编码
  89. const codeInput = page.getByLabel('行政区划代码');
  90. await codeInput.fill(uppercaseCode);
  91. console.debug(`填写编码: "${uppercaseCode}"`);
  92. // 截图 - 大写编码状态
  93. await page.screenshot({
  94. path: `test-results/region-code-uppercase-${Date.now()}.png`,
  95. fullPage: false,
  96. });
  97. console.debug('📸 已截图: 大写编码状态');
  98. // 提交表单并捕获响应
  99. const uppercaseResult = await regionManagementPage.submitForm();
  100. // 等待对话框关闭
  101. await regionManagementPage.waitForDialogClosed();
  102. // 记录大写编码测试结果
  103. console.debug('\n========== 大写编码 "HPY" 测试结果 ==========');
  104. console.debug(`提交成功: ${uppercaseResult.success}`);
  105. console.debug(`有错误: ${uppercaseResult.hasError}`);
  106. console.debug(`有成功消息: ${uppercaseResult.hasSuccess}`);
  107. console.debug(`错误消息: ${uppercaseResult.errorMessage || '无'}`);
  108. console.debug(`成功消息: ${uppercaseResult.successMessage || '无'}`);
  109. // 记录网络响应
  110. if (uppercaseResult.responses && uppercaseResult.responses.length > 0) {
  111. console.debug('\n网络响应:');
  112. for (const response of uppercaseResult.responses) {
  113. console.debug(` URL: ${response.url}`);
  114. console.debug(` 方法: ${response.method}`);
  115. console.debug(` 状态码: ${response.status}`);
  116. console.debug(` 成功: ${response.ok}`);
  117. if (response.status >= 400) {
  118. console.debug(` 响应体: ${JSON.stringify(response.responseBody)}`);
  119. }
  120. }
  121. }
  122. // 记录控制台日志
  123. console.debug('\n控制台错误日志:');
  124. if (uppercaseConsoleErrors.length > 0) {
  125. for (const error of uppercaseConsoleErrors) {
  126. console.debug(` ❌ ${error}`);
  127. }
  128. } else {
  129. console.debug(' (无错误日志)');
  130. }
  131. console.debug('\n控制台警告日志:');
  132. if (uppercaseConsoleWarnings.length > 0) {
  133. for (const warning of uppercaseConsoleWarnings) {
  134. console.debug(` ⚠️ ${warning}`);
  135. }
  136. } else {
  137. console.debug(' (无警告日志)');
  138. }
  139. // 截图 - 大写编码结果
  140. await page.screenshot({
  141. path: `test-results/region-code-uppercase-result-${Date.now()}.png`,
  142. fullPage: false,
  143. });
  144. console.debug('📸 已截图: 大写编码结果');
  145. // 移除控制台监听器
  146. page.off('console', uppercaseConsoleHandler);
  147. // 等待页面稳定
  148. await page.waitForTimeout(TIMEOUTS.LONG);
  149. // ============ 步骤 3: 测试小写编码 "hpy" ============
  150. console.debug(`\n步骤 3: 测试小写编码 "${lowercaseCode}"`);
  151. // 创建新的控制台监听器
  152. const lowercaseConsoleErrors: string[] = [];
  153. const lowercaseConsoleWarnings: string[] = [];
  154. const lowercaseConsoleHandler = (msg: any) => {
  155. const text = msg.text();
  156. const type = msg.type();
  157. if (type === 'error') {
  158. lowercaseConsoleErrors.push(text);
  159. }
  160. if (type === 'warning') {
  161. lowercaseConsoleWarnings.push(text);
  162. }
  163. };
  164. page.on('console', lowercaseConsoleHandler);
  165. // 打开编辑对话框
  166. await regionManagementPage.openEditDialog(provinceName);
  167. // 填写小写编码
  168. await codeInput.fill(lowercaseCode);
  169. console.debug(`填写编码: "${lowercaseCode}"`);
  170. // 截图 - 小写编码状态
  171. await page.screenshot({
  172. path: `test-results/region-code-lowercase-${Date.now()}.png`,
  173. fullPage: false,
  174. });
  175. console.debug('📸 已截图: 小写编码状态');
  176. // 提交表单
  177. const lowercaseResult = await regionManagementPage.submitForm();
  178. // 等待对话框关闭
  179. await regionManagementPage.waitForDialogClosed();
  180. // 记录小写编码测试结果
  181. console.debug('\n========== 小写编码 "hpy" 测试结果 ==========');
  182. console.debug(`提交成功: ${lowercaseResult.success}`);
  183. console.debug(`有错误: ${lowercaseResult.hasError}`);
  184. console.debug(`有成功消息: ${lowercaseResult.hasSuccess}`);
  185. console.debug(`错误消息: ${lowercaseResult.errorMessage || '无'}`);
  186. console.debug(`成功消息: ${lowercaseResult.successMessage || '无'}`);
  187. // 记录网络响应
  188. if (lowercaseResult.responses && lowercaseResult.responses.length > 0) {
  189. console.debug('\n网络响应:');
  190. for (const response of lowercaseResult.responses) {
  191. console.debug(` URL: ${response.url}`);
  192. console.debug(` 方法: ${response.method}`);
  193. console.debug(` 状态码: ${response.status}`);
  194. console.debug(` 成功: ${response.ok}`);
  195. if (response.status >= 400) {
  196. console.debug(` 响应体: ${JSON.stringify(response.responseBody)}`);
  197. }
  198. }
  199. }
  200. // 记录控制台日志
  201. console.debug('\n控制台错误日志:');
  202. if (lowercaseConsoleErrors.length > 0) {
  203. for (const error of lowercaseConsoleErrors) {
  204. console.debug(` ❌ ${error}`);
  205. }
  206. } else {
  207. console.debug(' (无错误日志)');
  208. }
  209. console.debug('\n控制台警告日志:');
  210. if (lowercaseConsoleWarnings.length > 0) {
  211. for (const warning of lowercaseConsoleWarnings) {
  212. console.debug(` ⚠️ ${warning}`);
  213. }
  214. } else {
  215. console.debug(' (无警告日志)');
  216. }
  217. // 移除控制台监听器
  218. page.off('console', lowercaseConsoleHandler);
  219. // 截图 - 小写编码结果
  220. await page.screenshot({
  221. path: `test-results/region-code-lowercase-result-${Date.now()}.png`,
  222. fullPage: false,
  223. });
  224. console.debug('📸 已截图: 小写编码结果');
  225. // ============ 步骤 4: 对比结果 ============
  226. console.debug('\n========== 对比结果 ==========');
  227. console.debug(`大写编码 "${uppercaseCode}" 成功: ${uppercaseResult.success}, 有错误: ${uppercaseResult.hasError}`);
  228. console.debug(`小写编码 "${lowercaseCode}" 成功: ${lowercaseResult.success}, 有错误: ${lowercaseResult.hasError}`);
  229. // 断言:小写编码应该成功
  230. expect(lowercaseResult.success).toBe(true);
  231. expect(lowercaseResult.hasError).toBe(false);
  232. // 如果大写编码失败,记录差异
  233. if (uppercaseResult.hasError && !lowercaseResult.hasError) {
  234. console.debug('\n⚠️ 发现差异:大写编码失败,小写编码成功!');
  235. console.debug(`大写编码错误消息: ${uppercaseResult.errorMessage}`);
  236. }
  237. console.debug('\n========== 测试完成 ==========');
  238. });
  239. });