public void ShouldValidateViewModelOnSubmit(string merchantId, string currency, string cardHolderName, string cardNumber, string securityCode, int monthExpired, int yearExpired, string expectedError)
        {
            // arrange
            var model = new OnlinePaymentViewModel
            {
                MerchantId     = new Guid(merchantId),
                Amount         = 1000,
                Currency       = currency,
                RedirectUrl    = "http://test.com",
                CardHolderName = cardHolderName,
                CardNumber     = cardNumber,
                SecurityCode   = securityCode,
                MonthExpired   = monthExpired,
                YearExpired    = yearExpired
            };
            var bankCard = new BankCard("123", "0000", "EVGENY SHMANEV", "12345", 1, 2020);

            _bankCardService.Setup(x => x.FindBankCard("12345")).Returns(bankCard);

            var merchant = new Merchant("merchant", "test@com", "pass", new Guid("E5310F8F-117B-4D60-8239-39A42A94ADC9"), "store", "contact");
            var account  = merchant.AddAccount("9876543210", "USD");

            _merchantService.Setup(x => x.FindMerchant(merchant.MerchantId)).Returns(merchant);

            // act
            var result = _controller.Payment(model).Result;

            // assert
            result.ShouldBeOfType <ViewResult>();
            _controller.ModelState.IsValid.ShouldBeFalse();
            _controller.ModelState.ShouldContain(x => x.Value.Errors.Any(error => error.ErrorMessage == expectedError));
        }
        public void ShouldRedirectToStoreAfterPayment(string merchantId, string currency, string cardHolderName, string cardNumber, string securityCode, int monthExpired, int yearExpired, string expectedError)
        {
            // arrange
            var model = new OnlinePaymentViewModel
            {
                MerchantId     = new Guid(merchantId),
                Amount         = 1000,
                Currency       = currency,
                RedirectUrl    = "http://test.com",
                CardHolderName = cardHolderName,
                CardNumber     = cardNumber,
                SecurityCode   = securityCode,
                MonthExpired   = monthExpired,
                YearExpired    = yearExpired
            };

            var customer        = new Individual("customer", "test@com", "pass", "Evgeny", "Shmanev");
            var customerAccount = customer.AddAccount("11111111", "EUR");

            customerAccount.BankCard = new BankCard("123", "0000", "EVGENY SHMANEV", "12345", 1, 2020);
            _bankCardService.Setup(x => x.FindBankCard("12345")).Returns(customerAccount.BankCard);

            var merchant        = new Merchant("merchant", "test@com", "pass", new Guid("E5310F8F-117B-4D60-8239-39A42A94ADC9"), "store", "contact");
            var merchantAccount = merchant.AddAccount("222222222", "USD");

            _merchantService.Setup(x => x.FindMerchant(merchant.MerchantId)).Returns(merchant);

            // act
            var result = _controller.Payment(model).Result;

            // assert
            _controller.ModelState.IsValid.ShouldBeTrue();
            _accountService.Verify(x => x.TransferMoney(customerAccount, merchantAccount, model.Amount, AmountConversionMode.TargetToSource, $"Online payment on {merchant.MerchantName}."));
            result.ShouldBeOfType <RedirectResult>()
            .Url.ShouldBe("http://test.com?status=success");
        }