mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-05 21:49:25 +08:00
test(plugin-workflow): add test case for duplicated triggering schedule workflow (#3817)
This commit is contained in:
parent
ca29515bcd
commit
52d00aef58
@ -3,6 +3,8 @@ import { MockServer } from '@nocobase/test';
|
|||||||
import Database from '@nocobase/database';
|
import Database from '@nocobase/database';
|
||||||
import { getApp, sleep } from '@nocobase/plugin-workflow-test';
|
import { getApp, sleep } from '@nocobase/plugin-workflow-test';
|
||||||
|
|
||||||
|
import Plugin from '../../..';
|
||||||
|
|
||||||
async function sleepToEvenSecond() {
|
async function sleepToEvenSecond() {
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
// NOTE: align to even(0, 2, ...) + 0.5 seconds to start
|
// NOTE: align to even(0, 2, ...) + 0.5 seconds to start
|
||||||
@ -23,7 +25,6 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
let db: Database;
|
let db: Database;
|
||||||
let PostRepo;
|
let PostRepo;
|
||||||
let CategoryRepo;
|
let CategoryRepo;
|
||||||
let WorkflowModel;
|
|
||||||
let WorkflowRepo;
|
let WorkflowRepo;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
@ -31,7 +32,6 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
|
|
||||||
db = app.db;
|
db = app.db;
|
||||||
const workflow = db.getCollection('workflows');
|
const workflow = db.getCollection('workflows');
|
||||||
WorkflowModel = workflow.model;
|
|
||||||
WorkflowRepo = workflow.repository;
|
WorkflowRepo = workflow.repository;
|
||||||
PostRepo = db.getCollection('posts').repository;
|
PostRepo = db.getCollection('posts').repository;
|
||||||
CategoryRepo = db.getCollection('categories').repository;
|
CategoryRepo = db.getCollection('categories').repository;
|
||||||
@ -41,12 +41,14 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
|
|
||||||
describe('configuration', () => {
|
describe('configuration', () => {
|
||||||
it('neither startsOn nor repeat configurated', async () => {
|
it('neither startsOn nor repeat configurated', async () => {
|
||||||
const workflow = await WorkflowModel.create({
|
const workflow = await WorkflowRepo.create({
|
||||||
|
values: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
type: 'schedule',
|
type: 'schedule',
|
||||||
config: {
|
config: {
|
||||||
mode: 0,
|
mode: 0,
|
||||||
},
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await sleep(3000);
|
await sleep(3000);
|
||||||
@ -62,13 +64,15 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
start.setMilliseconds(0);
|
start.setMilliseconds(0);
|
||||||
start.setSeconds(start.getSeconds() + 2);
|
start.setSeconds(start.getSeconds() + 2);
|
||||||
|
|
||||||
const workflow = await WorkflowModel.create({
|
const workflow = await WorkflowRepo.create({
|
||||||
|
values: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
type: 'schedule',
|
type: 'schedule',
|
||||||
config: {
|
config: {
|
||||||
mode: 0,
|
mode: 0,
|
||||||
startsOn: start.toISOString(),
|
startsOn: start.toISOString(),
|
||||||
},
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await sleep(3000);
|
await sleep(3000);
|
||||||
@ -80,7 +84,8 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
it('on every 2 seconds', async () => {
|
it('on every 2 seconds', async () => {
|
||||||
const start = await sleepToEvenSecond();
|
const start = await sleepToEvenSecond();
|
||||||
|
|
||||||
const workflow = await WorkflowModel.create({
|
const workflow = await WorkflowRepo.create({
|
||||||
|
values: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
type: 'schedule',
|
type: 'schedule',
|
||||||
config: {
|
config: {
|
||||||
@ -88,6 +93,7 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
startsOn: start.toISOString(),
|
startsOn: start.toISOString(),
|
||||||
repeat: '*/2 * * * * *',
|
repeat: '*/2 * * * * *',
|
||||||
},
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await sleep(4000);
|
await sleep(4000);
|
||||||
@ -101,7 +107,8 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
it('on every even seconds and limit 1', async () => {
|
it('on every even seconds and limit 1', async () => {
|
||||||
const start = await sleepToEvenSecond();
|
const start = await sleepToEvenSecond();
|
||||||
|
|
||||||
const workflow = await WorkflowModel.create({
|
const workflow = await WorkflowRepo.create({
|
||||||
|
values: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
type: 'schedule',
|
type: 'schedule',
|
||||||
config: {
|
config: {
|
||||||
@ -110,6 +117,7 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
repeat: '*/2 * * * * *',
|
repeat: '*/2 * * * * *',
|
||||||
limit: 1,
|
limit: 1,
|
||||||
},
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await sleep(5000);
|
await sleep(5000);
|
||||||
@ -123,7 +131,8 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
const start = new Date();
|
const start = new Date();
|
||||||
start.setMilliseconds(0);
|
start.setMilliseconds(0);
|
||||||
|
|
||||||
const workflow = await WorkflowModel.create({
|
const workflow = await WorkflowRepo.create({
|
||||||
|
values: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
type: 'schedule',
|
type: 'schedule',
|
||||||
config: {
|
config: {
|
||||||
@ -132,6 +141,7 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
repeat: 2000,
|
repeat: 2000,
|
||||||
limit: 1,
|
limit: 1,
|
||||||
},
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await sleep(5000);
|
await sleep(5000);
|
||||||
@ -149,7 +159,8 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
|
|
||||||
await sleep(1500);
|
await sleep(1500);
|
||||||
|
|
||||||
const workflow = await WorkflowModel.create({
|
const workflow = await WorkflowRepo.create({
|
||||||
|
values: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
type: 'schedule',
|
type: 'schedule',
|
||||||
config: {
|
config: {
|
||||||
@ -157,6 +168,7 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
startsOn,
|
startsOn,
|
||||||
repeat: `${now.getSeconds()} * * * * *`,
|
repeat: `${now.getSeconds()} * * * * *`,
|
||||||
},
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await sleep(4000);
|
await sleep(4000);
|
||||||
@ -170,13 +182,15 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
it('no repeat triggered then update to repeat', async () => {
|
it('no repeat triggered then update to repeat', async () => {
|
||||||
const start = await sleepToEvenSecond();
|
const start = await sleepToEvenSecond();
|
||||||
|
|
||||||
const workflow = await WorkflowModel.create({
|
const workflow = await WorkflowRepo.create({
|
||||||
|
values: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
type: 'schedule',
|
type: 'schedule',
|
||||||
config: {
|
config: {
|
||||||
mode: 0,
|
mode: 0,
|
||||||
startsOn: start.toISOString(),
|
startsOn: start.toISOString(),
|
||||||
},
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
@ -207,7 +221,8 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
const future = new Date();
|
const future = new Date();
|
||||||
future.setSeconds(future.getSeconds() + 2);
|
future.setSeconds(future.getSeconds() + 2);
|
||||||
|
|
||||||
const workflow = await WorkflowModel.create({
|
const workflow = await WorkflowRepo.create({
|
||||||
|
values: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
type: 'schedule',
|
type: 'schedule',
|
||||||
config: {
|
config: {
|
||||||
@ -215,6 +230,7 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
startsOn: future.toISOString(),
|
startsOn: future.toISOString(),
|
||||||
repeat: 1000,
|
repeat: 1000,
|
||||||
},
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
@ -265,7 +281,10 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
await sleep(3000);
|
await sleep(3000);
|
||||||
await WorkflowModel.update({ enabled: false }, { where: { enabled: true } });
|
await WorkflowRepo.update({
|
||||||
|
values: { enabled: false },
|
||||||
|
filter: { enabled: true },
|
||||||
|
});
|
||||||
|
|
||||||
const [e1] = await w1.getExecutions();
|
const [e1] = await w1.getExecutions();
|
||||||
expect(e1).toBeDefined();
|
expect(e1).toBeDefined();
|
||||||
@ -287,13 +306,15 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
start.setMilliseconds(0);
|
start.setMilliseconds(0);
|
||||||
start.setSeconds(start.getSeconds() + 2);
|
start.setSeconds(start.getSeconds() + 2);
|
||||||
|
|
||||||
const workflow = await WorkflowModel.create({
|
const workflow = await WorkflowRepo.create({
|
||||||
|
values: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
type: 'schedule',
|
type: 'schedule',
|
||||||
config: {
|
config: {
|
||||||
mode: 0,
|
mode: 0,
|
||||||
startsOn: start.toISOString(),
|
startsOn: start.toISOString(),
|
||||||
},
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await app.stop();
|
await app.stop();
|
||||||
@ -315,13 +336,15 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
start.setMilliseconds(0);
|
start.setMilliseconds(0);
|
||||||
start.setSeconds(start.getSeconds() + 2);
|
start.setSeconds(start.getSeconds() + 2);
|
||||||
|
|
||||||
const workflow = await WorkflowModel.create({
|
const workflow = await WorkflowRepo.create({
|
||||||
|
values: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
type: 'schedule',
|
type: 'schedule',
|
||||||
config: {
|
config: {
|
||||||
mode: 0,
|
mode: 0,
|
||||||
startsOn: start.toISOString(),
|
startsOn: start.toISOString(),
|
||||||
},
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
@ -337,4 +360,32 @@ describe('workflow > triggers > schedule > static mode', () => {
|
|||||||
expect(c2).toBe(1);
|
expect(c2).toBe(1);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('duplications', () => {
|
||||||
|
it('same workflow should not be triggered in same time more than once', async () => {
|
||||||
|
await sleepToEvenSecond();
|
||||||
|
|
||||||
|
const start = new Date();
|
||||||
|
start.setMilliseconds(0);
|
||||||
|
start.setSeconds(start.getSeconds() + 2);
|
||||||
|
|
||||||
|
const workflow = await WorkflowRepo.create({
|
||||||
|
values: {
|
||||||
|
enabled: true,
|
||||||
|
type: 'schedule',
|
||||||
|
config: {
|
||||||
|
mode: 0,
|
||||||
|
startsOn: start.toISOString(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
(app.pm.get('workflow') as Plugin).trigger(workflow, { date: start });
|
||||||
|
|
||||||
|
await sleep(3000);
|
||||||
|
|
||||||
|
const e1s = await workflow.getExecutions();
|
||||||
|
expect(e1s.length).toBe(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -44,7 +44,7 @@ export default class ScheduleTrigger extends Trigger {
|
|||||||
}
|
}
|
||||||
const existed = await workflow.countExecutions({
|
const existed = await workflow.countExecutions({
|
||||||
where: {
|
where: {
|
||||||
'context.date': context.date,
|
'context.date': context.date instanceof Date ? context.date.toISOString() : context.date,
|
||||||
},
|
},
|
||||||
transaction: options.transaction,
|
transaction: options.transaction,
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user