fix(plugin-workflow): fix schedule repeat logic (#3612)
* fix(plugin-workflow): fix schedule repeat logic * fix(plugin-workflow): fix test case
This commit is contained in:
parent
951aece70c
commit
8e16bab213
@ -119,7 +119,8 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('start before now and repeat every 2 seconds after created and limit 1', async () => {
|
it('start before now and repeat every 2 seconds after created and limit 1', async () => {
|
||||||
const start = await sleepToEvenSecond();
|
await sleepToEvenSecond();
|
||||||
|
const start = new Date();
|
||||||
start.setMilliseconds(0);
|
start.setMilliseconds(0);
|
||||||
|
|
||||||
const workflow = await WorkflowModel.create({
|
const workflow = await WorkflowModel.create({
|
||||||
@ -166,6 +167,68 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
expect(date.getTime()).toBe(now.getTime());
|
expect(date.getTime()).toBe(now.getTime());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('no repeat triggered then update to repeat', async () => {
|
||||||
|
const start = await sleepToEvenSecond();
|
||||||
|
|
||||||
|
const workflow = await WorkflowModel.create({
|
||||||
|
enabled: true,
|
||||||
|
type: 'schedule',
|
||||||
|
config: {
|
||||||
|
mode: 0,
|
||||||
|
startsOn: start.toISOString(),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
await sleep(1000);
|
||||||
|
|
||||||
|
const e1s = await workflow.getExecutions();
|
||||||
|
expect(e1s.length).toBe(0);
|
||||||
|
|
||||||
|
await workflow.update({
|
||||||
|
config: {
|
||||||
|
...workflow.config,
|
||||||
|
repeat: 1000,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(new Date().toISOString());
|
||||||
|
|
||||||
|
await sleep(3000);
|
||||||
|
|
||||||
|
const e2s = await workflow.getExecutions();
|
||||||
|
console.log(e2s);
|
||||||
|
expect(e2s.length).toBe(2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('status', () => {
|
||||||
|
it('should not trigger after turned off', async () => {
|
||||||
|
const start = await sleepToEvenSecond();
|
||||||
|
const future = new Date();
|
||||||
|
future.setSeconds(future.getSeconds() + 2);
|
||||||
|
|
||||||
|
const workflow = await WorkflowModel.create({
|
||||||
|
enabled: true,
|
||||||
|
type: 'schedule',
|
||||||
|
config: {
|
||||||
|
mode: 0,
|
||||||
|
startsOn: future.toISOString(),
|
||||||
|
repeat: 1000,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
await sleep(1000);
|
||||||
|
|
||||||
|
await workflow.update({ enabled: false });
|
||||||
|
|
||||||
|
await sleep(3000);
|
||||||
|
|
||||||
|
const executions = await workflow.getExecutions();
|
||||||
|
expect(executions.length).toBe(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('dispatch', () => {
|
||||||
it('multiple workflows trigger at same time', async () => {
|
it('multiple workflows trigger at same time', async () => {
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
const startsOn = now.toISOString();
|
const startsOn = now.toISOString();
|
||||||
@ -216,36 +279,7 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
d2.setMilliseconds(0);
|
d2.setMilliseconds(0);
|
||||||
expect(d2.getTime()).toBe(now.getTime());
|
expect(d2.getTime()).toBe(now.getTime());
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
describe('status', () => {
|
|
||||||
it('should not trigger after turned off', async () => {
|
|
||||||
const start = await sleepToEvenSecond();
|
|
||||||
const future = new Date();
|
|
||||||
future.setSeconds(future.getSeconds() + 2);
|
|
||||||
|
|
||||||
const workflow = await WorkflowModel.create({
|
|
||||||
enabled: true,
|
|
||||||
type: 'schedule',
|
|
||||||
config: {
|
|
||||||
mode: 0,
|
|
||||||
startsOn: future.toISOString(),
|
|
||||||
repeat: 1000,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
await sleep(1000);
|
|
||||||
|
|
||||||
await workflow.update({ enabled: false });
|
|
||||||
|
|
||||||
await sleep(3000);
|
|
||||||
|
|
||||||
const executions = await workflow.getExecutions();
|
|
||||||
expect(executions.length).toBe(0);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('dispatch', () => {
|
|
||||||
it('missed non-repeated scheduled time should not be triggered', async () => {
|
it('missed non-repeated scheduled time should not be triggered', async () => {
|
||||||
await sleepToEvenSecond();
|
await sleepToEvenSecond();
|
||||||
|
|
||||||
|
@ -27,7 +27,6 @@ export default class StaticScheduleTrigger {
|
|||||||
|
|
||||||
inspect(workflows) {
|
inspect(workflows) {
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
now.setMilliseconds(0);
|
|
||||||
|
|
||||||
workflows.forEach((workflow) => {
|
workflows.forEach((workflow) => {
|
||||||
const nextTime = this.getNextTime(workflow, now);
|
const nextTime = this.getNextTime(workflow, now);
|
||||||
@ -65,7 +64,8 @@ export default class StaticScheduleTrigger {
|
|||||||
const next = interval.next();
|
const next = interval.next();
|
||||||
return next.getTime();
|
return next.getTime();
|
||||||
} else if (typeof config.repeat === 'number') {
|
} else if (typeof config.repeat === 'number') {
|
||||||
return timestamp + ((timestamp - startTime) % config.repeat);
|
const next = timestamp + config.repeat - ((timestamp - startTime) % config.repeat);
|
||||||
|
return next;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user