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  }