Пример #1
0
        public async Task Handler_GivenValidRequest_ShouldStorePaymentDetails()
        {
            // Arrange
            var paymentId      = Guid.NewGuid();
            var bankClientMock = new Mock <IBankClient>();

            bankClientMock.Setup(x => x.ProcessPayment(It.IsAny <int>(), It.IsAny <string>(),
                                                       It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(),
                                                       It.IsAny <decimal>(), It.IsAny <string>()))
            .Returns(new PaymentResult
            {
                Status    = "Success",
                PaymentId = paymentId
            });

            var bankClientFactoryMock = new Mock <IBankClientFactory>();

            bankClientFactoryMock.Setup(x => x.Create(It.IsAny <string>()))
            .Returns(bankClientMock.Object);

            var sut = new CreatePaymentCommand.Handler(DbContext, bankClientFactoryMock.Object);

            // Act
            await sut.Handle(Command, CancellationToken.None);

            // Assert
            var entity = await DbContext.Payments.SingleOrDefaultAsync(x => x.Id == paymentId);

            entity.ShouldNotBeNull();
        }
Пример #2
0
        public async Task Handler_GivenValidRequest_ShouldUseBankClientToProcessPayment()
        {
            // Arrange
            var bankClientMock = new Mock <IBankClient>();

            bankClientMock.Setup(x => x.ProcessPayment(It.IsAny <int>(), It.IsAny <string>(),
                                                       It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(),
                                                       It.IsAny <decimal>(), It.IsAny <string>()))
            .Returns(new PaymentResult
            {
                Status    = "Success",
                PaymentId = Guid.NewGuid()
            });

            var bankClientFactoryMock = new Mock <IBankClientFactory>();

            bankClientFactoryMock.Setup(x => x.Create(It.IsAny <string>()))
            .Returns(bankClientMock.Object);

            var sut = new CreatePaymentCommand.Handler(DbContext, bankClientFactoryMock.Object);

            // Act
            await sut.Handle(Command, CancellationToken.None);

            // Assert
            bankClientMock.Verify(x => x.ProcessPayment(It.IsAny <int>(), It.IsAny <string>(),
                                                        It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(),
                                                        It.IsAny <decimal>(), It.IsAny <string>()),
                                  Times.Once);
        }
Пример #3
0
        public async Task CreatePayment_GivenInvalidInput_ShouldThrowAValidationException()
        {
            var command = new CreatePaymentCommand();
            var sut     = new CreatePaymentCommand.Handler(Context);

            await sut.Invoking(async h => await h.Handle(command, CancellationToken.None))
            .Should().ThrowAsync <ValidationException>();
        }
Пример #4
0
        public async Task Handler_WhenBankReturnsError_ShouldRaisePaymentNotAcceptedException()
        {
            // Arrange
            var bankClientMock = new Mock <IBankClient>();

            bankClientMock.Setup(x => x.ProcessPayment(It.IsAny <int>(), It.IsAny <string>(),
                                                       It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(),
                                                       It.IsAny <decimal>(), It.IsAny <string>()))
            .Returns(new PaymentResult
            {
                Status = "Card number invalid"
            });

            var bankClientFactoryMock = new Mock <IBankClientFactory>();

            bankClientFactoryMock.Setup(x => x.Create(It.IsAny <string>()))
            .Returns(bankClientMock.Object);

            var sut = new CreatePaymentCommand.Handler(DbContext, bankClientFactoryMock.Object);

            // Act & Assert
            await Should.ThrowAsync <PaymentNotAcceptedException>(() =>
                                                                  sut.Handle(Command, CancellationToken.None));
        }
Пример #5
0
        public async Task CreatePayment_GivenValidInput_ShouldSaveAPayment()
        {
            var command = new CreatePaymentCommand
            {
                MerchantId     = 1,
                CardHolderName = "Jake Ryu",
                CardNumber     = "1111-2222-3333-4444",
                CardExpiryDate = "05/24",
                Cvv            = "978",
                Amount         = 150
            };

            var sut = new CreatePaymentCommand.Handler(Context);
            await sut.Handle(command, CancellationToken.None);

            var payment = await Context.Payments.FirstAsync();

            payment.MerchantId.Should().Be(1);
            payment.CardHolderName.Should().Be("Jake Ryu");
            payment.CardNumber.OriginalValue.Should().Be("1111-2222-3333-4444");
            payment.CardExpiryDate.Value.Should().Be(new DateTime(2024, 5, 31));
            payment.Cvv.Should().Be("978");
            payment.Amount.Should().Be(150);
        }