Ejemplo n.º 1
0
        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"));
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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"));
        }