2
0

user.integration.test.ts 6.6 KB

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