public async Task WHEN_passing_valid_arguments_SHOULD_create_viewmodel()
        {
            //Arrange
            var address  = MockAddressFactory.CreateRandom();
            var customer = MockCustomerFactory.CreateRandom();

            customer.AddressIds = new List <Guid>
            {
                address.Id
            };

            var mockedCustomerRepository = new Mock <ICustomerRepository>();

            mockedCustomerRepository.Setup(r => r.GetCustomerByIdAsync(It.IsAny <GetCustomerByIdParam>())).ReturnsAsync(customer);
            _container.Use(mockedCustomerRepository);

            var mockedCustomerAddressRepository = new Mock <ICustomerAddressRepository>();

            mockedCustomerAddressRepository.Setup(r => r.UpdateAddressAsync(It.IsAny <Guid>(), It.IsAny <Address>())).ReturnsAsync(address);
            _container.Use(mockedCustomerAddressRepository);

            var mockedAddressRepository = new Mock <IAddressRepository>();

            mockedAddressRepository.Setup(r => r.GetAddressByIdAsync(It.IsAny <Guid>())).ReturnsAsync(address);
            _container.Use(mockedAddressRepository);

            var customerViewService = _container.CreateInstance <CustomerAddressViewService>();

            //Act
            var param = new EditAddressParam
            {
                Scope       = GetRandom.String(32),
                CustomerId  = Guid.NewGuid(),
                CultureInfo = TestingExtensions.GetRandomCulture(),
                AddressId   = address.Id,
                ReturnUrl   = GetRandom.String(32),
                EditAddress = new EditAddressRequest()
            };

            var viewModel = await customerViewService.UpdateAddressAsync(param);

            //Assert
            viewModel.Should().NotBeNull();
            viewModel.Status.ShouldBeEquivalentTo(MyAccountStatus.Success.ToString());
        }
        public async Task WHEN_address_does_not_belong_to_the_customer_SHOULD_return_null()
        {
            //Arrange
            var address  = MockAddressFactory.CreateRandom();
            var customer = MockCustomerFactory.CreateRandom();

            customer.AddressIds = new List <Guid>
            {
                //no address
            };

            var mockedCustomerRepository = new Mock <ICustomerRepository>();

            mockedCustomerRepository.Setup(r => r.GetCustomerByIdAsync(It.IsAny <GetCustomerByIdParam>())).ReturnsAsync(customer);
            _container.Use(mockedCustomerRepository);

            var mockedCustomerAddressRepository = new Mock <ICustomerAddressRepository>();

            mockedCustomerAddressRepository.Setup(r => r.UpdateAddressAsync(It.IsAny <Guid>(), It.IsAny <Address>())).ReturnsAsync(address);
            _container.Use(mockedCustomerAddressRepository);

            var mockedAddressRepository = new Mock <IAddressRepository>();

            mockedAddressRepository.Setup(r => r.GetAddressByIdAsync(It.IsAny <Guid>())).ReturnsAsync(address);
            _container.Use(mockedAddressRepository);

            var customerViewService = _container.CreateInstance <CustomerAddressViewService>();

            //Act
            var param = new EditAddressParam
            {
                Scope       = GetRandom.String(32),
                CustomerId  = Guid.NewGuid(),
                CultureInfo = TestingExtensions.GetRandomCulture(),
                AddressId   = address.Id,
                ReturnUrl   = GetRandom.String(32),
                EditAddress = new EditAddressRequest()
            };

            var viewModel = await customerViewService.UpdateAddressAsync(param);

            //Assert
            viewModel.Should().BeNull();
        }
        public void WHEN_EditAddress_is_Null_SHOULD_throw_ArgumentException()
        {
            //Arrange
            var customerAddressViewService = _container.CreateInstance <CustomerAddressViewService>();
            var param = new EditAddressParam
            {
                Scope       = GetRandom.String(32),
                CustomerId  = Guid.NewGuid(),
                CultureInfo = TestingExtensions.GetRandomCulture(),
                AddressId   = Guid.NewGuid(),
                ReturnUrl   = GetRandom.String(32),
            };

            //Act
            var ex = Assert.ThrowsAsync <ArgumentException>(() => customerAddressViewService.UpdateAddressAsync(param));

            //Assert
            ex.Message.Should().ContainEquivalentOf("EditAddress");
        }
        public void WHEN_CultureInfo_is_Empty_SHOULD_throw_ArgumentException(CultureInfo cultureInfo)
        {
            //Arrange
            var customerAddressViewService = _container.CreateInstance <CustomerAddressViewService>();
            var param = new EditAddressParam
            {
                Scope       = GetRandom.String(32),
                CustomerId  = Guid.NewGuid(),
                CultureInfo = cultureInfo,
                AddressId   = Guid.NewGuid(),
                ReturnUrl   = GetRandom.String(32),
                EditAddress = new EditAddressRequest()
            };

            //Act
            var ex = Assert.ThrowsAsync <ArgumentException>(() => customerAddressViewService.UpdateAddressAsync(param));

            //Assert
            ex.Message.Should().ContainEquivalentOf("CultureInfo");
        }
        /// <summary>
        /// Update an Address for the given customer
        /// </summary>
        /// <param name="editAddressParam">Service call params <see cref="EditAddressParam"/></param>
        /// <returns>
        /// The created Address and a status representing a possible cause of errors.
        /// </returns>
        public virtual async Task <EditAddressViewModel> UpdateAddressAsync(EditAddressParam editAddressParam)
        {
            if (editAddressParam == null)
            {
                throw new ArgumentNullException(nameof(editAddressParam));
            }
            if (editAddressParam.EditAddress == null)
            {
                throw new ArgumentException(GetMessageOfNull(nameof(editAddressParam.EditAddress)), nameof(editAddressParam));
            }
            if (editAddressParam.AddressId == Guid.Empty)
            {
                throw new ArgumentException(GetMessageOfEmpty(nameof(editAddressParam.AddressId)), nameof(editAddressParam));
            }
            if (editAddressParam.CustomerId == Guid.Empty)
            {
                throw new ArgumentException(GetMessageOfEmpty(nameof(editAddressParam.CustomerId)), nameof(editAddressParam));
            }
            if (editAddressParam.CultureInfo == null)
            {
                throw new ArgumentException(GetMessageOfNull(nameof(editAddressParam.CultureInfo)), nameof(editAddressParam));
            }
            if (string.IsNullOrWhiteSpace(editAddressParam.Scope))
            {
                throw new ArgumentException(GetMessageOfNullWhiteSpace(nameof(editAddressParam.Scope)), nameof(editAddressParam));
            }

            var baseAddress = await AddressRepository.GetAddressByIdAsync(editAddressParam.AddressId).ConfigureAwait(false);

            if (baseAddress == null)
            {
                return(null);
            }

            if (!await EnsureAddressBelongsToCustomer(editAddressParam.CustomerId, editAddressParam.Scope, baseAddress.Id).ConfigureAwait(false))
            {
                return(null);
            }

            var updatedAddress = await CustomerAddressRepository
                                 .UpdateAddressAsync(editAddressParam.CustomerId,
                                                     ConvertToAddress(baseAddress, editAddressParam.EditAddress))
                                 .ConfigureAwait(false);

            if (editAddressParam.EditAddress.IsPreferredShipping || editAddressParam.EditAddress.IsPreferredBilling)
            {
                await SetDefaultAddressAsync(new SetDefaultAddressParam
                {
                    AddressId  = editAddressParam.AddressId,
                    CustomerId = editAddressParam.CustomerId,
                    Scope      = editAddressParam.Scope
                }).ConfigureAwait(false);
            }

            //Update recurring carts with this address Id
            await RecurringOrderCartsViewService.UpdateRecurringOrderCartsAddressesAsync(new Cart.Parameters.UpdateRecurringOrderCartsAddressesParam
            {
                BaseUrl     = "Empty", //Dont need but can't allow empty
                CultureInfo = editAddressParam.CultureInfo,
                CustomerId  = editAddressParam.CustomerId,
                ScopeId     = editAddressParam.Scope,
                AddressId   = updatedAddress.Id,
            }).ConfigureAwait(false);

            return(await GetEditAddressViewModel(new GetEditAddressViewModelParam
            {
                Address = updatedAddress,
                Status = MyAccountStatus.Success,
                ReturnUrl = editAddressParam.ReturnUrl,
                IsUpdating = false,
                CultureInfo = editAddressParam.CultureInfo
            }).ConfigureAwait(false));
        }