public async Task RemoveDefaultEntity_RemovesDefaultEntity()
        {
            var target = new CheckoutDataRepository(SetupAddressService(), SetupPaymentMethodService(), null);
            await target.SetDefaultPaymentMethodAsync("1");

            var defaultShippingAddress = await target.GetDefaultShippingAddressAsync();

            var defaultBillingAddress = await target.GetDefaultBillingAddressAsync();

            var defaultPaymentMethod = await target.GetDefaultPaymentMethodAsync();

            Assert.IsNotNull(defaultShippingAddress);
            Assert.IsNotNull(defaultBillingAddress);
            Assert.IsNotNull(defaultPaymentMethod);

            await target.RemoveDefaultShippingAddressAsync();

            await target.RemoveDefaultBillingAddressAsync();

            await target.RemoveDefaultPaymentMethodAsync();

            defaultShippingAddress = await target.GetDefaultShippingAddressAsync();

            defaultBillingAddress = await target.GetDefaultBillingAddressAsync();

            defaultPaymentMethod = await target.GetDefaultPaymentMethodAsync();

            Assert.IsNull(defaultShippingAddress);
            Assert.IsNull(defaultBillingAddress);
            Assert.IsNull(defaultPaymentMethod);
        }
        public async Task CachedAddressesAndPaymentMethodsExpire_WhenUserChanged()
        {
            var accountService = new MockAccountService();
            var target         = new CheckoutDataRepository(SetupAddressService(), SetupPaymentMethodService(), accountService);

            var paymentMethods = await target.GetAllPaymentMethodsAsync();

            Assert.AreSame(await target.GetAllPaymentMethodsAsync(), paymentMethods, "Cached data should be same.");

            accountService.RaiseUserChanged(null, null);

            Assert.AreNotSame(await target.GetAllPaymentMethodsAsync(), paymentMethods);
        }
        public async Task GetAllPaymentMethodsAsync_ReturnsEmptyCollection_WhenServiceReturnsNull()
        {
            var paymentMethodService = new MockPaymentMethodService();

            paymentMethodService.PaymentMethods = null;

            var target = new CheckoutDataRepository(null, paymentMethodService, null);

            var paymentMethods = await target.GetAllPaymentMethodsAsync();

            Assert.IsNotNull(paymentMethods);
            Assert.AreEqual(0, paymentMethods.Count);
        }
        public async Task GetAllEntities_Returns_AllEntities()
        {
            var target = new CheckoutDataRepository(SetupAddressService(), SetupPaymentMethodService(), null);

            var shippingAddresses = await target.GetAllShippingAddressesAsync();

            var bilingAddresses = await target.GetAllBillingAddressesAsync();

            var paymentMethods = await target.GetAllPaymentMethodsAsync();

            Assert.AreEqual(3, shippingAddresses.Count());
            Assert.AreEqual(2, bilingAddresses.Count());
            Assert.AreEqual(1, paymentMethods.Count());
        }
        public async Task GetEntity_Returns_Entity()
        {
            var target = new CheckoutDataRepository(SetupAddressService(), SetupPaymentMethodService(), null);

            var shippingAddress = await target.GetShippingAddressAsync("3");

            var bilingAddress = await target.GetBillingAddressAsync("2");

            var paymentMethod = await target.GetPaymentMethodAsync("1");

            Assert.AreEqual(shippingAddress.FirstName, "Anne");
            Assert.AreEqual(bilingAddress.FirstName, "Jane");
            Assert.AreEqual(paymentMethod.CardholderName, "John Doe");
        }
        public async Task GetDefaultValues_Returns_DefaultValues()
        {
            var target = new CheckoutDataRepository(SetupAddressService(), SetupPaymentMethodService(), null);

            var defaultShippingAddress = await target.GetDefaultShippingAddressAsync();

            var defaultBilingAddress = await target.GetDefaultBillingAddressAsync();

            var defaultPaymentMethod = await target.GetDefaultPaymentMethodAsync();

            Assert.IsNotNull(defaultShippingAddress);
            Assert.AreEqual(defaultShippingAddress.Id, "3");
            Assert.IsNotNull(defaultBilingAddress);
            Assert.AreEqual(defaultBilingAddress.Id, "2");
            Assert.IsNull(defaultPaymentMethod);
        }
        public async Task SaveEntity_SavesEntity()
        {
            var target = new CheckoutDataRepository(SetupAddressService(), SetupPaymentMethodService(), null);

            await target.SaveShippingAddressAsync(new Address()
            {
                Id = "test", FirstName = "TestFirstName", LastName = "TestLastName", AddressType = AddressType.Shipping
            });

            await target.SaveBillingAddressAsync(new Address()
            {
                Id = "test", FirstName = "TestFirstName", LastName = "TestLastName", AddressType = AddressType.Billing
            });

            await target.SavePaymentMethodAsync(new PaymentMethod()
            {
                Id = "test", CardNumber = "12345", CardVerificationCode = "1234", ExpirationMonth = "10", ExpirationYear = "2010", CardholderName = "TestCardholderName"
            });

            var savedShippingAddress = await target.GetShippingAddressAsync("test");

            var savedBillingAddress = await target.GetBillingAddressAsync("test");

            var savedPaymentMethod = await target.GetPaymentMethodAsync("test");

            Assert.IsNotNull(savedShippingAddress);
            Assert.IsNotNull(savedBillingAddress);
            Assert.IsNotNull(savedPaymentMethod);

            var shippingAddress = await target.GetShippingAddressAsync(savedShippingAddress.Id);

            var billingAddress = await target.GetBillingAddressAsync(savedBillingAddress.Id);

            var paymentMethod = await target.GetPaymentMethodAsync(savedPaymentMethod.Id);

            Assert.AreEqual(savedShippingAddress.Id, shippingAddress.Id);
            Assert.AreEqual(savedBillingAddress.Id, billingAddress.Id);
            Assert.AreEqual(savedPaymentMethod.Id, paymentMethod.Id);
        }