Beispiel #1
0
        public void Can_Submit_Application_For_Product_BusinessLoans()
        {
            // Arrange

            var businessLoans = new BusinessLoans
            {
                Id = 1,
                InterestRatePerAnnum = 0.05M,
                LoanAmount           = 100,
            };

            var sellerApplication = new SellerApplication
            {
                Product     = businessLoans,
                CompanyData = GetCompanyData(),
            };

            var mockBusinessLoansService = new Mock <IBusinessLoansService>();

            mockBusinessLoansService.Setup(bls => bls.SubmitApplicationFor(It.IsAny <CompanyDataRequest>(), It.IsAny <LoansRequest>())).Returns(GetSuccessfulApplicationResult());

            var sut = new ProductApplicationService(
                new Mock <ISelectInvoiceService>().Object,
                new Mock <IConfidentialInvoiceService>().Object,
                mockBusinessLoansService.Object
                );

            // Act
            var applicationResult = sut.SubmitApplicationFor(sellerApplication);

            // Assert
            Assert.Equal(1, applicationResult);
            mockBusinessLoansService.VerifyAll();
        }
        public void CreateBuisnessLoanApplication__Handle__AssertIsRedirectedToBusinessLoansService()
        {
            var invoiceDiscount = new BusinessLoans()
            {
                Id = 1, LoanAmount = 2, InterestRatePerAnnum = 3
            };
            var application = new SellerApplication(invoiceDiscount, GetCompanyData());

            var buisnessLoanService = new Mock <IBusinessLoansService>();

            buisnessLoanService.Setup(svc => svc.SubmitApplicationFor(
                                          It.Is <CompanyDataRequest>(r =>
                                                                     r.CompanyFounded.Equals(GetCompanyData().Founded) &&
                                                                     r.CompanyName.Equals(GetCompanyData().Name) &&
                                                                     r.CompanyNumber.Equals(GetCompanyData().Number) &&
                                                                     r.DirectorName.Equals(GetCompanyData().DirectorName)
                                                                     ),
                                          It.Is <LoansRequest>(r => r.LoanAmount == 2 && r.InterestRatePerAnnum == 3))).Returns(GetValidApplicationResult());

            var applicationService = applicationServiceFactory.CreateProductApplicationService(
                buisnessLoanService.Object,
                new Mock <IConfidentialInvoiceService>().Object,
                new Mock <ISelectInvoiceService>().Object
                );
            var applicationResult = applicationService.SubmitApplicationFor(application);

            buisnessLoanService.VerifyAll();
            Assert.Equal(1, applicationResult);
        }
Beispiel #3
0
        public void Can_Submit_Application_For_SelectiveInvoiceDiscount()
        {
            // Arrange

            var selectInvoiceDiscount = new SelectiveInvoiceDiscount
            {
                Id                = 1,
                InvoiceAmount     = 200,
                AdvancePercentage = 80,
            };

            var sellerApplication = new SellerApplication {
                Product     = selectInvoiceDiscount,
                CompanyData = GetCompanyData(),
            };

            var mockSelectInvoiceService = new Mock <ISelectInvoiceService>();

            mockSelectInvoiceService.Setup(sis => sis.SubmitApplicationFor(It.IsAny <string>(), 200, 80)).Returns(1);

            var sut = new ProductApplicationService(
                mockSelectInvoiceService.Object,
                new Mock <IConfidentialInvoiceService>().Object,
                new Mock <IBusinessLoansService>().Object
                );

            // Act

            var applicationResult = sut.SubmitApplicationFor(sellerApplication);

            // Assert
            Assert.Equal(1, applicationResult);
            mockSelectInvoiceService.VerifyAll();
        }
Beispiel #4
0
        public void Can_Not_Submit_Application_For_Unsupported_Product()
        {
            // Arrange

            var unsupportedProduct = new UnsupportedProduct
            {
                Id         = 1,
                LoanAmount = 200,
            };

            var sellerApplication = new SellerApplication
            {
                Product     = unsupportedProduct,
                CompanyData = GetCompanyData(),
            };

            var sut = new ProductApplicationService(
                new Mock <ISelectInvoiceService>().Object,
                new Mock <IConfidentialInvoiceService>().Object,
                new Mock <IBusinessLoansService>().Object
                );

            // Act and Assert
            Assert.Throws <InvalidOperationException>(() => sut.SubmitApplicationFor(sellerApplication));
        }
 public SellerApplicationBuilder()
 {
     _sellerApplication = new SellerApplication
     {
         CompanyData = new SellerCompanyData()
     };
 }
