public async Task ProcessFormAsync_SavesPaymentMethodIfNoMatchingFound()
        {
            var savePaymentMethodCalled = false;
            var newPaymentMethod        = new PaymentMethod
            {
                CardNumber     = "1234",
                CardholderName = "testcardholdername"
            };

            var existingPaymentMethods = new List <PaymentMethod>();
            var checkoutDataRepository = new MockCheckoutDataRepository();

            checkoutDataRepository.GetAllPaymentMethodsAsyncDelegate =
                () => Task.FromResult <IReadOnlyCollection <PaymentMethod> >(new ReadOnlyCollection <PaymentMethod>(existingPaymentMethods));

            checkoutDataRepository.SavePaymentMethodAsyncDelegate = paymentMethod =>
            {
                savePaymentMethodCalled = true;
                Assert.AreEqual("testcardholdername",
                                paymentMethod.CardholderName);
                return(Task.Delay(0));
            };
            var target = new PaymentMethodUserControlViewModel(checkoutDataRepository);

            target.PaymentMethod = newPaymentMethod;

            await target.ProcessFormAsync();

            Assert.IsTrue(savePaymentMethodCalled);
        }
        public async Task ProcessFormAsync_UsesExistingIfMatchingFound()
        {
            var newPaymentMethod = new PaymentMethod
            {
                CardNumber     = "1234",
                CardholderName = "testcardholdername"
            };

            var existingPaymentMethods = new List <PaymentMethod>
            {
                new PaymentMethod
                {
                    Id             = "testId",
                    CardNumber     = "1234",
                    CardholderName = "testcardholdername"
                }
            };

            var checkoutDataRepository = new MockCheckoutDataRepository();

            checkoutDataRepository.GetAllPaymentMethodsAsyncDelegate =
                () => Task.FromResult <IReadOnlyCollection <PaymentMethod> >(new ReadOnlyCollection <PaymentMethod>(existingPaymentMethods));

            var target = new PaymentMethodUserControlViewModel(checkoutDataRepository);

            target.PaymentMethod = newPaymentMethod;

            await target.ProcessFormAsync();

            Assert.AreEqual("testId", target.PaymentMethod.Id);
        }