user.integration.test.ts 6.3 KB

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