Beispiel #6
0
        public void Can_Submit_Application_For_Product_ConfidentialInvoiceDiscount()
        {
            // Arrange

            var confidentialInvoiceDiscount = new ConfidentialInvoiceDiscount
            {
                Id = 1,
                TotalLedgerNetworth = 200,
                AdvancePercentage   = 80,
                VatRate             = 0.20M
            };

            var sellerApplication = new SellerApplication
            {
                Product     = confidentialInvoiceDiscount,
                CompanyData = GetCompanyData(),
            };

            var mockConfidentialInvoiceService = new Mock <IConfidentialInvoiceService>();

            mockConfidentialInvoiceService.Setup(cis => cis.SubmitApplicationFor(It.IsAny <CompanyDataRequest>(), 200, 80, 0.20M)).Returns(GetSuccessfulApplicationResult());

            var sut = new ProductApplicationService(
                new Mock <ISelectInvoiceService>().Object,
                mockConfidentialInvoiceService.Object,
                new Mock <IBusinessLoansService>().Object
                );

            // Act
            var applicationResult = sut.SubmitApplicationFor(sellerApplication);

            // Assert
            Assert.Equal(1, applicationResult);
            mockConfidentialInvoiceService.VerifyAll();
        }
        public void Submit_ShouldCallService_And_ReturnCorrectResult()
        {
            // Arrange
            var product = new ConfidentialInvoiceDiscount
            {
                TotalLedgerNetworth = 10m,
                AdvancePercentage   = 5.99m,
            };
            var application = new SellerApplication
            {
                Product     = product,
                CompanyData = new SellerCompanyData(),
            };
            var serviceResult = Mock.Of <IApplicationResult>(m => m.Success == true && m.ApplicationId == 2);

            var client = new ConfidentialInvoiceServiceClient(_confidentialInvoiceServiceMock.Object, _companyDataMapperMock.Object);

            _confidentialInvoiceServiceMock.Setup(m => m.SubmitApplicationFor(It.IsAny <CompanyDataRequest>(),
                                                                              product.TotalLedgerNetworth, product.AdvancePercentage, product.VatRate)).Returns(serviceResult);

            // Act
            var result = client.SubmitApplication(application);

            // Assert
            Assert.Equal(serviceResult.ApplicationId, result);
        }
        public void SubmitApplicationFor_BusinessLoans_CallsBusinessLoansService()
        {
            // **Arrange**
            BusinessLoan      product     = _fixture.Build <BusinessLoan>().Create();
            SellerCompanyData companyData = _fixture.Build <SellerCompanyData>().Create();
            SellerApplication <BusinessLoan> application = _fixture.Build <SellerApplication <BusinessLoan> >()
                                                           .With(a => a.Product, product)
                                                           .With(a => a.CompanyData, companyData)
                                                           .Create();

            loans.SubmitApplicationFor(
                Arg.Is <CompanyDataRequest>(x => x.DirectorName == companyData.DirectorName &&
                                            x.CompanyNumber == companyData.Number &&
                                            x.CompanyName == companyData.Name &&
                                            x.CompanyFounded == companyData.Founded),
                Arg.Is <LoansRequest>(y => y.InterestRatePerAnnum == product.InterestRatePerAnnum &&
                                      y.LoanAmount == product.LoanAmount))
            .Returns(new TestApplicationResult(10, true, new List <string>()));

            // **Act**
            int result = _service.SubmitApplicationFor(application);

            // **Assert**
            loans.Received(1).SubmitApplicationFor(Arg.Is <CompanyDataRequest>(x => x.DirectorName == companyData.DirectorName &&
                                                                               x.CompanyNumber == companyData.Number &&
                                                                               x.CompanyName == companyData.Name &&
                                                                               x.CompanyFounded == companyData.Founded),
                                                   Arg.Is <LoansRequest>(y => y.InterestRatePerAnnum == product.InterestRatePerAnnum &&
                                                                         y.LoanAmount == product.LoanAmount));
            Assert.Equal(10, result);
        }
        public void SubmitApplicationFor_ConfidentialInvoiceDiscount_CallsConfidentialInvoiceService()
        {
            // **Arrange**
            ConfidentialInvoiceDiscount cidProduct  = _fixture.Build <ConfidentialInvoiceDiscount>().Create();
            SellerCompanyData           companyData = _fixture.Build <SellerCompanyData>().Create();
            SellerApplication <ConfidentialInvoiceDiscount> application = _fixture.Build <SellerApplication <ConfidentialInvoiceDiscount> >()
                                                                          .With(a => a.Product, cidProduct)
                                                                          .With(a => a.CompanyData, companyData)
                                                                          .Create();

            cid.SubmitApplicationFor(
                Arg.Is <CompanyDataRequest>(x => x.DirectorName == companyData.DirectorName &&
                                            x.CompanyNumber == companyData.Number &&
                                            x.CompanyName == companyData.Name &&
                                            x.CompanyFounded == companyData.Founded),
                cidProduct.TotalLedgerNetworth,
                cidProduct.AdvancePercentage,
                cidProduct.VatRate)
            .Returns(new TestApplicationResult(10, true, new List <string>()));

            // **Act**
            int result = _service.SubmitApplicationFor(application);

            // **Assert**
            cid.Received(1).SubmitApplicationFor(Arg.Is <CompanyDataRequest>(x => x.DirectorName == companyData.DirectorName &&
                                                                             x.CompanyNumber == companyData.Number &&
                                                                             x.CompanyName == companyData.Name &&
                                                                             x.CompanyFounded == companyData.Founded), cidProduct.TotalLedgerNetworth, cidProduct.AdvancePercentage, cidProduct.VatRate);
            Assert.Equal(10, result);
        }
        public ISellerApplication Build()
        {
            var application = new SellerApplication
            {
                CompanyData = this.sellerCompanyData,
                Product     = this.product,
            };

            return(application);
        }
        private SellerApplication CreateSellerApplicationWithConfidentialInvoiceDiscount()
        {
            var sellerApplication = new SellerApplication
            {
                Product     = _fixture.Build <ConfidentialInvoiceDiscount>().Create(),
                CompanyData = CreateCompanyData()
            };

            return(sellerApplication);
        }
 public int SubmitApplicationFor(SellerApplication application)
 {
     foreach (var applicationHandler in handlers)
     {
         if (applicationHandler.CanHandle(application))
         {
             return(applicationHandler.Handle(application));
         }
     }
     throw new ApplicationException($"Application is not supported:{application}");
 }
        public void SubmitApplicationFor_ShouldThrowArgumentException_WhenGetProductTypeIsUnknown()
        {
            var sellerApplication = new SellerApplication
            {
                Product     = A.Fake <IProduct>(),
                CompanyData = null
            };

            Assert.Throws(typeof(ArgumentException),
                          () => _productApplicationService.SubmitApplicationFor(sellerApplication));
        }
        public void SubmitApplicationFor_ShouldThrowArgumentException_WhenGetNullOfProduct()
        {
            var sellerApplication = new SellerApplication
            {
                Product     = _fixture.Build <BusinessLoans>().Create(),
                CompanyData = null
            };

            Assert.Throws(typeof(ArgumentException),
                          () => _productApplicationService.SubmitApplicationFor(sellerApplication));
        }
        public void Should_Throw_Error_as_no_product()
        {
            ISellerApplication sellerApplication = new SellerApplication()
            {
                CompanyData = companyData
            };

            var productApplciationservice = new ProductApplicationService(_selectInvoiceService.Object, _confidentialInvoiceService.Object, _businessLoanService.Object);

            Assert.Throws <InvalidOperationException>(() => productApplciationservice.SubmitApplicationFor(sellerApplication));
        }
        public void WhenProductIsConfidentialInvoiceDiscountCanHandleSubmitApplication()
        {
            //Arrange

            IProduct product = new ConfidentialInvoiceDiscount {
                Id = 2, AdvancePercentage = 3, TotalLedgerNetworth = 500, VatRate = 0.3M
            };

            ISellerCompanyData companyData1 = new SellerCompanyData {
                DirectorName = "Me", Founded = DateTime.Now, Name = "My Company", Number = 12
            };
            ISellerCompanyData companyData2 = new SellerCompanyData {
                DirectorName = "Us", Founded = DateTime.Now, Name = "Our Company", Number = 10
            };

            ISellerApplication sellerApp1 = new SellerApplication {
                Product = product, CompanyData = companyData1
            };
            ISellerApplication sellerApp2 = new SellerApplication {
                Product = product, CompanyData = companyData2
            };

            //-------------------------------------------------------------------------------------------------------

            Mock <ISelectInvoiceService>       mockSelectInvoiceService       = new Mock <ISelectInvoiceService>(MockBehavior.Strict);
            Mock <IConfidentialInvoiceService> mockConfidentialInvoiceService = new Mock <IConfidentialInvoiceService>(MockBehavior.Strict);
            Mock <IBusinessLoansService>       mockBusinessLoansService       = new Mock <IBusinessLoansService>(MockBehavior.Strict);

            Mock <IApplicationResult> appResultSuccess = new Mock <IApplicationResult>();
            Mock <IApplicationResult> appResultFail    = new Mock <IApplicationResult>();

            appResultSuccess.SetupGet(x => x.ApplicationId).Returns(3);
            appResultSuccess.Setup(x => x.Success).Returns(true);

            appResultFail.Setup(x => x.Success).Returns(false);

            mockConfidentialInvoiceService.Setup(m => m.SubmitApplicationFor(It.Is <CompanyDataRequest>(r => r.CompanyName == "My Company"), It.IsAny <decimal>(), It.IsAny <decimal>(), It.IsAny <decimal>())).Returns(appResultSuccess.Object);
            mockConfidentialInvoiceService.Setup(m => m.SubmitApplicationFor(It.Is <CompanyDataRequest>(r => r.CompanyName != "My Company"), It.IsAny <decimal>(), It.IsAny <decimal>(), It.IsAny <decimal>())).Returns(appResultFail.Object);

            //-------------------------------------------------------------------------------------------------------

            IProductApplicationService applicationService = new ProductApplicationService(mockSelectInvoiceService.Object, mockConfidentialInvoiceService.Object, mockBusinessLoansService.Object);

            //Act
            int result1 = applicationService.SubmitApplicationFor(sellerApp1);
            int result2 = applicationService.SubmitApplicationFor(sellerApp2);

            //Assert
            mockConfidentialInvoiceService.Verify();

            Assert.Equal(3, result1);
            Assert.Equal(-1, result2);
        }
        public void Submit_WhenCalledWithUnsupportedProduct_ShouldThrowException()
        {
            // Arrange
            var application = new SellerApplication
            {
                Product = new SelectiveInvoiceDiscount(),
            };
            var client = new BusinessLoansServiceClient(_businessLoansServiceMock.Object, _companyDataMapperMock.Object);

            // Assert
            Assert.Throws <ArgumentException>(() => client.SubmitApplication(application));
        }
        public void Submit_WhenCalledWithMissingCompanyData_ShouldThrowException()
        {
            // Arrange
            var application = new SellerApplication
            {
                Product = new SelectiveInvoiceDiscount(),
            };
            var client = new SelectInvoiceServiceClient(_selectInvoiceServiceMock.Object);

            // Assert
            Assert.Throws <ArgumentException>(() => client.SubmitApplication(application));
        }
        public void GetHandler_HandlerExists_ReturnsMatchingObject()
        {
            var factory           = CreateApplicationHandlerFactory();
            var sellerApplication = new SellerApplication()
            {
                Product = new BusinessLoans()
            };

            var handler = factory.GetHandler(sellerApplication);

            handler.Should().BeOfType(_loansApplicationHandlerMock.Object.GetType());
        }
