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