public async Task WHEN_guest_cart_contains_no_lineitem_SHOULD_do_nothing()
        {
            //Arrange
            var guestCustomerId  = Guid.NewGuid();
            var loggedCustomerId = Guid.NewGuid();
            var guestCart        = new ProcessedCart
            {
                Shipments = new List <Shipment>
                {
                    new Shipment
                    {
                        LineItems = new List <LineItem>()
                    }
                }
            };
            var loggedCart = new ProcessedCart
            {
                Shipments = new List <Shipment>
                {
                    new Shipment
                    {
                        LineItems = new List <LineItem>()
                    }
                }
            };

            var cartRepositoryMock = new Mock <ICartRepository>();

            cartRepositoryMock
            .Setup(c => c.GetCartAsync(It.Is <GetCartParam>(x => x.CustomerId == guestCustomerId)))
            .ReturnsAsync(guestCart);

            cartRepositoryMock
            .Setup(c => c.GetCartAsync(It.Is <GetCartParam>(x => x.CustomerId == loggedCustomerId)))
            .ReturnsAsync(loggedCart);
            _container.Use(cartRepositoryMock);

            var provider = _container.CreateInstance <OverwriteCartMergeProvider>();

            //Act
            var param = new CartMergeParam
            {
                GuestCustomerId  = guestCustomerId,
                LoggedCustomerId = loggedCustomerId,
                Scope            = GetRandom.String(32)
            };

            await provider.MergeCartAsync(param).ConfigureAwait(false);

            //Assert
            cartRepositoryMock.Verify(c => c.UpdateCartAsync(It.IsAny <UpdateCartParam>()), Times.Never);
        }
