Parcourir la source

rewrite with vitest

Yuki Takei il y a 1 an
Parent
commit
15b8541e8c

+ 79 - 43
apps/app/src/features/questionnaire/server/service/questionnaire.integ.ts

@@ -1,36 +1,65 @@
-import mongoose from 'mongoose';
+import { Types } from 'mongoose';
+import { mock } from 'vitest-mock-extended';
+
+import pkg from '^/package.json';
+
+
+import type UserEvent from '~/server/events/user';
+import { Config } from '~/server/models/config';
+import { configManager } from '~/server/service/config-manager';
 
-import { getInstance } from '../../../../../test/integration/setup-crowi';
 import type Crowi from '../../../../server/crowi';
 import { StatusType } from '../../interfaces/questionnaire-answer-status';
+import { UserType } from '../../interfaces/user-info';
 import QuestionnaireAnswerStatus from '../models/questionnaire-answer-status';
 import QuestionnaireOrder from '../models/questionnaire-order';
 
+import QuestionnaireService from './questionnaire';
+
+
 describe('QuestionnaireService', () => {
-  let crowi: Crowi;
+  const appVersion = pkg.version;
+
+  let questionnaireService: QuestionnaireService;
+
+  let User;
   let user;
 
   beforeAll(async() => {
     process.env.APP_SITE_URL = 'http://growi.test.jp';
     process.env.DEPLOYMENT_TYPE = 'growi-docker-compose';
     process.env.SAML_ENABLED = 'true';
-    crowi = await getInstance();
 
-    crowi.configManager.updateConfigs({
+    await configManager.loadConfigs();
+    await configManager.updateConfigs({
       'security:passport-saml:isEnabled': true,
       'security:passport-github:isEnabled': true,
     });
 
-    await mongoose.model('Config').create({
+    await Config.create({
       key: 'app:installed',
       value: true,
       createdAt: '2000-01-01',
     });
 
-    crowi.setupQuestionnaireService();
+    const crowiMock = mock<Crowi>({
+      version: appVersion,
+      event: vi.fn().mockImplementation((eventName) => {
+        if (eventName === 'user') {
+          return mock<UserEvent>({
+            on: vi.fn(),
+          });
+        }
+      }),
+      appService: {
+        getSiteUrl: () => 'http://growi.test.jp',
+      },
+    });
+    const userModelFactory = (await import('~/server/models/user')).default;
+    User = userModelFactory(crowiMock);
+    questionnaireService = new QuestionnaireService(crowiMock);
 
-    const User = crowi.model('User');
-    User.deleteMany({}); // clear users
+    await User.deleteMany({}); // clear users
     user = await User.create({
       name: 'Example for Questionnaire Service Test',
       username: 'questionnaire test user',
@@ -42,22 +71,23 @@ describe('QuestionnaireService', () => {
 
   describe('getGrowiInfo', () => {
     test('Should get correct GROWI info', async() => {
-      const growiInfo = await crowi.questionnaireService.getGrowiInfo();
+      const growiInfo = await questionnaireService.getGrowiInfo();
+
+      assert(growiInfo != null);
 
       expect(growiInfo.appSiteUrlHashed).toBeTruthy();
       expect(growiInfo.appSiteUrlHashed).not.toBe('http://growi.test.jp');
-      expect(growiInfo.osInfo.type).toBeTruthy();
-      expect(growiInfo.osInfo.platform).toBeTruthy();
-      expect(growiInfo.osInfo.arch).toBeTruthy();
-      expect(growiInfo.osInfo.totalmem).toBeTruthy();
-
-      delete growiInfo.appSiteUrlHashed;
-      delete growiInfo.currentActiveUsersCount;
-      delete growiInfo.currentUsersCount;
+      expect(growiInfo.osInfo?.type).toBeTruthy();
+      expect(growiInfo.osInfo?.platform).toBeTruthy();
+      expect(growiInfo.osInfo?.arch).toBeTruthy();
+      expect(growiInfo.osInfo?.totalmem).toBeTruthy();
+
+      // eslint-disable-next-line @typescript-eslint/no-explicit-any
+      delete (growiInfo as any).appSiteUrlHashed;
       delete growiInfo.osInfo;
 
       expect(growiInfo).toEqual({
-        version: crowi.version,
+        version: appVersion,
         appSiteUrl: 'http://growi.test.jp',
         type: 'on-premise',
         wikiType: 'closed',
@@ -65,7 +95,7 @@ describe('QuestionnaireService', () => {
         additionalInfo: {
           installedAt: new Date('2000-01-01'),
           installedAtByOldestUser: new Date('2000-01-01'),
-          currentUsersCount: 7,
+          currentUsersCount: 1,
           currentActiveUsersCount: 1,
           attachmentType: 'aws',
           activeExternalAccountTypes: ['saml', 'github'],
@@ -76,11 +106,11 @@ describe('QuestionnaireService', () => {
     describe('When url hash settings is on', () => {
       beforeEach(async() => {
         process.env.QUESTIONNAIRE_IS_APP_SITE_URL_HASHED = 'true';
-        await crowi.setupConfigManager();
+        await configManager.loadConfigs();
       });
 
       test('Should return app url string', async() => {
-        const growiInfo = await crowi.questionnaireService.getGrowiInfo();
+        const growiInfo = await questionnaireService.getGrowiInfo();
         expect(growiInfo.appSiteUrl).toBeUndefined();
         expect(growiInfo.appSiteUrlHashed).not.toBe('http://growi.test.jp');
         expect(growiInfo.appSiteUrlHashed).toBeTruthy();
@@ -90,17 +120,24 @@ describe('QuestionnaireService', () => {
 
   describe('getUserInfo', () => {
     test('Should get correct user info when user given', () => {
-      const userInfo = crowi.questionnaireService.getUserInfo(user, 'growiurlhashfortest');
+      const userInfo = questionnaireService.getUserInfo(user, 'growiurlhashfortest');
+      expect(userInfo).not.toBeNull();
+      assert(userInfo != null);
+
+      expect(userInfo.type).equal(UserType.general);
+      assert(userInfo.type === UserType.general);
+
       expect(userInfo.userIdHash).toBeTruthy();
       expect(userInfo.userIdHash).not.toBe(user._id);
 
-      delete userInfo.userIdHash;
+      // eslint-disable-next-line @typescript-eslint/no-explicit-any
+      delete (userInfo as any).userIdHash;
 
       expect(userInfo).toEqual({ type: 'general', userCreatedAt: new Date('2000-01-01') });
     });
 
     test('Should get correct user info when user is null', () => {
-      const userInfo = crowi.questionnaireService.getUserInfo(null, '');
+      const userInfo = questionnaireService.getUserInfo(null, '');
       expect(userInfo).toEqual({ type: 'guest' });
     });
   });
@@ -141,7 +178,7 @@ describe('QuestionnaireService', () => {
           },
           growi: {
             types: ['on-premise'],
-            versionRegExps: [crowi.version],
+            versionRegExps: [appVersion],
           },
         },
         createdAt: '2023-01-01',
@@ -165,7 +202,7 @@ describe('QuestionnaireService', () => {
           },
           growi: {
             types: ['on-premise'],
-            versionRegExps: [crowi.version],
+            versionRegExps: [appVersion],
           },
         },
       });
@@ -185,7 +222,7 @@ describe('QuestionnaireService', () => {
             },
             growi: {
               types: ['cloud'],
-              versionRegExps: [crowi.version],
+              versionRegExps: [appVersion],
             },
           },
         },
@@ -218,7 +255,7 @@ describe('QuestionnaireService', () => {
             },
             growi: {
               types: ['on-premise'],
-              versionRegExps: [crowi.version],
+              versionRegExps: [appVersion],
             },
           },
         },
@@ -236,7 +273,7 @@ describe('QuestionnaireService', () => {
             },
             growi: {
               types: ['on-premise'],
-              versionRegExps: [crowi.version],
+              versionRegExps: [appVersion],
             },
           },
         },
@@ -255,7 +292,7 @@ describe('QuestionnaireService', () => {
             },
             growi: {
               types: ['on-premise'],
-              versionRegExps: [crowi.version],
+              versionRegExps: [appVersion],
             },
           },
         },
@@ -281,17 +318,13 @@ describe('QuestionnaireService', () => {
     });
 
     test('Should get questionnaire orders to show', async() => {
-      const growiInfo = await crowi.questionnaireService.getGrowiInfo();
-      const userInfo = crowi.questionnaireService.getUserInfo(user, growiInfo.appSiteUrlHashed);
-      const questionnaireOrderDocuments = await crowi.questionnaireService.getQuestionnaireOrdersToShow(userInfo, growiInfo, user._id);
-      const questionnaireOrderObjects = questionnaireOrderDocuments.map((document) => {
-        const qo = document.toObject();
-        delete qo.condition._id;
-        return { ...qo, _id: qo._id.toString() };
-      });
-      expect(questionnaireOrderObjects).toEqual([
+      const growiInfo = await questionnaireService.getGrowiInfo();
+      const userInfo = questionnaireService.getUserInfo(user, growiInfo.appSiteUrlHashed);
+
+      const questionnaireOrderDocuments = await questionnaireService.getQuestionnaireOrdersToShow(userInfo, growiInfo, user._id);
+
+      expect(questionnaireOrderDocuments[0].toObject()).toMatchObject(
         {
-          _id: doc1._id.toString(),
           __v: 0,
           shortTitle: {
             ja_JP: 'GROWI に関するアンケート',
@@ -314,13 +347,16 @@ describe('QuestionnaireService', () => {
             },
             growi: {
               types: ['on-premise'],
-              versionRegExps: [crowi?.version],
+              versionRegExps: [appVersion],
             },
           },
           createdAt: new Date('2023-01-01'),
           updatedAt: new Date('2023-01-01'),
         },
-      ]);
+      );
+
     });
+
   });
+
 });