1
- import type { User } from '@n8n/db' ;
1
+ import type { GlobalConfig } from '@n8n/config' ;
2
+ import type { Project , User , WorkflowEntity , WorkflowRepository } from '@n8n/db' ;
2
3
import { mock } from 'jest-mock-extended' ;
3
4
import {
4
5
NodeConnectionTypes ,
@@ -7,8 +8,10 @@ import {
7
8
type INodeType ,
8
9
type IWorkflowBase ,
9
10
type IWorkflowExecuteAdditionalData ,
11
+ type ExecutionError ,
10
12
} from 'n8n-workflow' ;
11
13
14
+ import type { IWorkflowErrorData } from '@/interfaces' ;
12
15
import type { NodeTypes } from '@/node-types' ;
13
16
import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data' ;
14
17
import type { WorkflowRunner } from '@/workflow-runner' ;
@@ -490,6 +493,113 @@ describe('WorkflowExecutionService', () => {
490
493
} ) ;
491
494
} ) ;
492
495
} ) ;
496
+
497
+ describe ( 'executeErrorWorkflow()' , ( ) => {
498
+ test ( 'should call `WorkflowRunner.run()` with correct parameters' , async ( ) => {
499
+ const workflowErrorData : IWorkflowErrorData = {
500
+ workflow : { id : 'workflow-id' , name : 'Test Workflow' } ,
501
+ execution : {
502
+ id : 'execution-id' ,
503
+ mode : 'manual' ,
504
+ error : new Error ( 'Test error' ) as ExecutionError ,
505
+ lastNodeExecuted : 'Node with error' ,
506
+ } ,
507
+ } ;
508
+
509
+ const workflowRunnerMock = mock < WorkflowRunner > ( ) ;
510
+ workflowRunnerMock . run . mockResolvedValue ( 'fake-execution-id' ) ;
511
+
512
+ const errorTriggerType = 'n8n-nodes-base.errorTrigger' ;
513
+ const globalConfig = mock < GlobalConfig > ( {
514
+ nodes : {
515
+ errorTriggerType,
516
+ } ,
517
+ } ) ;
518
+
519
+ const errorTriggerNode : INode = {
520
+ id : 'error-trigger-node-id' ,
521
+ name : 'Error Trigger' ,
522
+ type : errorTriggerType ,
523
+ typeVersion : 1 ,
524
+ position : [ 0 , 0 ] ,
525
+ parameters : { } ,
526
+ } ;
527
+
528
+ const errorWorkflow = mock < WorkflowEntity > ( {
529
+ id : 'error-workflow-id' ,
530
+ name : 'Error Workflow' ,
531
+ active : false ,
532
+ isArchived : false ,
533
+ pinData : { } ,
534
+ nodes : [ errorTriggerNode ] ,
535
+ connections : { } ,
536
+ createdAt : new Date ( ) ,
537
+ updatedAt : new Date ( ) ,
538
+ } ) ;
539
+
540
+ const workflowRepositoryMock = mock < WorkflowRepository > ( ) ;
541
+ workflowRepositoryMock . findOneBy . mockResolvedValue ( errorWorkflow ) ;
542
+
543
+ const service = new WorkflowExecutionService (
544
+ mock ( ) ,
545
+ mock ( ) ,
546
+ mock ( ) ,
547
+ workflowRepositoryMock ,
548
+ nodeTypes ,
549
+ mock ( ) ,
550
+ workflowRunnerMock ,
551
+ globalConfig ,
552
+ mock ( ) ,
553
+ mock ( ) ,
554
+ ) ;
555
+
556
+ await service . executeErrorWorkflow (
557
+ 'error-workflow-id' ,
558
+ workflowErrorData ,
559
+ mock < Project > ( { id : 'project-id' } ) ,
560
+ ) ;
561
+
562
+ expect ( workflowRunnerMock . run ) . toHaveBeenCalledTimes ( 1 ) ;
563
+ expect ( workflowRunnerMock . run ) . toHaveBeenCalledWith ( {
564
+ executionMode : 'error' ,
565
+ executionData : {
566
+ executionData : {
567
+ contextData : { } ,
568
+ metadata : { } ,
569
+ nodeExecutionStack : [
570
+ {
571
+ node : errorTriggerNode ,
572
+ data : {
573
+ main : [
574
+ [
575
+ {
576
+ json : workflowErrorData ,
577
+ } ,
578
+ ] ,
579
+ ] ,
580
+ } ,
581
+ source : null ,
582
+ metadata : {
583
+ parentExecution : {
584
+ executionId : 'execution-id' ,
585
+ workflowId : 'workflow-id' ,
586
+ } ,
587
+ } ,
588
+ } ,
589
+ ] ,
590
+ waitingExecution : { } ,
591
+ waitingExecutionSource : { } ,
592
+ } ,
593
+ resultData : {
594
+ runData : { } ,
595
+ } ,
596
+ startData : { } ,
597
+ } ,
598
+ workflowData : errorWorkflow ,
599
+ projectId : 'project-id' ,
600
+ } ) ;
601
+ } ) ;
602
+ } ) ;
493
603
} ) ;
494
604
495
605
function createMainConnection ( targetNode : string , sourceNode : string ) : IConnections {
0 commit comments