flamingo.me/flamingo-commerce/v3@v3.11.0/checkout/domain/placeorder/states/complete_cart_test.go (about) 1 package states_test 2 3 import ( 4 "context" 5 "errors" 6 "net/url" 7 "testing" 8 9 "flamingo.me/flamingo/v3/framework/flamingo" 10 "flamingo.me/flamingo/v3/framework/web" 11 "github.com/go-test/deep" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/mock" 14 15 cartApplication "flamingo.me/flamingo-commerce/v3/cart/application" 16 cartDomain "flamingo.me/flamingo-commerce/v3/cart/domain/cart" 17 "flamingo.me/flamingo-commerce/v3/cart/domain/cart/mocks" 18 "flamingo.me/flamingo-commerce/v3/checkout/domain/placeorder/process" 19 "flamingo.me/flamingo-commerce/v3/checkout/domain/placeorder/states" 20 ) 21 22 func TestCompleteCart_IsFinal(t *testing.T) { 23 assert.False(t, states.CompleteCart{}.IsFinal()) 24 } 25 26 func TestCompleteCart_Name(t *testing.T) { 27 assert.Equal(t, "CompleteCart", states.CompleteCart{}.Name()) 28 } 29 30 func TestCompleteCart_Run(t *testing.T) { 31 cart := cartDomain.Cart{ID: "mock_guest_cart"} 32 33 tests := []struct { 34 name string 35 behaviour cartDomain.ModifyBehaviour 36 behaviourError error 37 validator func(*testing.T, interface{}) 38 expectedState string 39 expectedResult process.RunResult 40 }{ 41 { 42 name: "successful completion", 43 behaviour: func() cartDomain.ModifyBehaviour { 44 behaviour := new(mocks.AllBehaviour) 45 behaviour.CompleteBehaviour.EXPECT().Complete(mock.Anything, &cart).Return(&cart, nil, nil) 46 return behaviour 47 }(), 48 behaviourError: nil, 49 validator: func(t *testing.T, behaviour interface{}) { 50 t.Helper() 51 behaviour.(*mocks.AllBehaviour).CompleteBehaviour.AssertNumberOfCalls(t, "Complete", 1) 52 }, 53 expectedState: states.PlaceOrder{}.Name(), 54 expectedResult: process.RunResult{ 55 RollbackData: states.CompleteCartRollbackData{ 56 CompletedCart: &cart, 57 }, 58 }, 59 }, 60 { 61 name: "error on completion", 62 behaviour: func() cartDomain.ModifyBehaviour { 63 behaviour := new(mocks.AllBehaviour) 64 behaviour.CompleteBehaviour.EXPECT().Complete(mock.Anything, &cart).Return(nil, nil, errors.New("test error")) 65 return behaviour 66 }(), 67 behaviourError: nil, 68 validator: func(t *testing.T, behaviour interface{}) { 69 t.Helper() 70 behaviour.(*mocks.AllBehaviour).CompleteBehaviour.AssertNumberOfCalls(t, "Complete", 1) 71 }, 72 expectedState: states.New{}.Name(), 73 expectedResult: process.RunResult{ 74 Failed: process.ErrorOccurredReason{Error: "test error"}, 75 }, 76 }, 77 { 78 name: "no complete behaviour", 79 behaviour: func() cartDomain.ModifyBehaviour { 80 behaviour := new(mocks.ModifyBehaviour) 81 return behaviour 82 }(), 83 behaviourError: nil, 84 validator: nil, 85 expectedState: states.PlaceOrder{}.Name(), 86 expectedResult: process.RunResult{}, 87 }, 88 { 89 name: "no behaviour", 90 behaviour: func() cartDomain.ModifyBehaviour { 91 return nil 92 }(), 93 behaviourError: errors.New("no behaviour"), 94 validator: nil, 95 expectedState: states.New{}.Name(), 96 expectedResult: process.RunResult{ 97 Failed: process.ErrorOccurredReason{Error: "no behaviour"}, 98 }, 99 }, 100 } 101 102 for _, tt := range tests { 103 t.Run(tt.name, func(t *testing.T) { 104 factory := provideProcessFactory(t) 105 106 p, _ := factory.New(&url.URL{}, cart) 107 108 cartReceiverService := &cartApplication.CartReceiverService{} 109 guestCartService := new(mocks.GuestCartService) 110 guestCartService.EXPECT().GetModifyBehaviour(mock.Anything).Return(tt.behaviour, tt.behaviourError) 111 guestCartService.EXPECT().GetNewCart(mock.Anything).Return(&cart, nil) 112 cartReceiverService.Inject( 113 guestCartService, 114 nil, 115 nil, 116 nil, 117 new(flamingo.NullLogger), 118 nil, 119 nil, 120 ) 121 cartService := &cartApplication.CartService{} 122 cartService.Inject( 123 cartReceiverService, 124 nil, 125 nil, 126 nil, 127 nil, 128 nil, 129 nil, 130 new(flamingo.NullLogger), 131 nil, 132 nil, 133 ) 134 135 state := states.CompleteCart{} 136 state.Inject(cartService, cartReceiverService) 137 ctx := web.ContextWithSession(context.Background(), web.EmptySession()) 138 139 result := state.Run(ctx, p) 140 assert.Equal(t, tt.expectedState, p.Context().CurrentStateName) 141 142 if diff := deep.Equal(result, tt.expectedResult); diff != nil { 143 t.Error("expected result is wrong: ", diff) 144 } 145 146 if tt.validator != nil { 147 tt.validator(t, tt.behaviour) 148 } 149 }) 150 } 151 } 152 153 func TestCompleteCart_Rollback(t *testing.T) { 154 cart := cartDomain.Cart{ID: "mock_guest_cart"} 155 156 tests := []struct { 157 name string 158 behaviour cartDomain.ModifyBehaviour 159 rollbackData process.RollbackData 160 validator func(*testing.T, interface{}) 161 expectedError error 162 }{ 163 { 164 name: "successful restore", 165 behaviour: func() cartDomain.ModifyBehaviour { 166 behaviour := new(mocks.AllBehaviour) 167 behaviour.CompleteBehaviour.EXPECT().Restore(mock.Anything, &cart).Return(&cart, nil, nil) 168 return behaviour 169 }(), 170 rollbackData: states.CompleteCartRollbackData{ 171 CompletedCart: &cart, 172 }, 173 validator: func(t *testing.T, behaviour interface{}) { 174 t.Helper() 175 behaviour.(*mocks.AllBehaviour).CompleteBehaviour.AssertNumberOfCalls(t, "Restore", 1) 176 }, 177 expectedError: nil, 178 }, 179 { 180 name: "error on restore", 181 behaviour: func() cartDomain.ModifyBehaviour { 182 behaviour := new(mocks.AllBehaviour) 183 behaviour.CompleteBehaviour.EXPECT().Restore(mock.Anything, &cart).Return(nil, nil, errors.New("test error")) 184 return behaviour 185 }(), 186 rollbackData: states.CompleteCartRollbackData{ 187 CompletedCart: &cart, 188 }, 189 validator: func(t *testing.T, behaviour interface{}) { 190 t.Helper() 191 behaviour.(*mocks.AllBehaviour).CompleteBehaviour.AssertNumberOfCalls(t, "Restore", 1) 192 }, 193 expectedError: errors.New("test error"), 194 }, 195 { 196 name: "wrong rollback data", 197 behaviour: func() cartDomain.ModifyBehaviour { 198 behaviour := new(mocks.AllBehaviour) 199 return behaviour 200 }(), 201 rollbackData: nil, 202 validator: nil, 203 expectedError: errors.New("rollback data not of expected type 'CompleteCartRollbackData', but <nil>"), 204 }, 205 } 206 207 for _, tt := range tests { 208 t.Run(tt.name, func(t *testing.T) { 209 cartReceiverService := &cartApplication.CartReceiverService{} 210 guestCartService := new(mocks.GuestCartService) 211 guestCartService.EXPECT().GetModifyBehaviour(mock.Anything).Return(tt.behaviour, nil) 212 guestCartService.EXPECT().GetNewCart(mock.Anything).Return(&cart, nil) 213 cartReceiverService.Inject( 214 guestCartService, 215 nil, 216 nil, 217 nil, 218 new(flamingo.NullLogger), 219 nil, 220 nil, 221 ) 222 cartService := &cartApplication.CartService{} 223 cartService.Inject( 224 cartReceiverService, 225 nil, 226 nil, 227 nil, 228 nil, 229 nil, 230 nil, 231 new(flamingo.NullLogger), 232 nil, 233 nil, 234 ) 235 236 state := states.CompleteCart{} 237 state.Inject(cartService, cartReceiverService) 238 ctx := web.ContextWithSession(context.Background(), web.EmptySession()) 239 err := state.Rollback(ctx, tt.rollbackData) 240 assert.Equal(t, tt.expectedError, err) 241 }) 242 } 243 }