2
0

user.integration.test.ts 6.4 KB

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