Beispiel #20
0
        public int Dispatch(SellerApplication application)
        {
            try
            {
                return(_submitters.Single(s => s.CanSubmit(application.Product)).Submit(application));
            }
            catch (Exception e)
            {
                Console.WriteLine(e);

                throw;
            }
        }
        public int Handle(SellerApplication application)
        {
            var invoiceDiscount = application.ConfidentialInvoiceDiscount;
            var result          = _confidentialInvoiceWebService.SubmitApplicationFor(
                new CompanyDataRequest
            {
                CompanyFounded = application.CompanyData.Founded,
                CompanyNumber  = application.CompanyData.Number,
                CompanyName    = application.CompanyData.Name,
                DirectorName   = application.CompanyData.DirectorName
            }, invoiceDiscount.TotalLedgerNetworth, invoiceDiscount.AdvancePercentage,
                invoiceDiscount.VatRate);

            return((result.Success) ? result.ApplicationId ?? -1 : -1);
        }
        public void SubmitApplicationFor_WhenCalledWithoutCompanyData_WhouldReturnMinusOne()
        {
            // Arrange
            var application = new SellerApplication
            {
                Product = new BusinessLoans(),
            };
            var service = new ProductApplicationService(_serviceClientFactoryMock.Object);

            // Act
            var result = service.SubmitApplicationFor(application);

            // Assert
            result.Should().Be(-1);
        }
        public void UnsupportedProductTypeException_ShouldBeThrowed_WhenThereAreNoSpecificStrategy()
        {
            // Arrange
            var submitApplicationStrategyFactory = new SubmitApplicationStrategyFactory(null, null, null);
            var productApplicationService        = new ProductApplicationService(submitApplicationStrategyFactory);
            var application = new SellerApplication()
            {
                Product = new UnexistingProduct()
            };

            // Act & Assert
            Assert.Throws <UnsupportedProductTypeException>(() =>
                                                            productApplicationService.SubmitApplicationFor(application)
                                                            );
        }
