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