/// <summary>
        /// Updates the name, email, password and phone number of the customer with the specified id.
        /// </summary>
        /// <param name="request">The request containing the information that should be updated for the customer.</param>
        /// <param name="customerId">The id of the customer the changes should be applied to.</param>
        /// <returns></returns>
        public async Task <EditCustomerResponse> EditCustomerAsync(EditCustomerRequest request, string customerId)
        {
            var customer = await _unitOfWork.CustomerRepository.FindByIDAsync(customerId);

            await _unitOfWork.IdentityUserRepository.TransactionWrapper(async() =>
            {
                customer.Name        = request.Name;
                customer.PhoneNumber = request.PhoneNumber;

                if (request.ChangePassword == true)
                {
                    var password    = request.Password;
                    var oldPassword = request.OldPassword;
                    await _unitOfWork.IdentityUserRepository.ChangePasswordAsync(customer, password, oldPassword);
                }

                if (customer.Email != request.Email)
                {
                    await _unitOfWork.IdentityUserRepository.ChangeEmailAsync(customer, request.Email);
                }

                _unitOfWork.CustomerRepository.Update(customer);
                await _unitOfWork.SaveChangesAsync();
            });

            var customerDto = _mapper.Map <CustomerDto>(customer);
            var response    = new EditCustomerResponse
            {
                Customer = customerDto
            };

            return(response);
        }
        public async Task EditCustomerAsync_EditingCustomerSucceeds__ReturnsAEditCustomerResponse()
        {
            //Arrange
            var request = new EditCustomerRequest
            {
                Email            = "*****@*****.**",
                Name             = "Axel",
                Password         = "******",
                RepeatedPassword = "******",
                PhoneNumber      = "66666666",
                OldPassword      = "******",
                ChangePassword   = true
            };

            var customer = new Customer
            {
                Id          = "SomeId",
                Email       = "*****@*****.**",
                PhoneNumber = "11111111",
                Name        = "Hans"
            };

            _unitOfWork.IdentityUserRepository.AddIdentityUserAsync(customer, request.OldPassword)
            .ReturnsForAnyArgs(IdentityResult.Success);

            _unitOfWork.IdentityUserRepository.SignInAsync(customer.Email, request.OldPassword)
            .ReturnsForAnyArgs(SignInResult.Success);

            var customerDto = new CustomerDto
            {
                Email       = request.Email,
                Name        = request.Name,
                PhoneNumber = request.PhoneNumber
            };

            var editCustomerResponse = new EditCustomerResponse
            {
                Customer = customerDto
            };

            _unitOfWork.CustomerRepository.FindByIDAsync(null).ReturnsForAnyArgs(customer);
            _mapper.Map <CustomerDto>(null).ReturnsForAnyArgs(customerDto);

            //Act
            var response = await _customerService.EditCustomerAsync(request, customer.Id);

            //Assert
            Assert.That(response.Customer, Is.EqualTo(editCustomerResponse.Customer));
        }