flamingo.me/flamingo-commerce/v3@v3.11.0/cart/application/eventHandling_test.go (about) 1 package application_test 2 3 import ( 4 "context" 5 "testing" 6 7 "flamingo.me/flamingo-commerce/v3/cart/application" 8 "flamingo.me/flamingo-commerce/v3/cart/application/mocks" 9 "flamingo.me/flamingo-commerce/v3/cart/domain/cart" 10 "flamingo.me/flamingo-commerce/v3/product/domain" 11 "flamingo.me/flamingo/v3/core/auth" 12 authMock "flamingo.me/flamingo/v3/core/auth/mock" 13 "flamingo.me/flamingo/v3/framework/flamingo" 14 "flamingo.me/flamingo/v3/framework/web" 15 "github.com/stretchr/testify/mock" 16 ) 17 18 func TestEventReceiver_Notify(t *testing.T) { 19 t.Parallel() 20 21 t.Run("Invalidate cart cache on WebLogoutEvent", func(t *testing.T) { 22 t.Parallel() 23 24 receiver := &application.EventReceiver{} 25 26 ctx := context.Background() 27 session := web.EmptySession() 28 29 cartCache := mocks.NewCartCache(t) 30 cartCache.EXPECT().DeleteAll(mock.Anything, session).Return(nil) 31 32 receiver.Inject(flamingo.NullLogger{}, nil, nil, nil, &struct { 33 CartCache application.CartCache `inject:",optional"` 34 }{cartCache}) 35 36 receiver.Notify(ctx, &auth.WebLogoutEvent{ 37 Request: web.CreateRequest(nil, session), 38 Broker: "example", 39 }) 40 }) 41 42 t.Run("Invalidate cart cache on InvalidateCartEvent", func(t *testing.T) { 43 t.Parallel() 44 45 receiver := &application.EventReceiver{} 46 47 ctx := context.Background() 48 session := web.EmptySession() 49 50 cartCache := mocks.NewCartCache(t) 51 cartCache.EXPECT().BuildIdentifier(mock.Anything, session).Return(application.CartCacheIdentifier{ 52 GuestCartID: "foo", 53 IsCustomerCart: false, 54 CustomerID: "", 55 }, nil) 56 57 cartCache.EXPECT().Invalidate(mock.Anything, session, application.CartCacheIdentifier{ 58 GuestCartID: "foo", 59 IsCustomerCart: false, 60 CustomerID: "", 61 }).Return(nil) 62 63 receiver.Inject(flamingo.NullLogger{}, nil, nil, nil, &struct { 64 CartCache application.CartCache `inject:",optional"` 65 }{cartCache}) 66 67 receiver.Notify(ctx, &cart.InvalidateCartEvent{Session: web.EmptySession()}) 68 }) 69 70 t.Run("CartMerger is called on WebLoginEvent", func(t *testing.T) { 71 t.Parallel() 72 73 session := web.EmptySession() 74 request := web.CreateRequest(nil, session) 75 76 guestCart := cart.Cart{ID: "guestCart", BelongsToAuthenticatedUser: false} 77 customerCart := cart.Cart{ID: "customerCart", BelongsToAuthenticatedUser: true} 78 79 cartReceiver := mocks.NewCartReceiver(t) 80 cartReceiver.EXPECT().ShouldHaveGuestCart(session).Return(true) 81 cartReceiver.EXPECT().ViewGuestCart(mock.Anything, session).Return(&guestCart, nil) 82 cartReceiver.EXPECT().ViewCart(mock.Anything, session).Return(&customerCart, nil) 83 cartMerger := mocks.NewCartMerger(t) 84 cartMerger.EXPECT().Merge(mock.Anything, session, guestCart, customerCart) 85 86 cartCache := mocks.NewCartCache(t) 87 cartCache.EXPECT().BuildIdentifier(mock.Anything, session).Return(application.CartCacheIdentifier{}, nil) 88 cartCache.EXPECT().Delete(mock.Anything, session, application.CartCacheIdentifier{}).Return(nil) 89 eventRouter := &MockEventRouter{} 90 91 receiver := &application.EventReceiver{} 92 receiver.Inject(flamingo.NullLogger{}, cartReceiver, eventRouter, cartMerger, &struct { 93 CartCache application.CartCache `inject:",optional"` 94 }{cartCache}) 95 96 receiver.Notify(context.Background(), &auth.WebLoginEvent{ 97 Request: request, 98 Broker: "example", 99 Identity: &authMock.Identity{}, 100 }) 101 }) 102 } 103 104 func TestCartMergeStrategyReplace_Merge(t *testing.T) { 105 t.Parallel() 106 107 session := web.EmptySession() 108 109 c := &application.CartMergeStrategyReplace{} 110 cartService := mocks.NewCartService(t) 111 cartService.EXPECT().Clean(mock.Anything, session).Return(nil) 112 cartService.EXPECT().UpdateDeliveryInfo(mock.Anything, session, "delivery1", mock.Anything).Return(nil) 113 cartService.EXPECT().AddProduct(mock.Anything, session, "delivery1", cart.AddRequest{ 114 MarketplaceCode: "foo", 115 Qty: 1, 116 }).Return(nil, nil) 117 cartService.EXPECT().AddProduct(mock.Anything, session, "delivery1", cart.AddRequest{ 118 MarketplaceCode: "bundle", 119 Qty: 1, 120 BundleConfiguration: map[domain.Identifier]domain.ChoiceConfiguration{"slot1": { 121 MarketplaceCode: "bar", 122 VariantMarketplaceCode: "baz", 123 Qty: 2, 124 }}, 125 }).Return(nil, nil) 126 cartService.EXPECT().UpdateBillingAddress(mock.Anything, session, mock.Anything).Return(nil) 127 cartService.EXPECT().UpdatePurchaser(mock.Anything, session, mock.Anything, mock.Anything).Return(nil) 128 cartService.EXPECT().ApplyVoucher(mock.Anything, session, "SUMMER_SALE").Return(&cart.Cart{}, nil) 129 cartService.EXPECT().ApplyGiftCard(mock.Anything, session, "GHDJAHJH-DADAD-2113").Return(&cart.Cart{}, nil) 130 cartService.EXPECT().UpdatePaymentSelection(mock.Anything, session, mock.Anything).Return(nil) 131 c.Inject(flamingo.NullLogger{}, cartService) 132 c.Merge(context.Background(), session, cart.Cart{ 133 ID: "guest", BelongsToAuthenticatedUser: false, 134 Deliveries: []cart.Delivery{{ 135 DeliveryInfo: cart.DeliveryInfo{Code: "delivery1"}, 136 Cartitems: []cart.Item{ 137 {MarketplaceCode: "foo", Qty: 1}, 138 { 139 140 MarketplaceCode: "bundle", 141 BundleConfig: map[domain.Identifier]domain.ChoiceConfiguration{"slot1": { 142 MarketplaceCode: "bar", 143 VariantMarketplaceCode: "baz", 144 Qty: 2, 145 }}, 146 Qty: 1, 147 }, 148 }, 149 }}, 150 BillingAddress: &cart.Address{}, 151 Purchaser: &cart.Person{}, 152 AppliedCouponCodes: []cart.CouponCode{{Code: "SUMMER_SALE"}}, 153 AppliedGiftCards: []cart.AppliedGiftCard{{Code: "GHDJAHJH-DADAD-2113"}}, 154 PaymentSelection: cart.DefaultPaymentSelection{}, 155 }, cart.Cart{ID: "customer", BelongsToAuthenticatedUser: true}) 156 } 157 158 func TestCartMergeStrategyMerge_Merge(t *testing.T) { 159 t.Parallel() 160 161 session := web.EmptySession() 162 163 c := &application.CartMergeStrategyMerge{} 164 cartService := mocks.NewCartService(t) 165 cartService.EXPECT().UpdateDeliveryInfo(mock.Anything, session, "delivery1", mock.Anything).Return(nil) 166 cartService.EXPECT().AddProduct(mock.Anything, session, "delivery1", cart.AddRequest{ 167 MarketplaceCode: "foo", 168 Qty: 1, 169 }).Return(nil, nil) 170 cartService.EXPECT().AddProduct(mock.Anything, session, "delivery1", cart.AddRequest{ 171 MarketplaceCode: "bundle", 172 Qty: 1, 173 BundleConfiguration: map[domain.Identifier]domain.ChoiceConfiguration{"slot1": { 174 MarketplaceCode: "bar", 175 VariantMarketplaceCode: "baz", 176 Qty: 2, 177 }}, 178 }).Return(nil, nil) 179 cartService.EXPECT().UpdateBillingAddress(mock.Anything, session, mock.Anything).Return(nil) 180 cartService.EXPECT().UpdatePurchaser(mock.Anything, session, mock.Anything, mock.Anything).Return(nil) 181 cartService.EXPECT().ApplyVoucher(mock.Anything, session, "SUMMER_SALE").Return(&cart.Cart{}, nil) 182 cartService.EXPECT().ApplyGiftCard(mock.Anything, session, "GHDJAHJH-DADAD-2113").Return(&cart.Cart{}, nil) 183 cartService.EXPECT().UpdatePaymentSelection(mock.Anything, session, mock.Anything).Return(nil) 184 c.Inject(flamingo.NullLogger{}, cartService) 185 c.Merge(context.Background(), session, cart.Cart{ 186 ID: "guest", BelongsToAuthenticatedUser: false, 187 Deliveries: []cart.Delivery{{ 188 DeliveryInfo: cart.DeliveryInfo{Code: "delivery1"}, 189 Cartitems: []cart.Item{ 190 {MarketplaceCode: "foo", Qty: 1}, 191 { 192 193 MarketplaceCode: "bundle", 194 BundleConfig: map[domain.Identifier]domain.ChoiceConfiguration{"slot1": { 195 MarketplaceCode: "bar", 196 VariantMarketplaceCode: "baz", 197 Qty: 2, 198 }}, 199 Qty: 1, 200 }, 201 }, 202 }}, 203 BillingAddress: &cart.Address{}, 204 Purchaser: &cart.Person{}, 205 AppliedCouponCodes: []cart.CouponCode{{Code: "SUMMER_SALE"}}, 206 AppliedGiftCards: []cart.AppliedGiftCard{{Code: "GHDJAHJH-DADAD-2113"}}, 207 PaymentSelection: cart.DefaultPaymentSelection{}, 208 }, cart.Cart{ID: "customer", BelongsToAuthenticatedUser: true}) 209 } 210 211 func TestCartMergeStrategyNone_Merge(t *testing.T) { 212 t.Parallel() 213 214 c := &application.CartMergeStrategyNone{} 215 c.Merge(context.Background(), nil, cart.Cart{}, cart.Cart{}) 216 }