Exemplo n.º 1
0
        public virtual async Task <IHttpActionResult> UpdateCart(UpdateCartRequest updateCartRequest)
        {
            if (updateCartRequest == null)
            {
                return(BadRequest("updateCartRequest is required"));
            }
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var getCartParam = new GetCartParam
            {
                Scope       = ComposerContext.Scope,
                CultureInfo = ComposerContext.CultureInfo,
                CustomerId  = ComposerContext.CustomerId,
                CartName    = CartConfiguration.ShoppingCartName,
                BaseUrl     = RequestUtils.GetBaseUrl(Request).ToString(),
            };

            var updateCheckoutCartParam = new UpdateCheckoutCartParam
            {
                GetCartParam = getCartParam,
                CurrentStep  = updateCartRequest.CurrentStep.GetValueOrDefault(),
                IsGuest      = ComposerContext.IsGuest,
                UpdateValues = updateCartRequest.UpdatedCart
            };

            var updateCartResultViewModel = await CheckoutService.UpdateCheckoutCartAsync(updateCheckoutCartParam);

            return(Ok(updateCartResultViewModel));
        }
Exemplo n.º 2
0
        public async Task WHEN_Passing_Valid_Paramaters_SHould_Update_LastCheckoutStep()
        {
            //Arrange
            var cart = CreateBasicCart();

            cart.Shipments = new List <Shipment>
            {
                new Shipment
                {
                    LineItems = new List <LineItem>
                    {
                        new LineItem()
                    }
                }
            };

            var service = CreateCheckoutService(cart);

            // Act
            var param = new UpdateCheckoutCartParam
            {
                GetCartParam = CreateGetCartParam(),
                UpdateValues = new Dictionary <string, string>(),
                CurrentStep  = 2,
                IsGuest      = GetRandom.Boolean()
            };
            var processedCart = await service.UpdateCheckoutCartAsync(param);

            //Assert
            processedCart.Should().NotBeNull();
            processedCart.Cart.OrderSummary.CheckoutRedirectAction.LastCheckoutStep.ShouldBeEquivalentTo(3);
        }
Exemplo n.º 3
0
        public async Task WHEN_CustomMethod_Registered_AND_Passing_Valid_Parameters_SHOULD_Update_GuestCustomerInfo()
        {
            //Arrange
            var cart = CreateBasicCart();

            cart.Customer.Email = GetRandom.Email();

            var service = CreateCheckoutService(cart);

            var updatedCustomer = new CustomerSummaryViewModel
            {
                Email = GetRandom.Email()
            };

            // Act
            var param = new UpdateCheckoutCartParam
            {
                GetCartParam = CreateGetCartParam(),
                UpdateValues = CreateUpdateOperation("GuestCustomerInfo", updatedCustomer),
                CurrentStep  = GetRandom.Int(),
                IsGuest      = GetRandom.Boolean()
            };
            var processedCart = await service.UpdateCheckoutCartAsync(param);

            //Assert
            processedCart.Should().NotBeNull();
            processedCart.Cart.Customer.Email.ShouldBeEquivalentTo(updatedCustomer.Email);
        }
