2
0
Futa Arai 3 жил өмнө
parent
commit
c19fecb814

+ 4 - 15
packages/app/src/server/service/questionnaire-cron.ts

@@ -46,21 +46,10 @@ class QuestionnaireCronService {
 
   private questionnaireOrderGetCron(cronSchedule: string, maxSecondsUntilRequest: number) {
     const saveOrders = async(questionnaireOrders: QuestionnaireOrderDocument[]) => {
-      const savedOrders: QuestionnaireOrderDocument[] = await QuestionnaireOrder.find();
-      const savedOrderIds = savedOrders.map(order => order._id.toString());
-      // 渡されたアンケートのうち未保存のものを保存する
-      const nonSavedOrders = questionnaireOrders.filter(order => !savedOrderIds.includes(order._id));
-      await QuestionnaireOrder.insertMany(nonSavedOrders);
-    };
-
-    const deleteFinishedOrders = async() => {
       const currentDate = new Date(Date.now());
-
-      await QuestionnaireOrder.deleteMany({
-        showUntil: {
-          $lt: currentDate,
-        },
-      });
+      // 渡されたアンケートのうち終了前のものを保存する
+      const nonFinishedOrders = questionnaireOrders.filter(order => new Date(order.showUntil) > currentDate);
+      await QuestionnaireOrder.insertMany(nonFinishedOrders);
     };
 
     return nodeCron.schedule(cronSchedule, async() => {
@@ -72,8 +61,8 @@ class QuestionnaireCronService {
         const response = await axios.get(`${this.growiQuestionnaireUri}/questionnaire-order/index`);
         const questionnaireOrders: QuestionnaireOrderDocument[] = response.data.questionnaireOrders;
 
+        await QuestionnaireOrder.deleteMany();
         await saveOrders(questionnaireOrders);
-        deleteFinishedOrders();
       }
       catch (e) {
         logger.error(e);

+ 87 - 9
packages/app/test/integration/service/questionnaire-cron.test.ts

@@ -22,7 +22,7 @@ describe('QuestionnaireCronService', () => {
   const mockResponse = {
     data: {
       questionnaireOrders: [
-        // 既に保存されている、終了していないアンケート
+        // 既に保存されている、終了していないアンケート (user types を GROWI 保存時から更新)
         {
           _id: '63a8354837e7aa378e16f0b1',
           showFrom: '2022-12-11',
@@ -42,6 +42,9 @@ describe('QuestionnaireCronService', () => {
               versionRegExps: ['2\\.0\\.[0-9]', '1\\.9\\.[0-9]'],
             },
           },
+          createdAt: '2022-12-01',
+          updatedAt: '2022-12-01',
+          __v: 0,
         },
         // 保存されておらず、終了していないアンケート
         {
@@ -63,6 +66,9 @@ describe('QuestionnaireCronService', () => {
               versionRegExps: ['2\\.0\\.[0-9]', '1\\.9\\.[0-9]'],
             },
           },
+          createdAt: '2022-12-02',
+          updatedAt: '2022-12-02',
+          __v: 0,
         },
         // 保存されておらず、終了しているアンケート
         {
@@ -84,6 +90,9 @@ describe('QuestionnaireCronService', () => {
               versionRegExps: ['2\\.0\\.[0-9]', '1\\.9\\.[0-9]'],
             },
           },
+          createdAt: '2022-12-03',
+          updatedAt: '2022-12-03',
+          __v: 0,
         },
       ],
     },
@@ -103,12 +112,12 @@ describe('QuestionnaireCronService', () => {
     await QuestionnaireOrder.insertMany([
       {
         _id: '63a8354837e7aa378e16f0b1',
-        showFrom: '2021-12-11',
+        showFrom: '2022-12-11',
         showUntil: '2100-12-12',
         questions: [
           {
             type: 'points',
-            text: 'アンケート機能は支障なく動いていますか?',
+            text: 'Growi は使いやすいですか?',
           },
         ],
         condition: {
@@ -116,7 +125,7 @@ describe('QuestionnaireCronService', () => {
             types: ['general'],
           },
           growi: {
-            types: ['cloud'],
+            types: ['cloud', 'private-cloud'],
             versionRegExps: ['2\\.0\\.[0-9]', '1\\.9\\.[0-9]'],
           },
         },
@@ -142,6 +151,27 @@ describe('QuestionnaireCronService', () => {
           },
         },
       },
+      // growi-questionnaire にないアンケート
+      {
+        _id: '63a8354837e7aa378e16f0b5',
+        showFrom: '2020-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]'],
+          },
+        },
+      },
     ]);
 
     // cronjob 実行の 5 秒前に現在時刻を設定する
@@ -161,15 +191,63 @@ describe('QuestionnaireCronService', () => {
     crowi.questionnaireCronService.stopCron();
   });
 
-  test('Should save new quesionnaire orders and delete outdated ones', async() => {
+  test('Should save quesionnaire orders and delete outdated ones', async() => {
     jest.advanceTimersByTime(5 * 1000); // cronjob 実行時刻まで進める
     jest.advanceTimersByTime(secondsUntilRequest); // 待機時間の最大値まで進め、リクエストを実行する
     jest.useRealTimers(); // cronjob 実行開始後は real timers に戻さないと mongoose が正常に動作しない
 
-    await new Promise(resolve => setTimeout(resolve, 3000)); // 裏で動いている cronjob が実行完了するまで待つ
+    await new Promise(resolve => setTimeout(resolve, 5000)); // 裏で動いている 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()
+      .select('-condition._id -questions._id')
+      .sort({ _id: 1 });
+    expect(JSON.parse(JSON.stringify(savedOrders))).toEqual([
+      {
+        _id: '63a8354837e7aa378e16f0b1',
+        showFrom: '2022-12-11T00:00:00.000Z',
+        showUntil: '2100-12-12T00:00:00.000Z',
+        questions: [
+          {
+            type: 'points',
+            text: 'Growi は使いやすいですか?',
+          },
+        ],
+        condition: {
+          user: {
+            types: ['admin', 'general'],
+          },
+          growi: {
+            types: ['cloud', 'private-cloud'],
+            versionRegExps: ['2\\.0\\.[0-9]', '1\\.9\\.[0-9]'],
+          },
+        },
+        createdAt: '2022-12-01T00:00:00.000Z',
+        updatedAt: '2022-12-01T00:00:00.000Z',
+        __v: 0,
+      },
+      {
+        _id: '63a8354837e7aa378e16f0b2',
+        showFrom: '2021-12-11T00:00:00.000Z',
+        showUntil: '2100-12-12T00:00:00.000Z',
+        questions: [
+          {
+            type: 'points',
+            text: 'アンケート機能は支障なく動いていますか?',
+          },
+        ],
+        condition: {
+          user: {
+            types: ['general'],
+          },
+          growi: {
+            types: ['cloud'],
+            versionRegExps: ['2\\.0\\.[0-9]', '1\\.9\\.[0-9]'],
+          },
+        },
+        createdAt: '2022-12-02T00:00:00.000Z',
+        updatedAt: '2022-12-02T00:00:00.000Z',
+        __v: 0,
+      },
+    ]);
   });
 });