public async Task ItWillHandleExceptionOnCapture() { using (AutoMock mock = AutoMock.GetLoose()) { var mockDbTransaction = new MockDbTransaction(); var paymentMethod = PaymentMethod.CreditCard; var paymentTransaction = GetPaymentTransaction(); var paymentProfile = GetPaymentProfile(); mock.Mock <IPaymentTransactionRepository>().Setup(x => x.GetOpenDbTransaction()) .Returns(mockDbTransaction); mock.Mock <IExternalPaymentService>() .Setup(x => x.IsAutomatedProcessingEnabled(It.IsAny <PaymentMethod>())) .Returns(true); mock.Mock <IExternalPaymentService>().Setup(x => x.CaptureTransaction(It.IsAny <PaymentMethod>(), It.IsAny <PaymentTransaction>(), It.IsAny <PaymentProfile>())) .ThrowsAsync(new Exception()); mock.Mock <IPaymentTransactionRepository>().Setup(x => x.UpdatePaymentTransaction( It.IsAny <PaymentTransaction>(), It.IsAny <IDbTransaction>())) .ReturnsAsync((PaymentTransaction pt, IDbTransaction dbt) => pt); var paymentTransactionService = mock.Create <PaymentTransactionService>(); var result = await paymentTransactionService.CaptureTransaction(paymentMethod, paymentTransaction, paymentProfile); Assert.NotNull(result); Assert.False(result.IsApproved); Assert.Equal(_dateComparison, result.DateCaptureAttempted.Value.ToShortDateString()); Assert.Null(result.DateCapturedFunds); mock.Mock <IPaymentTransactionRepository>().Verify(x => x.GetOpenDbTransaction(), Times.Once); mock.Mock <IExternalPaymentService>().Verify(x => x.IsAutomatedProcessingEnabled( It.Is <PaymentMethod>(p => p == paymentMethod)), Times.Once); mock.Mock <IExternalPaymentService>().Verify(x => x.CaptureTransaction( It.Is <PaymentMethod>(p => p == paymentMethod), It.Is <PaymentTransaction>(pt => pt.PaymentTransactionId == paymentTransaction.PaymentTransactionId), It.Is <PaymentProfile>(pp => pp.AccountId == paymentProfile.AccountId)), Times.Once); mock.Mock <IPaymentTransactionRepository>().Verify(x => x.UpdatePaymentTransaction( It.Is <PaymentTransaction>(pt => pt.PaymentTransactionId == paymentTransaction.PaymentTransactionId && pt.DateCaptureAttempted.Value.ToShortDateString() == _dateComparison && !pt.IsApproved && paymentTransaction.DateCapturedFunds == null), It.Is <IDbTransaction>(t => t != null)), Times.Once); mock.Mock <IExternalPaymentService>().Verify(x => x.SendManualProcessingEmail(It.IsAny <PaymentMethod>(), It.IsAny <PaymentTransaction>(), It.IsAny <PaymentProfile>()), Times.Never); mock.Mock <IExternalPaymentService>().Verify(x => x.RefundTransaction(It.IsAny <PaymentMethod>(), It.IsAny <PaymentTransaction>(), It.IsAny <PaymentProfile>()), Times.Never); mockDbTransaction.VerifyCommit(); } }
public async Task SupportsExpectedTransactionVerification() { var connectionFactory = new Mock <IDbConnectionFactory>(); var connection = new MockDbConnection(); var repository = new SampleRepository(connectionFactory.Object); var transaction = new MockDbTransaction(); connectionFactory .Setup(f => f.OpenConnection()) .Returns(connection); connection.Setup(c => c.BeginTransaction(It.IsAny <IsolationLevel>())).Returns(transaction); await repository.DeleteCarAsync("Vauxhall"); connection.Verify(c => c.ExecuteAsync(It.IsAny <string>(), It.IsAny <object>(), transaction, null, null)); }
public async Task ItWillProcessCaptureAndOptionallyInsertPaymentTransaction(int initialPaymentTransactionId) { using (AutoMock mock = AutoMock.GetLoose()) { var mockDbTransaction = new MockDbTransaction(); var paymentMethod = PaymentMethod.CreditCard; var paymentTransaction = GetPaymentTransaction(); paymentTransaction.PaymentTransactionId = initialPaymentTransactionId; var paymentProfile = GetPaymentProfile(); mock.Mock <IPaymentTransactionRepository>().Setup(x => x.GetOpenDbTransaction()) .Returns(mockDbTransaction); mock.Mock <IExternalPaymentService>() .Setup(x => x.IsAutomatedProcessingEnabled(It.IsAny <PaymentMethod>())) .Returns(true); mock.Mock <IExternalPaymentService>().Setup(x => x.CaptureTransaction(It.IsAny <PaymentMethod>(), It.IsAny <PaymentTransaction>(), It.IsAny <PaymentProfile>())) .ReturnsAsync((PaymentMethod pm, PaymentTransaction pt, PaymentProfile pp) => { pt.IsApproved = true; return(pt); }); mock.Mock <IPaymentTransactionRepository>().Setup(x => x.UpdatePaymentTransaction( It.IsAny <PaymentTransaction>(), It.IsAny <IDbTransaction>())) .ReturnsAsync((PaymentTransaction pt, IDbTransaction dbt) => pt); mock.Mock <IPaymentTransactionRepository>().Setup(x => x.InsertPaymentTransaction( It.IsAny <PaymentTransaction>(), It.IsAny <IDbTransaction>())) .ReturnsAsync((PaymentTransaction pt, IDbTransaction dbt) => { pt.PaymentTransactionId++; return(pt); }); var paymentTransactionService = mock.Create <PaymentTransactionService>(); var result = await paymentTransactionService.CaptureTransaction(paymentMethod, paymentTransaction, paymentProfile); Assert.NotNull(result); Assert.True(result.PaymentTransactionId > 0); Assert.True(result.IsApproved); Assert.Equal(_dateComparison, result.DateCaptureAttempted.Value.ToShortDateString()); Assert.Equal(_dateComparison, result.DateCapturedFunds.Value.ToShortDateString()); mock.Mock <IPaymentTransactionRepository>().Verify(x => x.GetOpenDbTransaction(), Times.Once); mock.Mock <IExternalPaymentService>().Verify(x => x.IsAutomatedProcessingEnabled( It.Is <PaymentMethod>(p => p == paymentMethod)), Times.Once); mock.Mock <IExternalPaymentService>().Verify(x => x.CaptureTransaction( It.Is <PaymentMethod>(p => p == paymentMethod), It.Is <PaymentTransaction>(pt => pt.PaymentTransactionId == paymentTransaction.PaymentTransactionId), It.Is <PaymentProfile>(pp => pp.AccountId == paymentProfile.AccountId)), Times.Once); if (initialPaymentTransactionId == 0) { mock.Mock <IPaymentTransactionRepository>().Verify(x => x.InsertPaymentTransaction( It.Is <PaymentTransaction>(pt => pt.TransactionReference == paymentTransaction.TransactionReference), It.Is <IDbTransaction>(t => t != null)), Times.Once); } else { mock.Mock <IPaymentTransactionRepository>().Verify(x => x.InsertPaymentTransaction( It.IsAny <PaymentTransaction>(), It.IsAny <IDbTransaction>()), Times.Never); } mock.Mock <IPaymentTransactionRepository>().Verify(x => x.UpdatePaymentTransaction( It.Is <PaymentTransaction>(pt => pt.PaymentTransactionId > 0 && pt.DateCaptureAttempted.Value.ToShortDateString() == _dateComparison && pt.IsApproved && paymentTransaction.DateCapturedFunds.Value.ToShortDateString() == _dateComparison), It.Is <IDbTransaction>(t => t != null)), Times.Once); mock.Mock <IExternalPaymentService>().Verify(x => x.SendManualProcessingEmail(It.IsAny <PaymentMethod>(), It.IsAny <PaymentTransaction>(), It.IsAny <PaymentProfile>()), Times.Never); mock.Mock <IExternalPaymentService>().Verify(x => x.RefundTransaction(It.IsAny <PaymentMethod>(), It.IsAny <PaymentTransaction>(), It.IsAny <PaymentProfile>()), Times.Never); mockDbTransaction.VerifyCommit(); } }