Kaynağa Gözat

refs 112133: questionnaire cron test

Futa Arai 3 yıl önce
ebeveyn
işleme
e6a4dbfc29

+ 1 - 0
packages/app/src/server/crowi/index.js

@@ -306,6 +306,7 @@ Crowi.prototype.setupModels = async function() {
   Object.keys(allModels).forEach((key) => {
     return this.model(key, models[key](this));
   });
+
 };
 
 Crowi.prototype.setupCron = function() {

+ 9 - 7
packages/app/src/server/service/questionnaire-cron.ts

@@ -4,7 +4,7 @@ import QuestionnaireOrder, { QuestionnaireOrderDocument } from '../models/questi
 
 const nodeCron = require('node-cron');
 
-const getRandomInt = (min: number, max: number): number => {
+export const getRandomInt = (min: number, max: number): number => {
   const minInt = Math.ceil(min);
   const maxInt = Math.floor(max);
   return Math.floor(Math.random() * (maxInt - minInt) + minInt);
@@ -29,6 +29,8 @@ class QuestionnaireCronService {
     this.maxHoursUntilRequest = crowi.configManager?.getConfig('crowi', 'app:questionnaireCronMaxHoursUntilRequest');
 
     const maxSecondsUntilRequest = this.maxHoursUntilRequest * 60 * 60;
+    // const maxSecondsUntilRequest = 60;
+    // this.cronSchedule = '* * * * *';
 
     this.cronJob = this.questionnaireOrderGetCron(this.cronSchedule, maxSecondsUntilRequest);
   }
@@ -43,10 +45,10 @@ class QuestionnaireCronService {
 
   private questionnaireOrderGetCron(cronSchedule: string, maxSecondsUntilRequest: number) {
     const saveOrders = async(questionnaireOrders: QuestionnaireOrderDocument[]) => {
-      console.log('こんにちは');
       const savedOrders: QuestionnaireOrderDocument[] = await QuestionnaireOrder.find();
-      console.log(savedOrders);
       const savedOrderIds = savedOrders.map(order => order._id.toString());
+      console.log(savedOrderIds);
+      console.log(questionnaireOrders);
       // 渡されたアンケートのうち未保存のものを保存する
       const nonSavedOrders = questionnaireOrders.filter(order => !savedOrderIds.includes(order._id));
       QuestionnaireOrder.insertMany(nonSavedOrders);
@@ -54,6 +56,7 @@ class QuestionnaireCronService {
 
     const deleteFinishedOrders = async() => {
       const currentDate = new Date(Date.now());
+
       await QuestionnaireOrder.deleteMany({
         showUntil: {
           $lt: currentDate,
@@ -67,15 +70,14 @@ class QuestionnaireCronService {
 
       await sleep(secToSleep * 1000);
 
+      console.log('executed');
+
       try {
         const response = await axios.get(`${this.growiQuestionnaireUri}/questionnaire-order/index`);
-        console.log(response.data);
-        const questionnaireOrders: QuestionnaireOrderDocument[] = JSON.parse(JSON.stringify(response.data)).questionnaireQrders;
+        const questionnaireOrders: QuestionnaireOrderDocument[] = response.data.questionnaireOrders;
 
         await saveOrders(questionnaireOrders);
         await deleteFinishedOrders();
-
-        console.log('executed');
       }
       catch (e) {
         console.log(e);

+ 62 - 47
packages/app/test/integration/service/questionnaire-cron.test.ts

@@ -1,16 +1,24 @@
 import QuestionnaireOrder from '../../../src/server/models/questionnaire/questionnaire-order';
+import * as questionnaireCron from '../../../src/server/service/questionnaire-cron';
 import axios from '../../../src/utils/axios';
 import { getInstance } from '../setup-crowi';
 
-
 const spyAxiosGet = jest.spyOn<typeof axios, 'get'>(
   axios,
   'get',
 );
 
+const spyGetRandomInt = jest.spyOn<typeof questionnaireCron, 'getRandomInt'>(
+  questionnaireCron,
+  'getRandomInt',
+);
+
 describe('QuestionnaireCronService', () => {
   let crowi;
 
+  const maxSecondsUntilRequest = 4 * 60 * 60 * 1000;
+  const secondsUntilRequest = questionnaireCron.getRandomInt(0, maxSecondsUntilRequest);
+
   const mockResponse = {
     data: {
       questionnaireOrders: [
@@ -68,48 +76,49 @@ describe('QuestionnaireCronService', () => {
     // reload
     await crowi.setupConfigManager();
 
-    // await QuestionnaireOrder.insertMany([
-    //   {
-    //     _id: '63a8354837e7aa378e16f0b1',
-    //     showFrom: '2021-12-11',
-    //     showUntil: '2022-12-12',
-    //     questions: [
-    //       {
-    //         type: 'points',
-    //         text: 'アンケート機能は支障なく動いていますか?',
-    //       },
-    //     ],
-    //     condition: {
-    //       user: {
-    //         types: ['general'],
-    //       },
-    //       growi: {
-    //         types: ['cloud'],
-    //         versionRegExps: ['2\\.0\\.[0-9]', '1\\.9\\.[0-9]'],
-    //       },
-    //     },
-    //   },
-    //   {
-    //     _id: '63a8354837e7aa378e16f0b3',
-    //     showFrom: '2020-12-11',
-    //     showUntil: '2021-12-12',
-    //     questions: [
-    //       {
-    //         type: 'points',
-    //         text: '最近どうですか?',
-    //       },
-    //     ],
-    //     condition: {
-    //       user: {
-    //         types: ['general'],
-    //       },
-    //       growi: {
-    //         types: ['cloud'],
-    //         versionRegExps: ['2\\.0\\.[0-9]', '1\\.9\\.[0-9]'],
-    //       },
-    //     },
-    //   },
-    // ]);
+    await QuestionnaireOrder.insertMany([
+      {
+        _id: '63a8354837e7aa378e16f0b1',
+        showFrom: '2021-12-11',
+        showUntil: '2100-12-12',
+        questions: [
+          {
+            type: 'points',
+            text: 'アンケート機能は支障なく動いていますか?',
+          },
+        ],
+        condition: {
+          user: {
+            types: ['general'],
+          },
+          growi: {
+            types: ['cloud'],
+            versionRegExps: ['2\\.0\\.[0-9]', '1\\.9\\.[0-9]'],
+          },
+        },
+      },
+      // 期限切れ
+      {
+        _id: '63a8354837e7aa378e16f0b3',
+        showFrom: '2020-12-11',
+        showUntil: '2021-12-12',
+        questions: [
+          {
+            type: 'points',
+            text: '最近どうですか?',
+          },
+        ],
+        condition: {
+          user: {
+            types: ['general'],
+          },
+          growi: {
+            types: ['cloud'],
+            versionRegExps: ['2\\.0\\.[0-9]', '1\\.9\\.[0-9]'],
+          },
+        },
+      },
+    ]);
 
     const mockDate = new Date(2022, 0, 1, 21, 59, 55); // cronjob 実行の 5 秒前
     jest.useFakeTimers();
@@ -122,16 +131,22 @@ describe('QuestionnaireCronService', () => {
   afterAll(() => {
     jest.useRealTimers();
     crowi.questionnaireCronService.stopCron();
+    console.log('finished');
   });
 
   describe('test test', () => {
     test('hoge', async() => {
       spyAxiosGet.mockResolvedValue(mockResponse);
+      spyGetRandomInt.mockReturnValue(secondsUntilRequest);
+
       jest.advanceTimersByTime(5 * 1000); // cronjob 実行時刻まで進める
-      jest.advanceTimersByTime(4 * 60 * 60 * 1000); // 待機時間の最大値まで進め、リクエストを実行する
-      // const savedOrders = await QuestionnaireOrder.find();
-      // const savedIds: string[] = savedOrders.map(order => order._id.toString());
-      const savedIds = ['a'];
+      jest.advanceTimersByTime(secondsUntilRequest); // 待機時間の最大値まで進め、リクエストを実行する
+      jest.useRealTimers();
+
+      await new Promise(resolve => setTimeout(resolve, 3000));
+
+      const savedOrders = await QuestionnaireOrder.find();
+      const savedIds: string[] = savedOrders.map(order => order._id.toString());
       expect(savedIds.sort()).toEqual(['63a8354837e7aa378e16f0b1', '63a8354837e7aa378e16f0b2']);
     });
   });