|
@@ -1,26 +1,20 @@
|
|
|
|
|
+import mongoose from 'mongoose';
|
|
|
|
|
+
|
|
|
|
|
+import { StatusType } from '../../../src/interfaces/questionnaire/questionnaire-answer-status';
|
|
|
|
|
+import QuestionnaireAnswerStatus from '../../../src/server/models/questionnaire/questionnaire-answer-status';
|
|
|
import QuestionnaireOrder from '../../../src/server/models/questionnaire/questionnaire-order';
|
|
import QuestionnaireOrder from '../../../src/server/models/questionnaire/questionnaire-order';
|
|
|
import { getInstance } from '../setup-crowi';
|
|
import { getInstance } from '../setup-crowi';
|
|
|
|
|
|
|
|
const axios = require('axios').default;
|
|
const axios = require('axios').default;
|
|
|
|
|
|
|
|
-const rand = require('../../../src/utils/rand');
|
|
|
|
|
-
|
|
|
|
|
const spyAxiosGet = jest.spyOn<typeof axios, 'get'>(
|
|
const spyAxiosGet = jest.spyOn<typeof axios, 'get'>(
|
|
|
axios,
|
|
axios,
|
|
|
'get',
|
|
'get',
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
-const spyGetRandomIntInRange = jest.spyOn<typeof rand, 'getRandomIntInRange'>(
|
|
|
|
|
- rand,
|
|
|
|
|
- 'getRandomIntInRange',
|
|
|
|
|
-);
|
|
|
|
|
-
|
|
|
|
|
describe('QuestionnaireCronService', () => {
|
|
describe('QuestionnaireCronService', () => {
|
|
|
let crowi;
|
|
let crowi;
|
|
|
|
|
|
|
|
- const maxSecondsUntilRequest = 4 * 60 * 60 * 1000;
|
|
|
|
|
- const secondsUntilRequest = rand.getRandomIntInRange(0, maxSecondsUntilRequest);
|
|
|
|
|
-
|
|
|
|
|
const mockResponse = {
|
|
const mockResponse = {
|
|
|
data: {
|
|
data: {
|
|
|
questionnaireOrders: [
|
|
questionnaireOrders: [
|
|
@@ -134,9 +128,6 @@ describe('QuestionnaireCronService', () => {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
beforeAll(async() => {
|
|
beforeAll(async() => {
|
|
|
- process.env.QUESTIONNAIRE_CRON_SCHEDULE = '0 22 * * *';
|
|
|
|
|
- process.env.QUESTIONNAIRE_CRON_MAX_HOURS_UNTIL_REQUEST = '4';
|
|
|
|
|
-
|
|
|
|
|
crowi = await getInstance();
|
|
crowi = await getInstance();
|
|
|
// reload
|
|
// reload
|
|
|
await crowi.setupConfigManager();
|
|
await crowi.setupConfigManager();
|
|
@@ -242,33 +233,36 @@ describe('QuestionnaireCronService', () => {
|
|
|
},
|
|
},
|
|
|
]);
|
|
]);
|
|
|
|
|
|
|
|
- // mock the date to 5 seconds before cronjob execution
|
|
|
|
|
- const mockDate = new Date(2022, 0, 1, 21, 59, 55);
|
|
|
|
|
- jest.useFakeTimers();
|
|
|
|
|
- jest.setSystemTime(mockDate);
|
|
|
|
|
|
|
+ await QuestionnaireAnswerStatus.insertMany([
|
|
|
|
|
+ {
|
|
|
|
|
+ user: new mongoose.Types.ObjectId(),
|
|
|
|
|
+ questionnaireOrderId: '63a8354837e7aa378e16f0b1',
|
|
|
|
|
+ status: StatusType.skipped,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ user: new mongoose.Types.ObjectId(),
|
|
|
|
|
+ questionnaireOrderId: '63a8354837e7aa378e16f0b1',
|
|
|
|
|
+ status: StatusType.answered,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ user: new mongoose.Types.ObjectId(),
|
|
|
|
|
+ questionnaireOrderId: '63a8354837e7aa378e16f0b1',
|
|
|
|
|
+ status: StatusType.not_answered,
|
|
|
|
|
+ },
|
|
|
|
|
+ ]);
|
|
|
|
|
|
|
|
- // must be after useFakeTimers for mockDate to be in effect
|
|
|
|
|
crowi.setupCron();
|
|
crowi.setupCron();
|
|
|
|
|
|
|
|
spyAxiosGet.mockResolvedValue(mockResponse);
|
|
spyAxiosGet.mockResolvedValue(mockResponse);
|
|
|
- spyGetRandomIntInRange.mockReturnValue(secondsUntilRequest); // static sleep time until request
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
afterAll(() => {
|
|
afterAll(() => {
|
|
|
- jest.useRealTimers();
|
|
|
|
|
- crowi.questionnaireCronService.stopCron();
|
|
|
|
|
|
|
+ crowi.questionnaireCronService.stopCron(); // jest will not finish until cronjob stops
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- test('Should save quesionnaire orders and delete outdated ones', async() => {
|
|
|
|
|
- jest.advanceTimersByTime(5 * 1000); // advance unitl cronjob execution
|
|
|
|
|
- jest.advanceTimersByTime(secondsUntilRequest); // advance until request execution
|
|
|
|
|
- jest.useRealTimers(); // after cronjob starts, undo timer mocks so mongoose can work properly
|
|
|
|
|
-
|
|
|
|
|
- await new Promise((resolve) => {
|
|
|
|
|
- // wait until cronjob execution finishes
|
|
|
|
|
- // refs: https://github.com/node-cron/node-cron/blob/a0be3f4a7a5419af109cecf4a41071ea559b9b3d/src/task.js#L24
|
|
|
|
|
- crowi.questionnaireCronService.cronJob._task.once('task-finished', resolve);
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ test('Job execution should save(update) quesionnaire orders, delete outdated ones, and update skipped answer statuses', async() => {
|
|
|
|
|
+ // testing the cronjob from schedule has untrivial overhead, so test job execution in place
|
|
|
|
|
+ await crowi.questionnaireCronService.executeJob();
|
|
|
|
|
|
|
|
const savedOrders = await QuestionnaireOrder.find()
|
|
const savedOrders = await QuestionnaireOrder.find()
|
|
|
.select('-condition._id -questions._id')
|
|
.select('-condition._id -questions._id')
|
|
@@ -343,5 +337,7 @@ describe('QuestionnaireCronService', () => {
|
|
|
__v: 0,
|
|
__v: 0,
|
|
|
},
|
|
},
|
|
|
]);
|
|
]);
|
|
|
|
|
+
|
|
|
|
|
+ expect((await QuestionnaireAnswerStatus.find({ status: StatusType.not_answered })).length).toEqual(2);
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|