2
0

user.integration.test.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. import { describe, it, expect, beforeEach, afterEach, beforeAll } from 'vitest';
  2. import { DataSource } from 'typeorm';
  3. import { UserServiceMt } from '../../src/services/user.service.mt';
  4. import { RoleServiceMt } from '../../src/services/role.service.mt';
  5. import { UserEntityMt } from '../../src/entities/user.entity';
  6. import { RoleMt } from '../../src/entities/role.entity';
  7. import { AppDataSource, initializeDataSource } from '@d8d/shared-utils';
  8. import { FileMt } from '@d8d/file-module-mt';
  9. // 确保测试环境变量被设置
  10. process.env.NODE_ENV = 'test';
  11. describe('User Integration Tests', () => {
  12. let dataSource: DataSource;
  13. let userService: UserServiceMt;
  14. let roleService: RoleServiceMt;
  15. beforeAll(() => {
  16. // 使用预先配置的数据源
  17. initializeDataSource([UserEntityMt, RoleMt, FileMt])
  18. dataSource = AppDataSource;
  19. })
  20. beforeEach(async () => {
  21. if (!dataSource.isInitialized) {
  22. await dataSource.initialize();
  23. }
  24. userService = new UserServiceMt(dataSource);
  25. roleService = new RoleServiceMt(dataSource);
  26. });
  27. afterEach(async () => {
  28. if (dataSource.isInitialized) {
  29. await dataSource.destroy();
  30. }
  31. });
  32. describe('用户CRUD操作', () => {
  33. it('应该创建并检索用户', async () => {
  34. // Create user
  35. const userData = {
  36. username: 'integrationuser',
  37. password: 'password123',
  38. email: 'integration@example.com',
  39. nickname: 'Integration User',
  40. tenantId: 1
  41. };
  42. const originalUserData = {
  43. ...userData
  44. }
  45. const createdUser = await userService.createUser(userData, 1);
  46. expect(createdUser.id).toBeDefined();
  47. expect(createdUser.username).toBe(userData.username);
  48. expect(createdUser.email).toBe(userData.email);
  49. expect(createdUser.nickname).toBe(userData.nickname);
  50. expect(createdUser.password).not.toBe(originalUserData.password); // Password should be hashed
  51. // Retrieve user
  52. const retrievedUser = await userService.getUserById(createdUser.id);
  53. expect(retrievedUser).toBeDefined();
  54. expect(retrievedUser?.username).toBe(userData.username);
  55. });
  56. it('应该更新用户信息', async () => {
  57. // Create user first
  58. const userData = {
  59. username: 'updateuser',
  60. password: 'password123',
  61. email: 'update@example.com'
  62. };
  63. const createdUser = await userService.createUser(userData, 1);
  64. // Update user
  65. const updateData = {
  66. email: 'updated@example.com',
  67. nickname: 'Updated User'
  68. };
  69. const updatedUser = await userService.updateUser(createdUser.id, updateData);
  70. expect(updatedUser).toBeDefined();
  71. expect(updatedUser?.email).toBe(updateData.email);
  72. expect(updatedUser?.nickname).toBe(updateData.nickname);
  73. });
  74. it('应该删除用户', async () => {
  75. // Create user first
  76. const userData = {
  77. username: 'deleteuser',
  78. password: 'password123'
  79. };
  80. const createdUser = await userService.createUser(userData, 1);
  81. // Delete user
  82. const deleteResult = await userService.deleteUser(createdUser.id);
  83. expect(deleteResult).toBe(true);
  84. // Verify user is deleted
  85. const retrievedUser = await userService.getUserById(createdUser.id);
  86. expect(retrievedUser).toBeNull();
  87. });
  88. it('应该根据用户名获取用户', async () => {
  89. const userData = {
  90. username: 'usernameuser',
  91. password: 'password123'
  92. };
  93. await userService.createUser(userData, 1);
  94. const foundUser = await userService.getUserByUsername('usernameuser');
  95. expect(foundUser).toBeDefined();
  96. expect(foundUser?.username).toBe('usernameuser');
  97. });
  98. it('应该根据账号(用户名或邮箱)获取用户', async () => {
  99. const userData = {
  100. username: 'accountuser',
  101. password: 'password123',
  102. email: 'account@example.com'
  103. };
  104. await userService.createUser(userData, 1);
  105. // Find by username
  106. const byUsername = await userService.getUserByAccount('accountuser');
  107. expect(byUsername).toBeDefined();
  108. expect(byUsername?.username).toBe('accountuser');
  109. // Find by email
  110. const byEmail = await userService.getUserByAccount('account@example.com');
  111. expect(byEmail).toBeDefined();
  112. expect(byEmail?.email).toBe('account@example.com');
  113. });
  114. });
  115. describe('用户角色关系', () => {
  116. it('应该为用户分配角色', async () => {
  117. // Create user
  118. const userData = {
  119. username: 'roleuser',
  120. password: 'password123'
  121. };
  122. const user = await userService.createUser(userData, 1);
  123. // Create roles
  124. const adminRole = await roleService.create({
  125. name: 'admin',
  126. description: 'Administrator role',
  127. permissions: ['user:create', 'user:delete'],
  128. tenantId: 1
  129. });
  130. const userRole = await roleService.create({
  131. name: 'user',
  132. description: 'Regular user role',
  133. permissions: ['user:read'],
  134. tenantId: 1
  135. });
  136. // Assign roles to user
  137. const updatedUser = await userService.assignRoles(user.id, [adminRole.id, userRole.id], 1);
  138. expect(updatedUser).toBeDefined();
  139. expect(updatedUser?.roles).toHaveLength(2);
  140. expect(updatedUser?.roles.map(r => r.name)).toContain('admin');
  141. expect(updatedUser?.roles.map(r => r.name)).toContain('user');
  142. });
  143. });
  144. describe('用户列表操作', () => {
  145. it('应该获取所有用户', async () => {
  146. // Create multiple users
  147. const usersData = [
  148. { username: 'user1', password: 'password123' },
  149. { username: 'user2', password: 'password123' },
  150. { username: 'user3', password: 'password123' }
  151. ];
  152. for (const userData of usersData) {
  153. await userService.createUser(userData, 1);
  154. }
  155. const allUsers = await userService.getUsers();
  156. expect(allUsers).toHaveLength(3);
  157. expect(allUsers.map(u => u.username)).toEqual(
  158. expect.arrayContaining(['user1', 'user2', 'user3'])
  159. );
  160. });
  161. });
  162. describe('密码验证', () => {
  163. it('应该验证正确密码', async () => {
  164. const userData = {
  165. username: 'verifyuser',
  166. password: 'correctpassword'
  167. };
  168. const user = await userService.createUser(userData, 1);
  169. const isCorrect = await userService.verifyPassword(user, 'correctpassword');
  170. expect(isCorrect).toBe(true);
  171. });
  172. it('应该拒绝错误密码', async () => {
  173. const userData = {
  174. username: 'verifyuser2',
  175. password: 'correctpassword'
  176. };
  177. const user = await userService.createUser(userData, 1);
  178. const isCorrect = await userService.verifyPassword(user, 'wrongpassword');
  179. expect(isCorrect).toBe(false);
  180. });
  181. });
  182. });