user.integ.ts 5.9 KB

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