Parcourir la source

refs 112133: refactor

Futa Arai il y a 3 ans
Parent
commit
597043b330

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

@@ -1,7 +1,10 @@
 import axios from '~/utils/axios';
 import axios from '~/utils/axios';
+import loggerFactory from '~/utils/logger';
 
 
 import QuestionnaireOrder, { QuestionnaireOrderDocument } from '../models/questionnaire/questionnaire-order';
 import QuestionnaireOrder, { QuestionnaireOrderDocument } from '../models/questionnaire/questionnaire-order';
 
 
+const logger = loggerFactory('growi:service:questionnaire-cron');
+
 const nodeCron = require('node-cron');
 const nodeCron = require('node-cron');
 
 
 export const getRandomInt = (min: number, max: number): number => {
 export const getRandomInt = (min: number, max: number): number => {
@@ -29,8 +32,6 @@ class QuestionnaireCronService {
     this.maxHoursUntilRequest = crowi.configManager?.getConfig('crowi', 'app:questionnaireCronMaxHoursUntilRequest');
     this.maxHoursUntilRequest = crowi.configManager?.getConfig('crowi', 'app:questionnaireCronMaxHoursUntilRequest');
 
 
     const maxSecondsUntilRequest = this.maxHoursUntilRequest * 60 * 60;
     const maxSecondsUntilRequest = this.maxHoursUntilRequest * 60 * 60;
-    // const maxSecondsUntilRequest = 60;
-    // this.cronSchedule = '* * * * *';
 
 
     this.cronJob = this.questionnaireOrderGetCron(this.cronSchedule, maxSecondsUntilRequest);
     this.cronJob = this.questionnaireOrderGetCron(this.cronSchedule, maxSecondsUntilRequest);
   }
   }
@@ -47,8 +48,6 @@ class QuestionnaireCronService {
     const saveOrders = async(questionnaireOrders: QuestionnaireOrderDocument[]) => {
     const saveOrders = async(questionnaireOrders: QuestionnaireOrderDocument[]) => {
       const savedOrders: QuestionnaireOrderDocument[] = await QuestionnaireOrder.find();
       const savedOrders: QuestionnaireOrderDocument[] = await QuestionnaireOrder.find();
       const savedOrderIds = savedOrders.map(order => order._id.toString());
       const savedOrderIds = savedOrders.map(order => order._id.toString());
-      console.log(savedOrderIds);
-      console.log(questionnaireOrders);
       // 渡されたアンケートのうち未保存のものを保存する
       // 渡されたアンケートのうち未保存のものを保存する
       const nonSavedOrders = questionnaireOrders.filter(order => !savedOrderIds.includes(order._id));
       const nonSavedOrders = questionnaireOrders.filter(order => !savedOrderIds.includes(order._id));
       QuestionnaireOrder.insertMany(nonSavedOrders);
       QuestionnaireOrder.insertMany(nonSavedOrders);
@@ -65,13 +64,10 @@ class QuestionnaireCronService {
     };
     };
 
 
     return nodeCron.schedule(cronSchedule, async() => {
     return nodeCron.schedule(cronSchedule, async() => {
-      console.log('called');
+      // GROWI ごとにリクエスト時刻を分散させるためにランダムな時間 sleep する
       const secToSleep = getRandomInt(0, maxSecondsUntilRequest);
       const secToSleep = getRandomInt(0, maxSecondsUntilRequest);
-
       await sleep(secToSleep * 1000);
       await sleep(secToSleep * 1000);
 
 
-      console.log('executed');
-
       try {
       try {
         const response = await axios.get(`${this.growiQuestionnaireUri}/questionnaire-order/index`);
         const response = await axios.get(`${this.growiQuestionnaireUri}/questionnaire-order/index`);
         const questionnaireOrders: QuestionnaireOrderDocument[] = response.data.questionnaireOrders;
         const questionnaireOrders: QuestionnaireOrderDocument[] = response.data.questionnaireOrders;
@@ -80,7 +76,7 @@ class QuestionnaireCronService {
         await deleteFinishedOrders();
         await deleteFinishedOrders();
       }
       }
       catch (e) {
       catch (e) {
-        console.log(e);
+        logger.error(e);
       }
       }
 
 
     });
     });

+ 14 - 15
packages/app/test/integration/service/questionnaire-cron.test.ts

@@ -22,7 +22,7 @@ describe('QuestionnaireCronService', () => {
   const mockResponse = {
   const mockResponse = {
     data: {
     data: {
       questionnaireOrders: [
       questionnaireOrders: [
-        // 既に保存されている
+        // 既に保存されているアンケート
         {
         {
           _id: '63a8354837e7aa378e16f0b1',
           _id: '63a8354837e7aa378e16f0b1',
           showFrom: '2022-12-11',
           showFrom: '2022-12-11',
@@ -76,6 +76,7 @@ describe('QuestionnaireCronService', () => {
     // reload
     // reload
     await crowi.setupConfigManager();
     await crowi.setupConfigManager();
 
 
+    // 初期データ投入
     await QuestionnaireOrder.insertMany([
     await QuestionnaireOrder.insertMany([
       {
       {
         _id: '63a8354837e7aa378e16f0b1',
         _id: '63a8354837e7aa378e16f0b1',
@@ -120,7 +121,8 @@ describe('QuestionnaireCronService', () => {
       },
       },
     ]);
     ]);
 
 
-    const mockDate = new Date(2022, 0, 1, 21, 59, 55); // cronjob 実行の 5 秒前
+    // cronjob 実行の 5 秒前に現在時刻を設定する
+    const mockDate = new Date(2022, 0, 1, 21, 59, 55);
     jest.useFakeTimers();
     jest.useFakeTimers();
     jest.setSystemTime(mockDate);
     jest.setSystemTime(mockDate);
 
 
@@ -131,23 +133,20 @@ describe('QuestionnaireCronService', () => {
   afterAll(() => {
   afterAll(() => {
     jest.useRealTimers();
     jest.useRealTimers();
     crowi.questionnaireCronService.stopCron();
     crowi.questionnaireCronService.stopCron();
-    console.log('finished');
   });
   });
 
 
-  describe('test test', () => {
-    test('hoge', async() => {
-      spyAxiosGet.mockResolvedValue(mockResponse);
-      spyGetRandomInt.mockReturnValue(secondsUntilRequest);
+  test('Should save new quesionnaire orders and delete outdated ones', async() => {
+    spyAxiosGet.mockResolvedValue(mockResponse);
+    spyGetRandomInt.mockReturnValue(secondsUntilRequest);
 
 
-      jest.advanceTimersByTime(5 * 1000); // cronjob 実行時刻まで進める
-      jest.advanceTimersByTime(secondsUntilRequest); // 待機時間の最大値まで進め、リクエストを実行する
-      jest.useRealTimers();
+    jest.advanceTimersByTime(5 * 1000); // cronjob 実行時刻まで進める
+    jest.advanceTimersByTime(secondsUntilRequest); // 待機時間の最大値まで進め、リクエストを実行する
+    jest.useRealTimers(); // cronjob 実行完了後は real timers に戻さないと mongoose が正常に動作しない
 
 
-      await new Promise(resolve => setTimeout(resolve, 3000));
+    await new Promise(resolve => setTimeout(resolve, 3000)); // 裏で動いている cronjob が実行完了するまで待つ
 
 
-      const savedOrders = await QuestionnaireOrder.find();
-      const savedIds: string[] = savedOrders.map(order => order._id.toString());
-      expect(savedIds.sort()).toEqual(['63a8354837e7aa378e16f0b1', '63a8354837e7aa378e16f0b2']);
-    });
+    const savedOrders = await QuestionnaireOrder.find();
+    const savedIds: string[] = savedOrders.map(order => order._id.toString());
+    expect(savedIds.sort()).toEqual(['63a8354837e7aa378e16f0b1', '63a8354837e7aa378e16f0b2']);
   });
   });
 });
 });