public void Should_Throw_Error_if_application_is_Null() { ISellerApplication sellerApplciation = null; var productApplciationservice = new ProductApplicationService(_selectInvoiceService.Object, _confidentialInvoiceService.Object, _businessLoanService.Object); Assert.Throws <NullReferenceException>(() => productApplciationservice.SubmitApplicationFor(sellerApplciation)); }
public int SubmitApplication(ISellerApplication application) { return(_selectInvoiceService.SubmitApplicationFor( application.CompanyData.Number.ToString(), _invoiceAmount, _advancePercentage)); }
private void SetupMockBusinessLoans(ISellerApplication application, IApplicationResult result) { _mockBusinessLoansService .Setup(p => p.SubmitApplicationFor(It.IsAny <CompanyDataRequest>(), It.IsAny <LoansRequest>())) .Returns(result) .Verifiable(); }
public int SubmitApplicationFor(ISellerApplication application) { // Missing input is not null validation here since in my opinion // it has to be delegated to a framework like FluentValidation // and be applied in Startup class so that we could do it automatically // Cons: Validator has to be created for each Request to be validated if (!(application.Product is BusinessLoans loans)) { throw new InvalidOperationException( $"{nameof(BusinessLoansApplicationHandler)} " + $"handles {nameof(BusinessLoans)} product only, " + $"but {application.Product.GetType().Name} was passed"); } 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 }); // I don't like the concept of returning numeric result. It is not informative and should be made object return((result.Success) ? result.ApplicationId ?? -1 : -1); }
public int SubmitApplicationFor(ISellerApplication application) { // Assumed here that it may be possible to send a blank // Application to the method, so I have added defensive coding to it if (application == null) { throw new NullReferenceException(); } switch (application.Product) { case SelectiveInvoiceDiscount sid: return(_selectInvoiceService.SubmitApplicationFor( application.CompanyData.Number.ToString(), sid.InvoiceAmount, sid.AdvancePercentage )); case ConfidentialInvoiceDiscount cid: return(SubmitCompanyDataRequest(application.CompanyData, cid)); case BusinessLoans loan: return(SubmitBusinessLoanRequest(application.CompanyData, loan)); default: throw new InvalidOperationException(); } }
public static dynamic ToSubmitCommand(this ISellerApplication application) { if (application.Product is SelectiveInvoiceDiscount invoiceDiscount) { return(new SubmitSelectiveInvoiceDiscountApplicationCommand( invoiceDiscount.InvoiceAmount, invoiceDiscount.AdvancePercentage, application.CompanyData.Number)); } if (application.Product is BusinessLoans businessLoan) { return(new SubmitBusinessLoansCommand( application.CompanyData, businessLoan.InterestRatePerAnnum, businessLoan.LoanAmount)); } if (application.Product is ConfidentialInvoiceDiscount confidentialInvoiceDiscount) { return(new SubmitConfidentialInvoiceDiscountCommand( confidentialInvoiceDiscount.TotalLedgerNetworth, confidentialInvoiceDiscount.AdvancePercentage, confidentialInvoiceDiscount.VatRate, application.CompanyData)); } throw new InvalidOperationException(); }
/// <summary> /// Submitting application based on the product. /// </summary> /// <param name="application"></param> /// <returns></returns> public int SubmitApplicationFor(ISellerApplication application) { try { if (application != null & application.Product != null) { if (application.Product is SelectiveInvoiceDiscount) { return(SubmitApplicationForSelectiveInvoiceDiscount((SelectiveInvoiceDiscountApplication)application)); } if (application.Product is ConfidentialInvoiceDiscount) { var result = SubmitApplicationForConfidentialInvoiceDiscount((ConfidentialInvoiceDiscountApplication)application); return((result.Success) ? result.ApplicationId ?? -1 : -1); } if (application.Product is BusinessLoans) { var result = SubmitApplicationForBusinessLoans((BusinessLoansApplication)application); return((result.Success) ? result.ApplicationId ?? -1 : -1); } } else { throw new ArgumentNullException(); } } catch (Exception ex) { throw ex; } return(-1); }
public int SubmitApplication(ISellerApplication application) { var sid = ValidateArgument <SelectiveInvoiceDiscount>(application); return(_selectInvoiceService.SubmitApplicationFor(application.CompanyData.Number.ToString(), sid.InvoiceAmount, sid.AdvancePercentage)); }
public ServiceResult SubmitApplicationFor(ISellerApplication application) { return(new ServiceResult( id: 1, // generated by something code: 2, // lets say this means it's not critical. Probably could be an enum errorMessage: "Unsupported product type")); }
public int Handle(ISellerApplication application) { if (application == null) { throw new ArgumentNullException(nameof(application)); } if (application.Product is BusinessLoans product) { 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 = product.InterestRatePerAnnum, LoanAmount = product.LoanAmount }); return((result.Success) ? result.ApplicationId ?? -1 : -1); } throw new InvalidOperationException(); }
public int SubmitApplicationFor(ISellerApplication application) { // Missing input is not null validation here since in my opinion // it has to be delegated to a framework like FluentValidation // and be applied in Startup class so that we could do it automatically // Cons: Validator has to be created for each Request to be validated if (!(application.Product is ConfidentialInvoiceDiscount cid)) { throw new InvalidOperationException( $"{nameof(ConfidentialInvoiceApplicationHandler)} " + $"handles {nameof(ConfidentialInvoiceDiscount)} product only, " + $"but {application.Product.GetType().Name} was passed"); } var result = _confidentialInvoiceService.SubmitApplicationFor( new CompanyDataRequest { CompanyFounded = application.CompanyData.Founded, CompanyNumber = application.CompanyData.Number, CompanyName = application.CompanyData.Name, DirectorName = application.CompanyData.DirectorName }, cid.TotalLedgerNetworth, cid.AdvancePercentage, cid.VatRate); // I don't like the concept of returning numeric result. It is not informative and should be made object return((result.Success) ? result.ApplicationId ?? -1 : -1); }
public int SubmitApplicationFor(ISellerApplication application) { if (application?.CompanyData == null) { throw new ArgumentException(nameof(application.CompanyData)); } if (application.Product == null) { throw new ArgumentException(nameof(application.Product)); } try { switch (application.Product) { case SelectiveInvoiceDiscount sid: return(CallSelectInvoiceService(application.CompanyData.Number, sid)); case ConfidentialInvoiceDiscount cid: return(CallConfidentialInvoiceWebService(application.CompanyData, cid)); case BusinessLoans loans: return(CallBusinessLoansService(application.CompanyData, loans)); default: throw new ArgumentException(nameof(application.Product)); } } catch (Exception e) { //TODO Log exception throw; } }
/// <summary> /// /// </summary> /// <param name="application"></param> /// <returns></returns> public int SubmitApplicationFor(ISellerApplication application) { try { if (application != null && application.Product != null && application.CompanyData != null && ServicesMediator != null) { if (application.Product is ProductServices.IServiceProvider) { ProductServices.IServiceProvider serviceProvider = application.Product as ProductServices.IServiceProvider; ProductServices.IProductService productService = serviceProvider.GetProductService(ServicesMediator); return(productService.SubmitApplication(application.CompanyData)); } else { throw new NotSupportedException(); } } else { throw new ArgumentNullException(); } } catch (Exception ex) { log.Error(ex.ToString()); throw; } }
public IApplicationResult SubmitApplicationFor(ISellerApplication application) { var clerk = productResolver.Assign(application); // future asynchrony clerk.Take(application); return(clerk.Issue()); }
private int SubmitForBusinessLoans(ISellerApplication application) { var result = _businessLoansService.SubmitApplicationFor( CompanyDataRequestFactory.Create(application.CompanyData), LoansRequestFactory.Create(application.Product as BusinessLoans)); return(result.ApplicationId ?? FailedStatus); }
public void ProductApplicationService_SubmitApplicationFor_WhenCalledWithSelectiveInvoiceDiscount_OnError_ShouldReturnMinusOne() { _sellerApplication = TestSellerApplicationProvider.GetTestSellerApplication(new SelectiveInvoiceDiscount()); _selectInvoiceServiceMock.Setup(m => m.SubmitApplicationFor(It.IsAny <string>(), It.IsAny <decimal>(), It.IsAny <decimal>())).Returns(-1); var result = _sut.SubmitApplicationFor(_sellerApplication); result.Should().Be(-1); }
/// <summary> /// Handle applications for confidential invoice discounts. /// </summary> /// <param name="application">Applicaiton.</param> /// <returns>Result id of the applicaiton or a fails status.</returns> public int SubmitApplicationFor(ISellerApplication <ConfidentialInvoiceDiscount> application) { IApplicationResult result = _confidentialInvoiceWebService.SubmitApplicationFor( MappingHelper.SellerCompanyDataToCompanyDataRequest(application.CompanyData), application.Product.TotalLedgerNetworth, application.Product.AdvancePercentage, application.Product.VatRate); return(ReturnResult(result)); }
// Comments.md - my remark about returning meaningful result/error object instead of int public ServiceResult SubmitApplicationFor(ISellerApplication application) { // Validate.IsNotNull(application); -> guard for param validation var serviceHandler = ServiceHandlerDispatcher.GetHandler(application.Product); return(serviceHandler.SubmitApplicationFor(application)); }
private void SetupMockSelectInvoiceService(ISellerApplication application, int rtn) { SelectiveInvoiceDiscount product = (SelectiveInvoiceDiscount)application.Product; _mockSelectInvoiceService .Setup(p => p.SubmitApplicationFor(application.CompanyData.Number.ToString(), product.InvoiceAmount, product.AdvancePercentage)) .Returns(rtn) .Verifiable(); }
public async Task <ServiceResult> RunAsync(ISellerApplication application) { var loans = application.Product as BusinessLoans; var result = /*await*/ service.SubmitApplicationFor( application.CompanyData.ToRequest(), loans.ToRequest()); return(new ServiceResult(result.Success ? ProceedStatus.Ready : ProceedStatus.Error, result)); }
public void ProductApplicationService_SubmitApplicationFor_WhenCalledWithConfidentialInvoiceDiscount_OnError_ShouldReturnMinusOne() { InitResult(success: false); _sellerApplication = TestSellerApplicationProvider.GetTestSellerApplication(new ConfidentialInvoiceDiscount()); _confidentialInvoiceServiceMock.Setup(m => m.SubmitApplicationFor(It.IsAny <CompanyDataRequest>(), It.IsAny <decimal>(), It.IsAny <decimal>(), It.IsAny <decimal>())).Returns(_result.Object); var result = _sut.SubmitApplicationFor(_sellerApplication); result.Should().Be(-1); }
private int SubmitForSelectiveInvoiceDiscount(ISellerApplication application) { var product = application.Product as SelectiveInvoiceDiscount; return(_selectInvoiceService.SubmitApplicationFor( application.CompanyData.Number.ToString(), product.InvoiceAmount, product.AdvancePercentage)); }
public void ProductApplicationService_SubmitApplicationFor_WhenCalledWithBusinessLoans_OnError_ShouldReturnMinusOne() { InitResult(success: false); _sellerApplication = TestSellerApplicationProvider.GetTestSellerApplication(new BusinessLoans()); _businessLoansServiceMock.Setup(m => m.SubmitApplicationFor(It.IsAny <CompanyDataRequest>(), It.IsAny <LoansRequest>())).Returns(_result.Object); var result = _sut.SubmitApplicationFor(_sellerApplication); result.Should().Be(-1); }
/// <summary> /// Handle applications for business loans. /// </summary> /// <param name="application">Applicaiton.</param> /// <returns>Result id of the applicaiton or a fails status.</returns> public int SubmitApplicationFor(ISellerApplication <BusinessLoan> application) { IApplicationResult result = _businessLoansService .SubmitApplicationFor( MappingHelper.SellerCompanyDataToCompanyDataRequest(application.CompanyData), MappingHelper.ToLoanRequest(application.Product)); return(ReturnResult(result)); }
public int SubmitApplicationFor(ISellerApplication application) { var submitCommand = application.ToSubmitCommand(); var handler = this.serviceFactory.GetHandlerForCommand(submitCommand); var result = handler.ExecuteAsync(submitCommand).Result; return(result.Successful ? result.Data : -1); }
public int SubmitApplication(ISellerApplication application) { var cid = ValidateArgument <ConfidentialInvoiceDiscount>(application); var result = _confidentialInvoiceService.SubmitApplicationFor(_companyDataMapper.MapToRequest(application.CompanyData), cid.TotalLedgerNetworth, cid.AdvancePercentage, cid.VatRate); return(GetResult(result)); }
private void SetupMockConfidentialInvoiceDiscount(ISellerApplication application, IApplicationResult result) { ConfidentialInvoiceDiscount product = (ConfidentialInvoiceDiscount)application.Product; _mockConfidentialInvoiceService .Setup(p => p.SubmitApplicationFor(It.IsAny <CompanyDataRequest>(), product.TotalLedgerNetworth, product.AdvancePercentage, product.VatRate)) .Returns(result) .Verifiable(); }
public override int Submit(ISellerApplication application) { if (!(application.Product is SelectiveInvoiceDiscount sid)) { throw new InvalidOperationException(GetErrorMessage(typeof(SelectiveInvoiceDiscount), application.Product.GetType())); } return(_selectInvoiceService.SubmitApplicationFor(application.CompanyData.Number.ToString(), sid.InvoiceAmount, sid.AdvancePercentage)); }
private int SubmitApplicationForBusinessLoans(ISellerApplication application, BusinessLoans loans) { var result = _businessLoansService.SubmitApplicationFor( _sellerApplicationMapper.MapToCompanyDataRequest(application), _businessLoanMapper.MapToLoanRequest(loans) ); return(_applicationResultMapper.MapToResultCode(result)); }
public ServiceResult SubmitApplicationFor(ISellerApplication application) { var result = selectInvoiceService.SubmitApplicationFor( application.CompanyData.Number.ToString(), Product.InvoiceAmount, Product.AdvancePercentage); return(new ServiceResult(result)); }