Example #2
0
        /// <summary>
        /// Overwrites the lineitems of a logger customer's cart with the lineitems of a guest customer's cart if it is not empty.
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public async Task MergeCartAsync(CartMergeParam param)
        {
            if (param == null)
            {
                throw new ArgumentNullException("param");
            }
            if (param.GuestCustomerId == Guid.Empty)
            {
                throw new ArgumentException("param.GuestCustomerId");
            }
            if (param.LoggedCustomerId == Guid.Empty)
            {
                throw new ArgumentException("param.LoggedCustomerId");
            }
            if (string.IsNullOrEmpty(param.Scope))
            {
                throw new ArgumentException("param.Scope");
            }

            if (param.GuestCustomerId == param.LoggedCustomerId)
            {
                return;
            }

            var getLoggedCustomerTask = CartRepository.GetCartAsync(new GetCartParam
            {
                CustomerId  = param.LoggedCustomerId,
                CartName    = CartConfiguration.ShoppingCartName,
                Scope       = param.Scope,
                CultureInfo = CultureInfo.InvariantCulture,
            });

            var getGuestCustomerTask = CartRepository.GetCartAsync(new GetCartParam
            {
                CustomerId  = param.GuestCustomerId,
                CartName    = CartConfiguration.ShoppingCartName,
                Scope       = param.Scope,
                CultureInfo = CultureInfo.InvariantCulture,
            });

            var result = await Task.WhenAll(getLoggedCustomerTask, getGuestCustomerTask).ConfigureAwait(false);

            var loggedCustomerCart = result[0];
            var guestCustomerCart  = result[1];

            var guestCustomerLineItems = guestCustomerCart.GetLineItems();

            if (!guestCustomerLineItems.Any())
            {
                return;
            }

            loggedCustomerCart.Shipments.First().LineItems = guestCustomerLineItems;
            loggedCustomerCart.Coupons = guestCustomerCart.Coupons;

            var cart = await CartRepository.UpdateCartAsync(UpdateCartParamFactory.Build(loggedCustomerCart));

            await FixCartService.FixCartAsync(new FixCartParam
            {
                Cart = cart
            });
        }
        public async Task WHEN_Passing_Valid_Parameters_SHOULD_Succeed()
        {
            //Arrange
            var guestCustomerId  = Guid.NewGuid();
            var loggedCustomerId = Guid.NewGuid();
            var guestCart        = new ProcessedCart
            {
                Shipments = new List <Shipment>
                {
                    new Shipment
                    {
                        LineItems = new List <LineItem>
                        {
                            new LineItem
                            {
                                ProductId = "P1",
                                Quantity  = 1
                            }
                        }
                    }
                }
            };
            var loggedCart = new ProcessedCart
            {
                Shipments = new List <Shipment>
                {
                    new Shipment
                    {
                        LineItems = new List <LineItem>
                        {
                            new LineItem
                            {
                                ProductId = "P2",
                                Quantity  = 1
                            },
                        }
                    }
                }
            };

            var cartRepositoryMock = new Mock <ICartRepository>();

            cartRepositoryMock
            .Setup(c => c.GetCartAsync(It.Is <GetCartParam>(x => x.CustomerId == guestCustomerId)))
            .ReturnsAsync(guestCart);

            cartRepositoryMock
            .Setup(c => c.GetCartAsync(It.Is <GetCartParam>(x => x.CustomerId == loggedCustomerId)))
            .ReturnsAsync(loggedCart);
            _container.Use(cartRepositoryMock);

            var provider = _container.CreateInstance <OverwriteCartMergeProvider>();

            //Act
            var param = new CartMergeParam
            {
                GuestCustomerId  = guestCustomerId,
                LoggedCustomerId = loggedCustomerId,
                Scope            = GetRandom.String(32)
            };
            await provider.MergeCartAsync(param).ConfigureAwait(false);

            //Assert
            cartRepositoryMock.Verify(c => c.UpdateCartAsync(It.Is <UpdateCartParam>(p => VerifyMergedCart(p))), Times.Once);
        }
        /// <summary>
        /// Logs in a customer.
        /// </summary>
        /// <param name="loginParam">Service call params <see cref="LoginParam"/></param>
        /// <returns>
        /// The logged in Customer and a status representing a possible cause of errors
        /// </returns>
        public virtual async Task <LoginViewModel> LoginAsync(LoginParam loginParam)
        {
            if (loginParam == null)
            {
                throw new ArgumentNullException("loginParam");
            }
            if (loginParam.CultureInfo == null)
            {
                throw new ArgumentException("loginParam.CultureInfo");
            }
            if (string.IsNullOrWhiteSpace(loginParam.Password))
            {
                throw new ArgumentException("loginParam.Password");
            }
            if (string.IsNullOrWhiteSpace(loginParam.Username))
            {
                throw new ArgumentException("loginParam.Username");
            }
            if (string.IsNullOrWhiteSpace(loginParam.Scope))
            {
                throw new ArgumentException("loginParam.Scope");
            }

            var response = new CustomerAndStatus
            {
                Status = MyAccountStatus.Failed
            };

            var createAccountUrl = MyAccountUrlProvider.GetCreateAccountUrl(new BaseUrlParameter {
                CultureInfo = loginParam.CultureInfo, ReturnUrl = loginParam.ReturnUrl
            });
            var forgotPasswordUrl = MyAccountUrlProvider.GetForgotPasswordUrl(new BaseUrlParameter {
                CultureInfo = loginParam.CultureInfo, ReturnUrl = loginParam.ReturnUrl
            });
            var loginUrl = MyAccountUrlProvider.GetLoginUrl(new BaseUrlParameter {
                CultureInfo = loginParam.CultureInfo, ReturnUrl = loginParam.ReturnUrl
            });
            var userName = GenerateUserName(loginParam.Username);

            var loginResponse = Membership.LoginUser(userName, loginParam.Password);

            if (loginResponse)
            {
                var user = Membership.GetUser(userName, true);
                if (user != null && user.ProviderUserKey is Guid && !Guid.Empty.Equals(user.ProviderUserKey) && !user.IsLockedOut)
                {
                    var customer = await CustomerRepository.GetCustomerByIdAsync(new GetCustomerByIdParam
                    {
                        CultureInfo = loginParam.CultureInfo,
                        Scope       = loginParam.Scope,
                        CustomerId  = (Guid)user.ProviderUserKey
                    }).ConfigureAwait(false);


                    var cartMergeParam = new CartMergeParam
                    {
                        Scope            = loginParam.Scope,
                        GuestCustomerId  = loginParam.GuestCustomerId,
                        LoggedCustomerId = customer.Id
                    };
                    await CartMergeProvider.MergeCartAsync(cartMergeParam).ConfigureAwait(false);

                    response.Customer = customer;
                    response.Status   = MyAccountStatus.Success;
                    if (response.Customer.AccountStatus == AccountStatus.RequiresApproval)
                    {
                        response.Status = MyAccountStatus.RequiresApproval;
                    }
                }
            }

            return(GetLoginViewModel(new GetLoginViewModelParam
            {
                ReturnUrl = loginParam.ReturnUrl,
                Status = response.Status,
                Username = userName,
                CultureInfo = loginParam.CultureInfo,
                Customer = response.Customer,
                LoginUrl = loginUrl,
                CreateAccountUrl = createAccountUrl,
                ForgotPasswordUrl = forgotPasswordUrl
            }));
        }