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 () => { | ||||
|       const start = await sleepToEvenSecond(); | ||||
|       await sleepToEvenSecond(); | ||||
|       const start = new Date(); | ||||
|       start.setMilliseconds(0); | ||||
| 
 | ||||
|       const workflow = await WorkflowModel.create({ | ||||
| @ -166,6 +167,68 @@ describe('workflow > triggers > schedule > static mode', () => { | ||||
|       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 () => { | ||||
|       const now = new Date(); | ||||
|       const startsOn = now.toISOString(); | ||||
| @ -216,36 +279,7 @@ describe('workflow > triggers > schedule > static mode', () => { | ||||
|       d2.setMilliseconds(0); | ||||
|       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 () => { | ||||
|       await sleepToEvenSecond(); | ||||
| 
 | ||||
|  | ||||
| @ -27,7 +27,6 @@ export default class StaticScheduleTrigger { | ||||
| 
 | ||||
|   inspect(workflows) { | ||||
|     const now = new Date(); | ||||
|     now.setMilliseconds(0); | ||||
| 
 | ||||
|     workflows.forEach((workflow) => { | ||||
|       const nextTime = this.getNextTime(workflow, now); | ||||
| @ -65,7 +64,8 @@ export default class StaticScheduleTrigger { | ||||
|         const next = interval.next(); | ||||
|         return next.getTime(); | ||||
|       } else if (typeof config.repeat === 'number') { | ||||
|         return timestamp + ((timestamp - startTime) % config.repeat); | ||||
|         const next = timestamp + config.repeat - ((timestamp - startTime) % config.repeat); | ||||
|         return next; | ||||
|       } else { | ||||
|         return null; | ||||
|       } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user