users.spec.ts 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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. test.describe.serial('用户管理 E2E 测试', () => {
  10. test.beforeEach(async ({ adminLoginPage, userManagementPage }) => {
  11. // 以管理员身份登录后台
  12. await adminLoginPage.goto();
  13. await adminLoginPage.login(testUsers.admin.username, testUsers.admin.password);
  14. await userManagementPage.goto();
  15. });
  16. test('查看用户列表', async ({ userManagementPage }) => {
  17. await userManagementPage.expectToBeVisible();
  18. const userCount = await userManagementPage.getUserCount();
  19. expect(userCount).toBeGreaterThan(0);
  20. });
  21. test('搜索用户', async ({ userManagementPage }) => {
  22. await userManagementPage.searchUsers('admin');
  23. const userCount = await userManagementPage.getUserCount();
  24. expect(userCount).toBeGreaterThan(0);
  25. // 验证搜索结果包含admin用户
  26. const adminUser = await userManagementPage.getUserByUsername('admin');
  27. expect(adminUser).not.toBeNull();
  28. });
  29. test('创建新用户', async ({ userManagementPage }) => {
  30. const testUsername = `testuser_${Date.now()}`;
  31. const testPassword = 'Test123!@#';
  32. await userManagementPage.createUser({
  33. username: testUsername,
  34. password: testPassword,
  35. nickname: '测试用户',
  36. email: `${testUsername}@example.com`,
  37. phone: '13800138000',
  38. name: '测试用户'
  39. });
  40. // 验证用户创建成功
  41. await userManagementPage.expectUserExists(testUsername);
  42. });
  43. test('编辑用户信息', async ({ userManagementPage }) => {
  44. const testUsername = `edituser_${Date.now()}`;
  45. const testPassword = 'Test123!@#';
  46. // 先创建测试用户
  47. await userManagementPage.createUser({
  48. username: testUsername,
  49. password: testPassword,
  50. nickname: '原始昵称',
  51. email: `${testUsername}@example.com`
  52. });
  53. // 编辑用户信息
  54. await userManagementPage.editUser(testUsername, {
  55. nickname: '更新后的昵称',
  56. email: `updated_${testUsername}@example.com`,
  57. phone: '13900139000',
  58. name: '更新姓名'
  59. });
  60. // 验证用户信息已更新
  61. const userRow = await userManagementPage.getUserByUsername(testUsername);
  62. expect(userRow).not.toBeNull();
  63. await expect(userRow!).toContainText('更新后的昵称');
  64. await expect(userRow!).toContainText(`updated_${testUsername}@example.com`);
  65. });
  66. test('删除用户', async ({ userManagementPage }) => {
  67. const testUsername = `deleteuser_${Date.now()}`;
  68. const testPassword = 'Test123!@#';
  69. // 先创建测试用户
  70. await userManagementPage.createUser({
  71. username: testUsername,
  72. password: testPassword,
  73. nickname: '待删除用户',
  74. email: `${testUsername}@example.com`
  75. });
  76. // 验证用户存在
  77. await userManagementPage.expectUserExists(testUsername);
  78. // 删除用户
  79. await userManagementPage.deleteUser(testUsername);
  80. // 验证用户已被删除
  81. await userManagementPage.expectUserNotExists(testUsername);
  82. });
  83. test('用户分页功能', async ({ userManagementPage }) => {
  84. // 确保有足够多的用户来测试分页
  85. const initialCount = await userManagementPage.getUserCount();
  86. if (initialCount < 10) {
  87. // 创建一些测试用户
  88. for (let i = 0; i < 5; i++) {
  89. await userManagementPage.createUser({
  90. username: `pagetest_${Date.now()}_${i}`,
  91. password: 'Test123!@#',
  92. nickname: `分页测试用户 ${i}`
  93. });
  94. }
  95. }
  96. // 搜索并验证分页控件可见
  97. await userManagementPage.searchUsers('');
  98. await expect(userManagementPage.pagination).toBeVisible();
  99. });
  100. test('创建用户验证 - 用户名已存在', async ({ userManagementPage }) => {
  101. // 尝试创建已存在的用户
  102. await userManagementPage.createUser({
  103. username: 'admin',
  104. password: 'Test123!@#',
  105. nickname: '重复用户'
  106. });
  107. // 应该显示错误消息
  108. await expect(userManagementPage.page.locator('text=创建失败')).toBeVisible();
  109. });
  110. test('响应式布局 - 桌面端', async ({ userManagementPage, page }) => {
  111. await page.setViewportSize({ width: 1200, height: 800 });
  112. await userManagementPage.expectToBeVisible();
  113. // 验证桌面端布局元素
  114. await expect(userManagementPage.searchInput).toBeVisible();
  115. await expect(userManagementPage.createUserButton).toBeVisible();
  116. await expect(userManagementPage.userTable).toBeVisible();
  117. });
  118. test('响应式布局 - 移动端', async ({ userManagementPage, page }) => {
  119. await page.setViewportSize({ width: 375, height: 667 });
  120. await userManagementPage.expectToBeVisible();
  121. // 验证移动端布局
  122. await expect(userManagementPage.pageTitle).toBeVisible();
  123. await expect(userManagementPage.searchInput).toBeVisible();
  124. });
  125. test('完整用户管理工作流 - 登录→创建→编辑→删除', async ({ adminLoginPage, userManagementPage, page }) => {
  126. const testUsername = `workflow_${Date.now()}`;
  127. const testPassword = 'Test123!@#';
  128. // 1. 登录系统
  129. await adminLoginPage.goto();
  130. await adminLoginPage.login(testUsers.admin.username, testUsers.admin.password);
  131. // 验证登录成功,跳转到Dashboard
  132. await expect(page).toHaveURL(/.*dashboard/);
  133. await expect(page.locator('text=仪表盘')).toBeVisible();
  134. // 2. 导航到用户管理页面
  135. await userManagementPage.goto();
  136. await userManagementPage.expectToBeVisible();
  137. // 3. 创建新用户
  138. await userManagementPage.createUser({
  139. username: testUsername,
  140. password: testPassword,
  141. nickname: '工作流测试用户',
  142. email: `${testUsername}@example.com`,
  143. phone: '13800138000',
  144. name: '工作流测试'
  145. });
  146. // 验证用户创建成功
  147. await userManagementPage.expectUserExists(testUsername);
  148. // 4. 搜索并编辑用户
  149. await userManagementPage.searchUsers(testUsername);
  150. await userManagementPage.editUser(testUsername, {
  151. nickname: '更新后的工作流用户',
  152. email: `updated_${testUsername}@example.com`,
  153. phone: '13900139000',
  154. name: '更新工作流测试'
  155. });
  156. // 验证用户信息已更新
  157. await userManagementPage.expectUserExists(testUsername);
  158. const userRow = await userManagementPage.getUserByUsername(testUsername);
  159. expect(userRow).not.toBeNull();
  160. // 5. 删除用户
  161. await userManagementPage.deleteUser(testUsername);
  162. // 验证用户已被删除
  163. await userManagementPage.expectUserNotExists(testUsername);
  164. // 6. 返回Dashboard验证状态
  165. await page.goto('/admin/dashboard');
  166. await expect(page.locator('text=仪表盘')).toBeVisible();
  167. await expect(page.locator('text=欢迎回来')).toBeVisible();
  168. });
  169. test('边界条件测试 - 批量操作和错误处理', async ({ userManagementPage }) => {
  170. // 测试空搜索
  171. await userManagementPage.searchUsers('nonexistentuser12345');
  172. const emptyCount = await userManagementPage.getUserCount();
  173. expect(emptyCount).toBe(0);
  174. // 验证空状态提示 - 检查用户计数为0
  175. await expect(userManagementPage.page.locator('text=共 0 位用户')).toBeVisible();
  176. // 测试特殊字符搜索
  177. await userManagementPage.searchUsers('@#$%');
  178. const specialCharCount = await userManagementPage.getUserCount();
  179. expect(specialCharCount).toBe(0);
  180. // 清除搜索
  181. await userManagementPage.searchUsers('');
  182. const normalCount = await userManagementPage.getUserCount();
  183. expect(normalCount).toBeGreaterThan(0);
  184. });
  185. });