Exemplo n.º 4
0
        public virtual async Task <IHttpActionResult> UpdateCart(UpdateCartRequest updateCartRequest)
        {
            if (updateCartRequest == null)
            {
                return(BadRequest("updateCartRequest is required"));
            }
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var getCartUrlParam = new BaseUrlParameter
            {
                CultureInfo = ComposerContext.CultureInfo
            };

            var checkoutStepInfos = CartUrlProvider.GetCheckoutStepPageInfos(getCartUrlParam);

            var nextStepUrl = CartUrlProvider.GetCheckoutStepUrl(new GetCheckoutStepUrlParam
            {
                CultureInfo = ComposerContext.CultureInfo,
                StepNumber  = updateCartRequest.CurrentStep.GetValueOrDefault() + 1
            });

            var getCartParam = new GetCartParam
            {
                Scope       = ComposerContext.Scope,
                CultureInfo = ComposerContext.CultureInfo,
                CustomerId  = ComposerContext.CustomerId,
                CartName    = CartConfiguration.ShoppingCartName,
                BaseUrl     = RequestUtils.GetBaseUrl(Request).ToString(),
            };

            var updateCheckoutCartParam = new UpdateCheckoutCartParam
            {
                GetCartParam = getCartParam,
                CurrentStep  = updateCartRequest.CurrentStep.GetValueOrDefault(),
                IsGuest      = ComposerContext.IsGuest,
                UpdateValues = updateCartRequest.UpdatedCart
            };

            var homepageUrl = GetHomepageUrl();

            var updateCartResultViewModel = await CheckoutService.UpdateCheckoutCartAsync(updateCheckoutCartParam);

            SetHomepageUrl(updateCartResultViewModel.Cart, homepageUrl);
            SetEditCartUrl(updateCartResultViewModel.Cart);

            if (updateCartResultViewModel.Cart.OrderSummary != null)
            {
                updateCartResultViewModel.Cart.OrderSummary.CheckoutStepUrls = checkoutStepInfos.Values.Select(x => x.Url).ToList();
            }

            if (!updateCartResultViewModel.HasErrors)
            {
                updateCartResultViewModel.NextStepUrl = nextStepUrl;
            }

            return(Ok(updateCartResultViewModel));
        }
Exemplo n.º 5
0
        public void WHEN_Passing_Null_GetCartParam_Parameter_SHOULD_Throw_Exception()
        {
            //Arrange
            var service = _container.CreateInstance <CheckoutService>();
            var param   = new UpdateCheckoutCartParam
            {
                GetCartParam = null,
                CurrentStep  = GetRandom.Int(),
                UpdateValues = new Dictionary <string, string>(),
                IsGuest      = GetRandom.Boolean()
            };

            // Act and Assert
            Assert.ThrowsAsync <ArgumentException>(() => service.UpdateCheckoutCartAsync(param));
        }
Exemplo n.º 6
0
        public async Task WHEN_Passing_Valid_Parameters_SHOULD_Update_BillingAddress_With_ShippingAddress()
        {
            //Arrange
            var shippingAddress = new Address
            {
                City        = "Paris",
                FirstName   = GetRandom.String(32),
                LastName    = GetRandom.String(32),
                Line1       = GetRandom.String(32),
                Line2       = GetRandom.String(32),
                RegionCode  = GetRandom.String(32),
                CountryCode = GetRandom.String(32),
                PhoneNumber = GetRandom.String(32)
            };

            var cart = CreateBasicCart();

            cart.Shipments.First().Address = shippingAddress;

            var service = CreateCheckoutService(cart);

            var updatedBillingAddress = new BillingAddressViewModel
            {
                UseShippingAddress = true,
            };

            // Act
            var param = new UpdateCheckoutCartParam
            {
                GetCartParam = CreateGetCartParam(),
                UpdateValues = CreateUpdateOperation("BillingAddress", updatedBillingAddress),
                CurrentStep  = GetRandom.Int(),
                IsGuest      = GetRandom.Boolean()
            };
            var processedCart = await service.UpdateCheckoutCartAsync(param);

            //Assert
            processedCart.Should().NotBeNull();
            processedCart.Cart.Payment.BillingAddress.City.Should().Be("Paris");
            processedCart.Cart.Payment.BillingAddress.FirstName.ShouldBeEquivalentTo(shippingAddress.FirstName);
            processedCart.Cart.Payment.BillingAddress.LastName.ShouldBeEquivalentTo(shippingAddress.LastName);
            processedCart.Cart.Payment.BillingAddress.Line1.ShouldBeEquivalentTo(shippingAddress.Line1);
            processedCart.Cart.Payment.BillingAddress.Line2.ShouldBeEquivalentTo(shippingAddress.Line2);
            processedCart.Cart.Payment.BillingAddress.RegionCode.ShouldBeEquivalentTo(shippingAddress.RegionCode);
            processedCart.Cart.Payment.BillingAddress.CountryCode.ShouldBeEquivalentTo(shippingAddress.CountryCode);
            processedCart.Cart.Payment.BillingAddress.PhoneNumber.ShouldBeEquivalentTo(shippingAddress.PhoneNumber);
        }
