user.integration.test.ts 6.5 KB

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