public void SetPaymentInfo_IfAddPaymentInfoFailed_ShouldReturnsError(
            CartResult loadCartResult,
            CartResult updateCartResult,
            CartResult removeCartResult,
            AddPaymentInfoResult addCartResult,
            Address address,
            Party party,
            Models.Entities.Payment.FederatedPaymentInfo federatedPaymentInfo,
            SystemMessage systemMessage)
        {
            //arrange
            loadCartResult.Success = true;
            this.cartManager.LoadCart(Arg.Any <string>(), Arg.Any <string>()).Returns(loadCartResult);

            updateCartResult.Success = true;
            this.cartManager.UpdateCart(Arg.Any <Cart>(), Arg.Any <CartBase>()).Returns(updateCartResult);

            removeCartResult.Success = true;
            this.cartManager.RemovePaymentInfo(Arg.Any <Cart>()).Returns(removeCartResult);

            addCartResult.Success = false;
            addCartResult.SystemMessages.Add(systemMessage);
            this.cartManager.AddPaymentInfo(Arg.Any <Cart>(), Arg.Any <Party>(), Arg.Any <FederatedPaymentInfo>()).Returns(addCartResult);

            this.paymentMapper.Map <Address, Party>(address).Returns(party);

            //act
            var result = this.billingService.SetPaymentInfo(address, federatedPaymentInfo);

            //assert
            Assert.False(result.Success);
            Assert.Equal(systemMessage.Message, result.Errors[0]);
        }
        public void SetPaymentInfo_IfAddressIsNull_ShouldReturnsException(Models.Entities.Payment.FederatedPaymentInfo federatedPaymentInfo)
        {
            //arrange
            Action Act = () => this.billingService.SetPaymentInfo(null, federatedPaymentInfo);

            //act & assert
            Assert.Throws <ArgumentNullException>(Act);
        }
        public Result <VoidResult> SetPaymentInfo(Address billingAddress, FederatedPaymentInfo federatedPayment)
        {
            Assert.ArgumentNotNull(billingAddress, nameof(billingAddress));
            Assert.ArgumentNotNull(federatedPayment, nameof(federatedPayment));

            var result = new Result <VoidResult>(new VoidResult());

            var cartResult = this.cartManager.LoadCart(
                this.storefrontContext.ShopName,
                this.visitorContext.CurrentUser?.CustomerId ??
                this.visitorContext.ContactId);

            if (!cartResult.Success)
            {
                result.SetErrors(cartResult.SystemMessages.Select(m => m.Message).ToList());

                return(result);
            }

            cartResult = this.UpdateCartEmail(cartResult.Cart, billingAddress.Email);

            if (!cartResult.Success)
            {
                result.SetErrors(cartResult.SystemMessages.Select(m => m.Message).ToList());

                return(result);
            }

            if (cartResult.Cart.Payment != null && cartResult.Cart.Payment.Any())
            {
                cartResult = this.cartManager.RemovePaymentInfo(cartResult.Cart);

                if (!cartResult.Success)
                {
                    result.SetErrors(cartResult.SystemMessages.Select(m => m.Message).ToList());

                    return(result);
                }
            }

            var party = this.CreatePartyFromAddress(billingAddress);
            var federatedPaymentInfo =
                this.paymentMapper.Map <FederatedPaymentInfo, Sitecore.Commerce.Entities.Carts.FederatedPaymentInfo>(
                    federatedPayment);
            var addPaymentInfoResult = this.cartManager.AddPaymentInfo(cartResult.Cart, party, federatedPaymentInfo);

            if (!addPaymentInfoResult.Success)
            {
                result.SetErrors(addPaymentInfoResult.SystemMessages.Select(m => m.Message).ToList());

                return(result);
            }

            return(result);
        }
        public void SetPaymentInfo__IfLoadCartFailed_ShouldReturnsError(
            CartResult cartResult,
            Address address,
            Models.Entities.Payment.FederatedPaymentInfo federatedPaymentInfo,
            SystemMessage systemMessage)
        {
            //arrange
            cartResult.Success = false;
            cartResult.SystemMessages.Add(systemMessage);
            this.cartManager.LoadCart(Arg.Any <string>(), Arg.Any <string>()).Returns(cartResult);

            //act
            var result = this.billingService.SetPaymentInfo(address, federatedPaymentInfo);

            //assert
            Assert.False(result.Success);
            Assert.Equal(systemMessage.Message, result.Errors[0]);
        }