Beispiel #24
0
        public ProductApplicationTests()
        {
            _result.SetupProperty(p => p.ApplicationId, 1);
            _result.SetupProperty(p => p.Success, true);
            var productApplicationService = new Mock <IProductApplicationService>();

            _sut = productApplicationService.Object;
            productApplicationService.Setup(m => m.SubmitApplicationFor(It.IsAny <SellerApplication>())).Returns(1);

            _sellerApplication = new SellerApplication
            {
                CompanyData = new SellerCompanyData(),
                Product     = new ConfidentialInvoiceDiscount()
            };
        }
        public void SubmitApplicationFor_ShouldCallBusinessLoansService_WhenGetBusinessLoansProduct()
        {
            var sellerApplication = new SellerApplication
            {
                Product     = _fixture.Build <BusinessLoans>().Create(),
                CompanyData = CreateCompanyData()
            };

            _productApplicationService.SubmitApplicationFor(sellerApplication);

            A.CallTo(
                () => _businessLoansService.SubmitApplicationFor(
                    A <CompanyDataRequest> ._,
                    A <LoansRequest> ._))
            .MustHaveHappened();
        }
        public void Given_InvalidBusinessLoansModel_When_CalledWithConfidentialInvoiceDiscount_Then_ShouldReturnTrue(
            BusinessLoans model, SellerApplication application)
        {
            _businessLoansServiceMock.Setup(
                m => m.SubmitApplicationFor(
                    It.IsAny <CompanyDataRequestModel>(),
                    It.IsAny <LoansRequestModel>()
                    )
                ).Returns(_result.Object);

            var result = _productApplicationService.IsSubmittedApplicationForBusinessLoansSuccess(
                model, application
                );

            result.Should().Be(false);
        }
        public void Given_CompanyRequestModel_When_CalledWithConfidentialInvoiceDiscount_Then_ShouldReturnTrue(
            ConfidentialInvoiceDiscountRequestModel model, SellerApplication application)
        {
            _confidentialInvoiceServiceMock.Setup(
                m => m.SubmitApplicationFor(
                    It.IsAny <CompanyDataRequestModel>(),
                    It.IsAny <ConfidentialInvoiceDiscountRequestModel>()
                    )
                ).Returns(_result.Object);

            var result = _productApplicationService.IsSubmittedApplicationForConfidentialInvoiceDiscountSuccess(
                model, application
                );

            result.Should().Be(true);
        }
