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  }