user.integration.test.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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. expect(createdUser.id).toBeDefined();
  45. expect(createdUser.username).toBe(userData.username);
  46. expect(createdUser.email).toBe(userData.email);
  47. expect(createdUser.nickname).toBe(userData.nickname);
  48. expect(createdUser.password).not.toBe(originalUserData.password); // Password should be hashed
  49. // Retrieve user
  50. const retrievedUser = await userService.getUserById(createdUser.id);
  51. expect(retrievedUser).toBeDefined();
  52. expect(retrievedUser?.username).toBe(userData.username);
  53. });
  54. it('should update user information', async () => {
  55. // Create user first
  56. const userData = {
  57. username: 'updateuser',
  58. password: 'password123',
  59. email: 'update@example.com'
  60. };
  61. const createdUser = await userService.createUser(userData);
  62. // Update user
  63. const updateData = {
  64. email: 'updated@example.com',
  65. nickname: 'Updated User'
  66. };
  67. const updatedUser = await userService.updateUser(createdUser.id, updateData);
  68. expect(updatedUser).toBeDefined();
  69. expect(updatedUser?.email).toBe(updateData.email);
  70. expect(updatedUser?.nickname).toBe(updateData.nickname);
  71. });
  72. it('should delete user', async () => {
  73. // Create user first
  74. const userData = {
  75. username: 'deleteuser',
  76. password: 'password123'
  77. };
  78. const createdUser = await userService.createUser(userData);
  79. // Delete user
  80. const deleteResult = await userService.deleteUser(createdUser.id);
  81. expect(deleteResult).toBe(true);
  82. // Verify user is deleted
  83. const retrievedUser = await userService.getUserById(createdUser.id);
  84. expect(retrievedUser).toBeNull();
  85. });
  86. it('should get user by username', async () => {
  87. const userData = {
  88. username: 'usernameuser',
  89. password: 'password123'
  90. };
  91. await userService.createUser(userData);
  92. const foundUser = await userService.getUserByUsername('usernameuser');
  93. expect(foundUser).toBeDefined();
  94. expect(foundUser?.username).toBe('usernameuser');
  95. });
  96. it('should get user by account (username or email)', async () => {
  97. const userData = {
  98. username: 'accountuser',
  99. password: 'password123',
  100. email: 'account@example.com'
  101. };
  102. await userService.createUser(userData);
  103. // Find by username
  104. const byUsername = await userService.getUserByAccount('accountuser');
  105. expect(byUsername).toBeDefined();
  106. expect(byUsername?.username).toBe('accountuser');
  107. // Find by email
  108. const byEmail = await userService.getUserByAccount('account@example.com');
  109. expect(byEmail).toBeDefined();
  110. expect(byEmail?.email).toBe('account@example.com');
  111. });
  112. });
  113. describe('User-Role Relationship', () => {
  114. it('should assign roles to user', async () => {
  115. // Create user
  116. const userData = {
  117. username: 'roleuser',
  118. password: 'password123'
  119. };
  120. const user = await userService.createUser(userData);
  121. // Create roles
  122. const adminRole = await roleService.create({
  123. name: 'admin',
  124. description: 'Administrator role',
  125. permissions: ['user:create', 'user:delete']
  126. });
  127. const userRole = await roleService.create({
  128. name: 'user',
  129. description: 'Regular user role',
  130. permissions: ['user:read']
  131. });
  132. // Assign roles to user
  133. const updatedUser = await userService.assignRoles(user.id, [adminRole.id, userRole.id]);
  134. expect(updatedUser).toBeDefined();
  135. expect(updatedUser?.roles).toHaveLength(2);
  136. expect(updatedUser?.roles.map(r => r.name)).toContain('admin');
  137. expect(updatedUser?.roles.map(r => r.name)).toContain('user');
  138. });
  139. });
  140. describe('User List Operations', () => {
  141. it('should get all users', async () => {
  142. // Create multiple users
  143. const usersData = [
  144. { username: 'user1', password: 'password123' },
  145. { username: 'user2', password: 'password123' },
  146. { username: 'user3', password: 'password123' }
  147. ];
  148. for (const userData of usersData) {
  149. await userService.createUser(userData);
  150. }
  151. const allUsers = await userService.getUsers();
  152. expect(allUsers).toHaveLength(3);
  153. expect(allUsers.map(u => u.username)).toEqual(
  154. expect.arrayContaining(['user1', 'user2', 'user3'])
  155. );
  156. });
  157. });
  158. describe('Password Verification', () => {
  159. it('should verify correct password', async () => {
  160. const userData = {
  161. username: 'verifyuser',
  162. password: 'correctpassword'
  163. };
  164. const user = await userService.createUser(userData);
  165. const isCorrect = await userService.verifyPassword(user, 'correctpassword');
  166. expect(isCorrect).toBe(true);
  167. });
  168. it('should reject incorrect password', async () => {
  169. const userData = {
  170. username: 'verifyuser2',
  171. password: 'correctpassword'
  172. };
  173. const user = await userService.createUser(userData);
  174. const isCorrect = await userService.verifyPassword(user, 'wrongpassword');
  175. expect(isCorrect).toBe(false);
  176. });
  177. });
  178. });