Beispiel #28
0
        public void Calls_SelectInvoiceService_With_Proper_Args_And_Success_Result()
        {
            // Arrange
            var sis = new Mock <ISelectInvoiceService>(MockBehavior.Strict);
            var cis = new Mock <IConfidentialInvoiceService>(MockBehavior.Strict);
            var bls = new Mock <IBusinessLoansService>(MockBehavior.Strict);

            var pas = new ProductApplicationService(sis.Object, cis.Object, bls.Object);

            (string num, decimal amount, decimal advPct)? calledArgs = null;
            sis.Setup(s => s.SubmitApplicationFor(It.IsAny <string>(), It.IsAny <decimal>(), It.IsAny <decimal>()))
            .Returns <string, decimal, decimal>(
                (num, amount, advPct) =>
            {
                calledArgs = (num, amount, advPct);
                return(0);
            });

            var app = new SellerApplication
            {
                CompanyData = new SellerCompanyData
                {
                    DirectorName = "Smith",
                    Founded      = new DateTime(2000, 01, 01),
                    Name         = "ACME",
                    Number       = 123
                },
                Product = new SelectiveInvoiceDiscount
                {
                    InvoiceAmount     = 123000.456M,
                    AdvancePercentage = 5.67M
                }
            };

            // Act
            var result = pas.SubmitApplicationFor(app);

            // Assert
            Assert.True(result.Success);
            Assert.True(!result.Errors.Any());
            Assert.Null(result.ApplicationId);

            Assert.NotNull(calledArgs);
            Assert.Equal("123", calledArgs.Value.num);
            Assert.Equal(123000.456M, calledArgs.Value.amount);
            Assert.Equal(5.67M, calledArgs.Value.advPct);
        }
