public async Task ValidCardPaymentReturnsSuccess()
        {
            var transactionServiceMock = new Mock <ITransactionService>();
            var bankServiceMock        = new Mock <IBankService>();
            var modelConverter         = new ModelConverter(new MaskingService());
            var loggerMock             = new Mock <ILogger <CardPaymentService> >();

            var cardPaymentService = new CardPaymentService(transactionServiceMock.Object, bankServiceMock.Object, modelConverter, loggerMock.Object);
            var cardPaymentRequest = ModelDataHelper.GetValidCardPaymentRequest();
            var merchant           = ModelDataHelper.GetTestMerchant();

            var cardPaymentContext = modelConverter.CreateCardPaymentContext(cardPaymentRequest, merchant);

            var transaction = new Transaction()
            {
                TransactionId     = Guid.NewGuid().ToString(),
                CardDetail        = cardPaymentContext.CardDetail,
                Amount            = cardPaymentContext.Amount,
                MerchantId        = merchant.Id,
                MerchantReference = cardPaymentContext.MerchantReference,
                RequestedOn       = DateTime.UtcNow
            };

            transactionServiceMock.Setup(x => x.InitialiseTransactionAsync(It.IsAny <CardPaymentContext>())).ReturnsAsync(transaction);

            var bankResponse = new BankResponse()
            {
                Id      = "BNK_111",
                Status  = BankResponseStatus.Success,
                Details = "Authorised"
            };

            bankServiceMock.Setup(x => x.ExecuteAsync(It.IsAny <BankCardRequest>())).ReturnsAsync(bankResponse);

            var updatedTransaction = transaction;

            updatedTransaction.BankDetails   = bankResponse.Details;
            updatedTransaction.BankReference = bankResponse.Id;
            updatedTransaction.Status        = TransactionStatus.Fulfilled;
            updatedTransaction.ProcessedOn   = DateTime.UtcNow;

            transactionServiceMock.Setup(x => x.UpdateTransactionAsync(transaction.TransactionId, bankResponse)).ReturnsAsync(updatedTransaction);

            var response = await cardPaymentService.ProcessAsync(cardPaymentRequest, merchant);

            response.Should().NotBeNull();
            response.Amount.Should().Be(cardPaymentRequest.Amount);
            response.Currency.Should().Be(cardPaymentRequest.CurrencyCode);
            response.Success.Should().BeTrue();
            response.Status.Should().Be("fulfilled");
            response.BankReference.Should().Be(bankResponse.Id);
        }
        public async Task ValidCardReturnsSuccess()
        {
            var bankService = new BankService();

            var request = ModelDataHelper.GetBankCardRequest(500);

            var response = await bankService.ExecuteAsync(request);

            response.Should().NotBeNull();
            response.Id.Should().NotBeNullOrEmpty();
            response.Status.Should().Be(BankResponseStatus.Success);
            response.Details.Should().NotBeNullOrEmpty();
        }
        public async Task InValidCardReturnsFailure(int amount, string bankResponse)
        {
            var bankService = new BankService();

            var request = ModelDataHelper.GetBankCardRequest(amount);

            var response = await bankService.ExecuteAsync(request);

            response.Should().NotBeNull();
            response.Id.Should().NotBeNullOrEmpty();
            response.Status.Should().Be(BankResponseStatus.Failed);
            response.Details.Should().NotBeNullOrEmpty();
            response.Details.Should().Be(bankResponse);
        }
        public void CardPaymentContextShouldContainNecessaryDetails()
        {
            var maskingServiceMock = new Mock <IMaskingService>();

            var modelConverter     = new ModelConverter(maskingServiceMock.Object);
            var cardPaymentRequest = ModelDataHelper.GetValidCardPaymentRequest();
            var merchant           = ModelDataHelper.GetTestMerchant();

            var cardContext = modelConverter.CreateCardPaymentContext(cardPaymentRequest, merchant);

            cardContext.Should().NotBeNull();
            cardContext.Amount.Should().Be(cardPaymentRequest.Amount);
            cardContext.CardDetail.Should().NotBeNull();
            cardContext.CardDetail.Name.Should().Be(cardPaymentRequest.Name);
            cardContext.CardDetail.CurrencyCode.Should().Be(cardPaymentRequest.CurrencyCode);
            cardContext.CardDetail.ExpiryMonth.Should().Be(cardPaymentRequest.ExpiryMonth);
            cardContext.CardDetail.ExpiryYear.Should().Be(cardPaymentRequest.ExpiryYear);
            cardContext.MerchantReference.Should().Be(cardPaymentRequest.Reference);
            cardContext.MerchantId.Should().Be(merchant.Id);
        }