user.integration.test.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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 { File } from '@d8d/file-module';
  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, File])
  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('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. tenantId: 1
  41. };
  42. const originalUserData = {
  43. ...userData
  44. }
  45. const createdUser = await userService.createUser(userData);
  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('should update user information', 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);
  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('should delete user', async () => {
  75. // Create user first
  76. const userData = {
  77. username: 'deleteuser',
  78. password: 'password123'
  79. };
  80. const createdUser = await userService.createUser(userData);
  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('should get user by username', async () => {
  89. const userData = {
  90. username: 'usernameuser',
  91. password: 'password123'
  92. };
  93. await userService.createUser(userData);
  94. const foundUser = await userService.getUserByUsername('usernameuser');
  95. expect(foundUser).toBeDefined();
  96. expect(foundUser?.username).toBe('usernameuser');
  97. });
  98. it('should get user by account (username or email)', async () => {
  99. const userData = {
  100. username: 'accountuser',
  101. password: 'password123',
  102. email: 'account@example.com'
  103. };
  104. await userService.createUser(userData);
  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('User-Role Relationship', () => {
  116. it('should assign roles to user', async () => {
  117. // Create user
  118. const userData = {
  119. username: 'roleuser',
  120. password: 'password123'
  121. };
  122. const user = await userService.createUser(userData);
  123. // Create roles
  124. const adminRole = await roleService.create({
  125. name: 'admin',
  126. description: 'Administrator role',
  127. permissions: ['user:create', 'user:delete']
  128. });
  129. const userRole = await roleService.create({
  130. name: 'user',
  131. description: 'Regular user role',
  132. permissions: ['user:read']
  133. });
  134. // Assign roles to user
  135. const updatedUser = await userService.assignRoles(user.id, [adminRole.id, userRole.id]);
  136. expect(updatedUser).toBeDefined();
  137. expect(updatedUser?.roles).toHaveLength(2);
  138. expect(updatedUser?.roles.map(r => r.name)).toContain('admin');
  139. expect(updatedUser?.roles.map(r => r.name)).toContain('user');
  140. });
  141. });
  142. describe('User List Operations', () => {
  143. it('should get all users', async () => {
  144. // Create multiple users
  145. const usersData = [
  146. { username: 'user1', password: 'password123' },
  147. { username: 'user2', password: 'password123' },
  148. { username: 'user3', password: 'password123' }
  149. ];
  150. for (const userData of usersData) {
  151. await userService.createUser(userData);
  152. }
  153. const allUsers = await userService.getUsers();
  154. expect(allUsers).toHaveLength(3);
  155. expect(allUsers.map(u => u.username)).toEqual(
  156. expect.arrayContaining(['user1', 'user2', 'user3'])
  157. );
  158. });
  159. });
  160. describe('Password Verification', () => {
  161. it('should verify correct password', async () => {
  162. const userData = {
  163. username: 'verifyuser',
  164. password: 'correctpassword'
  165. };
  166. const user = await userService.createUser(userData);
  167. const isCorrect = await userService.verifyPassword(user, 'correctpassword');
  168. expect(isCorrect).toBe(true);
  169. });
  170. it('should reject incorrect password', async () => {
  171. const userData = {
  172. username: 'verifyuser2',
  173. password: 'correctpassword'
  174. };
  175. const user = await userService.createUser(userData);
  176. const isCorrect = await userService.verifyPassword(user, 'wrongpassword');
  177. expect(isCorrect).toBe(false);
  178. });
  179. });
  180. });