Exemplo n.º 7
0
        public async Task WHEN_Passing_RegisteredCustomer_Valid_Parameters_SHOULD_Update_ShippingAddress()
        {
            //Arrange
            var cart = CreateBasicCart();

            cart.Shipments.First().Address = new Address()
            {
                City       = GetRandom.String(10),
                PostalCode = GetRandom.String(6),
                Id         = Guid.NewGuid()
            };

            var service = CreateCheckoutService(cart);

            var updatedAddress = new RegisteredShippingAddressViewModel
            {
                ShippingAddressId = Guid.NewGuid()
            };
            var address = await _container.Get <IAddressRepository>().GetAddressByIdAsync(updatedAddress.ShippingAddressId);

            // Act
            var param = new UpdateCheckoutCartParam
            {
                GetCartParam = CreateGetCartParam(),
                UpdateValues = CreateUpdateOperation("ShippingAddressRegistered", updatedAddress),
                CurrentStep  = GetRandom.Int(),
                IsGuest      = GetRandom.Boolean()
            };
            var processedCart = await service.UpdateCheckoutCartAsync(param);

            //Assert
            processedCart.Cart.Should().NotBeNull();
            processedCart.Cart.ShippingAddress.AddressBookId.ShouldBeEquivalentTo(updatedAddress.ShippingAddressId);
            processedCart.Cart.ShippingAddress.AddressName.ShouldBeEquivalentTo(address.AddressName);
            processedCart.Cart.ShippingAddress.City.ShouldBeEquivalentTo(address.City);
            processedCart.Cart.ShippingAddress.CountryCode.ShouldBeEquivalentTo(address.CountryCode);
            processedCart.Cart.ShippingAddress.FirstName.ShouldBeEquivalentTo(address.FirstName);
            processedCart.Cart.ShippingAddress.LastName.ShouldBeEquivalentTo(address.LastName);
            processedCart.Cart.ShippingAddress.Line1.ShouldBeEquivalentTo(address.Line1);
            processedCart.Cart.ShippingAddress.Line2.ShouldBeEquivalentTo(address.Line2);
            processedCart.Cart.ShippingAddress.PhoneNumber.ShouldBeEquivalentTo(address.PhoneNumber);
            processedCart.Cart.ShippingAddress.PostalCode.ShouldBeEquivalentTo(address.PostalCode);
            processedCart.Cart.ShippingAddress.RegionCode.ShouldBeEquivalentTo(address.RegionCode);
        }
Exemplo n.º 8
0
        public async Task WHEN_Passing_Valid_Parameters_SHOULD_Update_ShippingMethod()
        {
            //Arrange
            var updatedShippingMethod = new ShippingMethodViewModel
            {
                Name = GetRandom.String(32),
                ShippingProviderId = Guid.NewGuid(),
                Cost = GetRandom.PositiveInt(100).ToString(),
            };

            var mock = new Mock <IFulfillmentMethodRepository>();

            mock.Setup(repo => repo.GetCalculatedFulfillmentMethods(It.IsAny <GetShippingMethodsParam>()))
            .ReturnsAsync(new List <FulfillmentMethod>
            {
                new FulfillmentMethod(),
                new FulfillmentMethod
                {
                    Name = updatedShippingMethod.Name,
                    ShippingProviderId = updatedShippingMethod.ShippingProviderId
                }
            });

            _container.Use(mock);

            var cart    = CreateBasicCart();
            var service = CreateCheckoutService(cart);

            // Act
            var param = new UpdateCheckoutCartParam
            {
                GetCartParam = CreateGetCartParam(),
                UpdateValues = CreateUpdateOperation("ShippingMethod", updatedShippingMethod),
                CurrentStep  = GetRandom.Int(),
                IsGuest      = GetRandom.Boolean()
            };
            var processedCart = await service.UpdateCheckoutCartAsync(param);

            //Assert
            processedCart.Cart.Should().NotBeNull();
            processedCart.Cart.ShippingMethod.Name.Should().BeEquivalentTo(updatedShippingMethod.Name);
            processedCart.Cart.ShippingMethod.ShippingProviderId.ShouldBeEquivalentTo(updatedShippingMethod.ShippingProviderId);
        }
