@@ -19,10 +19,12 @@ import {
19
19
StepFunction ,
20
20
StepResponse ,
21
21
transform ,
22
+ when ,
22
23
WorkflowResponse ,
23
24
} from ".."
24
25
import { MedusaWorkflow } from "../../../medusa-workflow"
25
26
import { createHook } from "../create-hook"
27
+ import { setTimeout } from "timers/promises"
26
28
27
29
jest . setTimeout ( 30000 )
28
30
@@ -742,6 +744,71 @@ describe("Workflow composer", function () {
742
744
} )
743
745
} )
744
746
747
+ it ( "should compose a new workflow with conditional parallelized steps" , async ( ) => {
748
+ const stepResults : string [ ] = [ ]
749
+
750
+ const mockStep1Fn = jest . fn ( ) . mockImplementation ( async ( ) => {
751
+ await setTimeout ( 100 )
752
+ stepResults . push ( "step1" )
753
+ return new StepResponse ( true )
754
+ } ) as any
755
+ const mockStep2Fn = jest . fn ( ) . mockImplementation ( ( ) => {
756
+ stepResults . push ( "step2" )
757
+ return new StepResponse ( true )
758
+ } ) as any
759
+ const mockStep3Fn = jest . fn ( ) . mockImplementation ( ( ) => {
760
+ stepResults . push ( "step3" )
761
+ return new StepResponse ( true )
762
+ } ) as any
763
+ const mockStep4Fn = jest . fn ( ) . mockImplementation ( ( ) => {
764
+ stepResults . push ( "step4" )
765
+ return new StepResponse ( true )
766
+ } ) as any
767
+
768
+ const step1 = createStep ( "step1" , mockStep1Fn )
769
+ const step2 = createStep ( "step2" , mockStep2Fn )
770
+ const step3 = createStep ( "step3" , mockStep3Fn )
771
+ const step4 = createStep ( "step4" , mockStep4Fn )
772
+
773
+ const callStep2IfNeeded = ( ) => {
774
+ return when ( { } , ( ) => false ) . then ( ( ) => {
775
+ return step2 ( )
776
+ } )
777
+ }
778
+
779
+ const callStep3IfNeeded = ( ) => {
780
+ return when ( { } , ( ) => false ) . then ( ( ) => {
781
+ return step4 ( )
782
+ } )
783
+ }
784
+
785
+ const workflow = createWorkflow ( "workflow1" , function ( input ) {
786
+ const [ ret1 , ret2 , ret3 , ret4 ] = parallelize (
787
+ step1 ( ) ,
788
+ callStep2IfNeeded ( ) ,
789
+ step3 ( ) ,
790
+ callStep3IfNeeded ( )
791
+ )
792
+ return new WorkflowResponse ( { ret1, ret2, ret3, ret4 } )
793
+ } )
794
+
795
+ const { result : workflowResult } = await workflow ( ) . run ( )
796
+
797
+ expect ( mockStep1Fn ) . toHaveBeenCalledTimes ( 1 )
798
+ expect ( mockStep2Fn ) . toHaveBeenCalledTimes ( 0 )
799
+ expect ( mockStep3Fn ) . toHaveBeenCalledTimes ( 1 )
800
+ expect ( mockStep4Fn ) . toHaveBeenCalledTimes ( 0 )
801
+
802
+ expect ( workflowResult ) . toEqual ( {
803
+ ret1 : true ,
804
+ ret2 : undefined ,
805
+ ret3 : true ,
806
+ ret4 : undefined ,
807
+ } )
808
+
809
+ expect ( stepResults ) . toEqual ( [ "step3" , "step1" ] )
810
+ } )
811
+
745
812
it ( "should compose a new workflow with parallelize steps and rollback them all in case of error" , async ( ) => {
746
813
const step1CompensationFn = jest . fn ( ) . mockImplementation ( ( ) => {
747
814
return "step1 compensation"
0 commit comments