public async Task Processing_outstanding_orders_logs_a_warning_when_payment_fails() { // Arrange var ordersRepositoryMock = new Mock <IOrdersRepository>(); ordersRepositoryMock.Setup(c => c.GetOutstandingOrders()) .ReturnsAsync(GenerateOutstandingOrders(2)); var paymentServiceMock = new Mock <IPaymentService>(); paymentServiceMock .SetupSequence(c => c.CompletePayment(It.IsAny <Order>())) .ReturnsAsync(new PaymentTransaction { TransactionId = "TRX-1", CreateOn = DateTime.Now.AddMinutes(-new Random().Next(100)), }) .Throws(new Exception("Payment exception")); var loggerMock = new Mock <ILogger <PaymentsProcessor> >(); var sut = new PaymentsProcessor(ordersRepositoryMock.Object, paymentServiceMock.Object, loggerMock.Object); // Act await sut.ProcessOutstandingOrders(); // Assert loggerMock.VerifyLog(c => c.LogWarning(It.Is <Exception>(paymentException => paymentException.Message.Contains("Payment exception")), "*exception*Reference 2")); }
public async Task Processing_outstanding_orders_logs_order_and_transaction_data_for_each_completed_payment() { // Arrange var ordersRepositoryMock = new Mock <IOrdersRepository>(); ordersRepositoryMock.Setup(c => c.GetOutstandingOrders()) .ReturnsAsync(GenerateOutstandingOrders(100)); var paymentServiceMock = new Mock <IPaymentService>(); paymentServiceMock .Setup(c => c.CompletePayment(It.IsAny <Order>())) .ReturnsAsync((Order order) => new PaymentTransaction { TransactionId = $"TRX-{order.OrderReference}" }); var loggerMock = new Mock <ILogger <PaymentsProcessor> >(); var sut = new PaymentsProcessor(ordersRepositoryMock.Object, paymentServiceMock.Object, loggerMock.Object); // Act await sut.ProcessOutstandingOrders(); // Assert loggerMock.VerifyLog(logger => logger.LogInformation("Order with {orderReference} was paid {at} by {customerEmail}, having {transactionId}", It.Is <string>(orderReference => orderReference.StartsWith("Reference")), It.IsAny <DateTime>(), It.Is <string>(customerEmail => customerEmail.Contains("@")), It.Is <string>(transactionId => transactionId.StartsWith("TRX"))), Times.Exactly(100)); }
public async Task Processing_outstanding_orders_logs_batch_size() { // Arrange var ordersRepositoryMock = new Mock <IOrdersRepository>(); ordersRepositoryMock.Setup(c => c.GetOutstandingOrders()) .ReturnsAsync(GenerateOutstandingOrders(100)); var paymentServiceMock = new Mock <IPaymentService>(); paymentServiceMock .Setup(c => c.CompletePayment(It.IsAny <Order>())) .ReturnsAsync((Order order) => new PaymentTransaction { TransactionId = $"TRX-{order.OrderReference}" }); var loggerMock = new Mock <ILogger <PaymentsProcessor> >(); var sut = new PaymentsProcessor(ordersRepositoryMock.Object, paymentServiceMock.Object, loggerMock.Object); // Act await sut.ProcessOutstandingOrders(); // Assert loggerMock.VerifyLog(c => c.LogInformation("A batch of 100 outstanding orders was completed")); }