Exemplo n.º 9
0
        public async Task WHEN_Passing_Valid_Parameters_And_Having_Custom_Field_SHOULD_Update_GuestCustomerInfo()
        {
            //Arrange
            var cart = CreateBasicCart();

            cart.Customer.Email = GetRandom.Email();

            var service = CreateCheckoutService(cart);

            service.RegisterCartUpdateOperation <CustomerSummaryViewModel>("GuestCustomerInfo", UpdateCustomerWithCustomFieldInBag, GetRandom.PositiveInt(100));

            var updatedCustomer = new FakeCustomerViewModelWithCustomField
            {
                Email       = "test2",
                CustomField = "test3"
            };

            var jsonViewModel = JsonConvert.SerializeObject(updatedCustomer);
            var operations    = new Dictionary <string, string> {
                { "GuestCustomerInfo", jsonViewModel }
            };

            // Act
            var param = new UpdateCheckoutCartParam
            {
                GetCartParam = CreateGetCartParam(),
                UpdateValues = operations,
                CurrentStep  = GetRandom.Int(),
                IsGuest      = GetRandom.Boolean()
            };
            var processedCart = await service.UpdateCheckoutCartAsync(param);

            //Assert
            processedCart.Should().NotBeNull();
            processedCart.Cart.Customer.Email.ShouldBeEquivalentTo("test2-test3");
        }
        /// <summary>
        /// Update a Cart during the checkout process.
        /// </summary>
        /// <param name="param">UpdateCheckoutCartParam</param>
        public virtual async Task <UpdateCartResultViewModel> UpdateCheckoutCartAsync(UpdateCheckoutCartParam param)
        {
            if (param == null)
            {
                throw new ArgumentNullException("param");
            }
            if (param.GetCartParam == null)
            {
                throw new ArgumentException("param");
            }
            if (param.UpdateValues == null)
            {
                throw new ArgumentException("UpdateValues");
            }

            var cart = await CartRepository.GetCartAsync(param.GetCartParam).ConfigureAwait(false);

            if (cart == null)
            {
                throw new InvalidOperationException("No cart found");
            }

            SetCustomerType(param.IsGuest, cart);
            UpdateStepInfo(cart, param.CurrentStep + 1);

            var operationsToExecute = GetOperationsToExecute(param.UpdateValues);

            foreach (var operation in operationsToExecute)
            {
                await operation.Invoke(cart);
            }

            var updatedCart = await CartRepository.UpdateCartAsync(UpdateCartParamFactory.Build(cart)).ConfigureAwait(false);

            var createCartViewModelParam = new CreateCartViewModelParam
            {
                Cart        = updatedCart,
                CultureInfo = param.GetCartParam.CultureInfo,
                BaseUrl     = param.GetCartParam.BaseUrl
            };

            var cartViewModel = await CreateCartViewModelAsync(createCartViewModelParam).ConfigureAwait(false);

            var updateCartResultViewModel = new UpdateCartResultViewModel
            {
                HasErrors = updatedCart.Messages != null && updatedCart.Messages.Any(m => m.Severity == ExecutionMessageSeverity.Error || m.Severity == ExecutionMessageSeverity.Failure),
                Cart      = cartViewModel
            };

            return(updateCartResultViewModel);
        }