user.integ.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import type mongoose from 'mongoose';
  2. import { mock } from 'vitest-mock-extended';
  3. import type Crowi from '~/server/crowi';
  4. import type UserEvent from '~/server/events/user';
  5. import { configManager } from '~/server/service/config-manager';
  6. import type { S2sMessagingService } from '~/server/service/s2s-messaging/base';
  7. import { UserStatus } from './conts';
  8. describe('User', () => {
  9. let User: any;
  10. let adminusertestToBeRemovedId: mongoose.Types.ObjectId;
  11. beforeAll(async () => {
  12. // Initialize configManager
  13. const s2sMessagingServiceMock = mock<S2sMessagingService>();
  14. configManager.setS2sMessagingService(s2sMessagingServiceMock);
  15. await configManager.loadConfigs();
  16. // Mock Crowi instance with required properties
  17. const crowiMock = mock<Crowi>({
  18. events: {
  19. user: mock<UserEvent>({
  20. on: vi.fn(),
  21. }),
  22. },
  23. env: {
  24. PASSWORD_SEED: 'testPasswordSeed',
  25. },
  26. });
  27. // Initialize User model with mocked Crowi using dynamic import
  28. const userModule = await import('./index');
  29. const userFactory = userModule.default;
  30. User = userFactory(crowiMock);
  31. await User.insertMany([
  32. {
  33. name: 'Example for User Test',
  34. username: 'usertest',
  35. email: 'usertest@example.com',
  36. password: 'usertestpass',
  37. lang: 'en_US',
  38. },
  39. {
  40. name: 'Admin Example Active',
  41. username: 'adminusertest1',
  42. email: 'adminusertest1@example.com',
  43. password: 'adminusertestpass',
  44. admin: true,
  45. status: UserStatus.STATUS_ACTIVE,
  46. lang: 'en_US',
  47. },
  48. {
  49. name: 'Admin Example Suspended',
  50. username: 'adminusertest2',
  51. email: 'adminusertes2@example.com',
  52. password: 'adminusertestpass',
  53. admin: true,
  54. status: UserStatus.STATUS_SUSPENDED,
  55. lang: 'en_US',
  56. },
  57. {
  58. name: 'Admin Example to delete',
  59. username: 'adminusertestToBeRemoved',
  60. email: 'adminusertestToBeRemoved@example.com',
  61. password: 'adminusertestpass',
  62. admin: true,
  63. status: UserStatus.STATUS_ACTIVE,
  64. lang: 'en_US',
  65. },
  66. ]);
  67. // delete adminusertestToBeRemoved
  68. const adminusertestToBeRemoved = await User.findOne({
  69. username: 'adminusertestToBeRemoved',
  70. });
  71. adminusertestToBeRemovedId = adminusertestToBeRemoved._id;
  72. await adminusertestToBeRemoved.statusDelete();
  73. });
  74. describe('Create and Find.', () => {
  75. describe('The user', () => {
  76. test('should created with createUserByEmailAndPassword', async () => {
  77. await new Promise<void>((resolve, reject) => {
  78. User.createUserByEmailAndPassword(
  79. 'Example2 for User Test',
  80. 'usertest2',
  81. 'usertest2@example.com',
  82. 'usertest2pass',
  83. 'en_US',
  84. (err: Error | null, userData: typeof User) => {
  85. try {
  86. expect(err).toBeNull();
  87. expect(userData).toBeInstanceOf(User);
  88. expect(userData.name).toBe('Example2 for User Test');
  89. resolve();
  90. } catch (error) {
  91. reject(error);
  92. }
  93. },
  94. );
  95. });
  96. });
  97. test('should be found by findUserByUsername', async () => {
  98. const user = await User.findUserByUsername('usertest');
  99. expect(user).toBeInstanceOf(User);
  100. expect(user.name).toBe('Example for User Test');
  101. });
  102. });
  103. });
  104. describe('Delete.', () => {
  105. describe('Deleted users', () => {
  106. test('should have correct attributes', async () => {
  107. const adminusertestToBeRemoved = await User.findOne({
  108. _id: adminusertestToBeRemovedId,
  109. });
  110. expect(adminusertestToBeRemoved).toBeInstanceOf(User);
  111. expect(adminusertestToBeRemoved.name).toBe('');
  112. expect(adminusertestToBeRemoved.password).toBe('');
  113. expect(adminusertestToBeRemoved.googleId).toBeNull();
  114. expect(adminusertestToBeRemoved.isGravatarEnabled).toBeFalsy();
  115. expect(adminusertestToBeRemoved.image).toBeNull();
  116. });
  117. });
  118. });
  119. describe('User.findAdmins', () => {
  120. test('should retrieves only active users', async () => {
  121. const users = await User.findAdmins();
  122. const adminusertestActive = users.find(
  123. (user: { username: string }) => user.username === 'adminusertest1',
  124. );
  125. const adminusertestSuspended = users.find(
  126. (user: { username: string }) => user.username === 'adminusertest2',
  127. );
  128. const adminusertestToBeRemoved = users.find(
  129. (user: { _id: mongoose.Types.ObjectId }) =>
  130. user._id.toString() === adminusertestToBeRemovedId.toString(),
  131. );
  132. expect(adminusertestActive).toBeInstanceOf(User);
  133. expect(adminusertestSuspended).toBeUndefined();
  134. expect(adminusertestToBeRemoved).toBeUndefined();
  135. });
  136. test("with 'includesInactive' option should retrieves suspended users", async () => {
  137. const users = await User.findAdmins({
  138. status: [UserStatus.STATUS_ACTIVE, UserStatus.STATUS_SUSPENDED],
  139. });
  140. const adminusertestActive = users.find(
  141. (user: { username: string }) => user.username === 'adminusertest1',
  142. );
  143. const adminusertestSuspended = users.find(
  144. (user: { username: string }) => user.username === 'adminusertest2',
  145. );
  146. const adminusertestToBeRemoved = users.find(
  147. (user: { _id: mongoose.Types.ObjectId }) =>
  148. user._id.toString() === adminusertestToBeRemovedId.toString(),
  149. );
  150. expect(adminusertestActive).toBeInstanceOf(User);
  151. expect(adminusertestSuspended).toBeInstanceOf(User);
  152. expect(adminusertestToBeRemoved).toBeUndefined();
  153. });
  154. });
  155. describe('User Utilities', () => {
  156. describe('Get user exists from user page path', () => {
  157. test('found', async () => {
  158. const userPagePath = '/user/usertest';
  159. const isExist = await User.isExistUserByUserPagePath(userPagePath);
  160. expect(isExist).toBe(true);
  161. });
  162. test('not found', async () => {
  163. const userPagePath = '/user/usertest-hoge';
  164. const isExist = await User.isExistUserByUserPagePath(userPagePath);
  165. expect(isExist).toBe(false);
  166. });
  167. });
  168. });
  169. });