fix(plugin-workflow): fix trigger bind logic to avoid duplication (#347)
This commit is contained in:
		
							parent
							
								
									b7ea6b0a5e
								
							
						
					
					
						commit
						eb49849803
					
				
							
								
								
									
										72
									
								
								packages/plugins/workflow/src/__tests__/workflow.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								packages/plugins/workflow/src/__tests__/workflow.test.ts
									
									
									
									
									
										Normal file
									
								
							@ -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);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@ -47,11 +47,13 @@ export default {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    // TODO: duplication when mode change should be considered
 | 
					    // TODO: duplication when mode change should be considered
 | 
				
			||||||
    for (let [key, event] of MODE_BITMAP_EVENTS.entries()) {
 | 
					    for (let [key, event] of MODE_BITMAP_EVENTS.entries()) {
 | 
				
			||||||
      if (mode & key
 | 
					      if (mode & key) {
 | 
				
			||||||
        && !Collection.model.options.hooks[event]?.find(item => item.name && item.name === this.getHookId())
 | 
					        if (!Collection.model.options.hooks[event]?.find(item => item.name && item.name === this.getHookId())) {
 | 
				
			||||||
      ) {
 | 
					 | 
				
			||||||
          Collection.model.addHook(event, this.getHookId(), bindHandler.call(this, callback));
 | 
					          Collection.model.addHook(event, this.getHookId(), bindHandler.call(this, callback));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        Collection.model.removeHook(event, this.getHookId());
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  off(this: WorkflowModel) {
 | 
					  off(this: WorkflowModel) {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user