Beispiel #29
0
        public int Handle(SellerApplication application)
        {
            var loans  = application.BusinessLoans;
            var result = _businessLoansService.SubmitApplicationFor(new CompanyDataRequest
            {
                CompanyFounded = application.CompanyData.Founded,
                CompanyNumber  = application.CompanyData.Number,
                CompanyName    = application.CompanyData.Name,
                DirectorName   = application.CompanyData.DirectorName
            }, new LoansRequest
            {
                InterestRatePerAnnum = loans.InterestRatePerAnnum,
                LoanAmount           = loans.LoanAmount
            });

            return((result.Success) ? result.ApplicationId ?? -1 : -1);
        }
        public void WhenProductIsSelectiveInvoiceCanHandleSubmitApplication()
        {
            //Arrange

            IProduct product = new SelectiveInvoiceDiscount {
                Id = 1, InvoiceAmount = 300, AdvancePercentage = 5
            };

            ISellerCompanyData companyData1 = new SellerCompanyData {
                DirectorName = "Me", Founded = DateTime.Now, Name = "My Company", Number = 12
            };
            ISellerCompanyData companyData2 = new SellerCompanyData {
                DirectorName = "Us", Founded = DateTime.Now, Name = "Our Company", Number = 10
            };

            ISellerApplication sellerApp1 = new SellerApplication {
                Product = product, CompanyData = companyData1
            };
            ISellerApplication sellerApp2 = new SellerApplication {
                Product = product, CompanyData = companyData2
            };

            //-------------------------------------------------------------------------------------------------------

            Mock <ISelectInvoiceService>       mockSelectInvoiceService       = new Mock <ISelectInvoiceService>(MockBehavior.Strict);
            Mock <IConfidentialInvoiceService> mockConfidentialInvoiceService = new Mock <IConfidentialInvoiceService>(MockBehavior.Strict);
            Mock <IBusinessLoansService>       mockBusinessLoansService       = new Mock <IBusinessLoansService>(MockBehavior.Strict);

            mockSelectInvoiceService.Setup(m => m.SubmitApplicationFor(It.Is <string>(companyNumber => companyNumber == "12"), It.IsAny <decimal>(), It.IsAny <decimal>())).Returns(1);
            mockSelectInvoiceService.Setup(m => m.SubmitApplicationFor(It.Is <string>(companyNumber => companyNumber != "12"), It.IsAny <decimal>(), It.IsAny <decimal>())).Returns(-1);

            //-------------------------------------------------------------------------------------------------------

            IProductApplicationService applicationService = new ProductApplicationService(mockSelectInvoiceService.Object, mockConfidentialInvoiceService.Object, mockBusinessLoansService.Object);

            //Act
            int result1 = applicationService.SubmitApplicationFor(sellerApp1);
            int result2 = applicationService.SubmitApplicationFor(sellerApp2);

            //Assert
            mockSelectInvoiceService.Verify();

            Assert.Equal(1, result1);
            Assert.Equal(-1, result2);
        }