From eb49849803889aac8981b6064006ba28c8c4c59d Mon Sep 17 00:00:00 2001 From: Junyi Date: Sat, 30 Apr 2022 16:41:40 +0800 Subject: [PATCH] fix(plugin-workflow): fix trigger bind logic to avoid duplication (#347) --- .../workflow/src/__tests__/workflow.test.ts | 72 +++++++++++++++++++ .../workflow/src/triggers/collection.ts | 10 +-- 2 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 packages/plugins/workflow/src/__tests__/workflow.test.ts diff --git a/packages/plugins/workflow/src/__tests__/workflow.test.ts b/packages/plugins/workflow/src/__tests__/workflow.test.ts new file mode 100644 index 000000000..3a78eec79 --- /dev/null +++ b/packages/plugins/workflow/src/__tests__/workflow.test.ts @@ -0,0 +1,72 @@ +import { Application } from '@nocobase/server'; +import Database from '@nocobase/database'; +import { getApp } from '.'; +import { EXECUTION_STATUS } from '../constants'; + + + +describe('workflow > workflow', () => { + let app: Application; + let db: Database; + let PostModel; + let WorkflowModel; + + beforeEach(async () => { + app = await getApp(); + + db = app.db; + WorkflowModel = db.getCollection('workflows').model; + PostModel = db.getCollection('posts').model; + }); + + afterEach(() => db.close()); + + describe('toggle', () => { + it('toggle after update', async () => { + const workflow = await WorkflowModel.create({ + enabled: true, + type: 'collection', + config: { + mode: 1, + collection: 'posts' + } + }); + + const { hooks } = PostModel.options; + expect(hooks.afterCreate.length).toBe(1); + + await workflow.update({ + config: { + mode: 2, + collection: 'posts' + } + }); + expect(hooks.afterCreate.length).toBe(0); + expect(hooks.afterUpdate.length).toBe(1); + + await workflow.update({ + config: { + mode: 7, + collection: 'posts' + } + }); + expect(hooks.afterCreate.length).toBe(1); + expect(hooks.afterUpdate.length).toBe(1); + expect(hooks.afterDestroy.length).toBe(1); + + await workflow.update({ + enabled: false + }); + expect(hooks.afterCreate.length).toBe(0); + expect(hooks.afterUpdate.length).toBe(0); + expect(hooks.afterDestroy.length).toBe(0); + + await workflow.update({ + enabled: true + }); + expect(hooks.afterCreate.length).toBe(1); + expect(hooks.afterUpdate.length).toBe(1); + expect(hooks.afterDestroy.length).toBe(1); + }); + }); +}); diff --git a/packages/plugins/workflow/src/triggers/collection.ts b/packages/plugins/workflow/src/triggers/collection.ts index 866f62fae..dbceee728 100644 --- a/packages/plugins/workflow/src/triggers/collection.ts +++ b/packages/plugins/workflow/src/triggers/collection.ts @@ -47,10 +47,12 @@ export default { } // TODO: duplication when mode change should be considered for (let [key, event] of MODE_BITMAP_EVENTS.entries()) { - if (mode & key - && !Collection.model.options.hooks[event]?.find(item => item.name && item.name === this.getHookId()) - ) { - Collection.model.addHook(event, this.getHookId(), bindHandler.call(this, callback)); + if (mode & key) { + if (!Collection.model.options.hooks[event]?.find(item => item.name && item.name === this.getHookId())) { + Collection.model.addHook(event, this.getHookId(), bindHandler.call(this, callback)); + } + } else { + Collection.model.removeHook(event, this.getHookId()); } } },