public void WithInvalidMinimumValuesShouldBeInvalid() { // Assign var model = new ProbabilityCalculationRequestViewModel { Type = ProbabilityCalculationType.Unknown, Probabilities = new List <ProbabilityViewModel> { new ProbabilityViewModel { Rate = -0.1 } }, }; var expectedResult = new List <string> { "The Type field is required.", "At least two probability is required.", }; // Act var results = ModelValidator.Validate(model).ToList(); // Assert results.Should().BeEquivalentTo(expectedResult); }
private async Task LogCalculation(ProbabilityCalculationRequestViewModel request, List <double> probabilities, double result) { var now = this.dateTimeProvider.GetUtcNow(); var probabilitiesCsv = string.Join(",", probabilities); var logMsg = $"{now}: Probability of {request.Type} with {probabilitiesCsv} returned a result of {result}"; await this.logWriter.AppendLinesToLogFileAsync(logMsg); }
public async Task <double> CalculateProbabilityAsync(ProbabilityCalculationRequestViewModel request) { var calculator = ProbabilityCalculationFactory.CreateForStrategy(request.Type); var probabilities = request.Probabilities.Select(x => x.Rate).ToList(); var result = calculator.Calculate(probabilities); await this.LogCalculation(request, probabilities, result); return(result); }
internal ProbabilityCalculationControllerSutBuilder VerifyLogWasCalledCorrectly( ProbabilityCalculationRequestViewModel request, ProbabilityViewModel result) { this.mockLogWriter.Verify(x => x.AppendLinesToLogFileAsync(It.IsAny <string>()), Times.Once); var probabilities = string.Join(",", request.Probabilities.Select(x => x.Rate)); var expectedLogMsg = $"{this.stubbedNow}: Probability of {request.Type} with {probabilities} returned a result of {result.Rate}"; this.mockLogWriter.Verify(x => x.AppendLinesToLogFileAsync(expectedLogMsg), Times.Once); return(this); }
public async Task <ActionResult <ProbabilityViewModel> > Post(ProbabilityCalculationRequestViewModel request) { try { var result = await this.probabilityCalculationService.CalculateProbabilityAsync(request); return(this.Ok(new ProbabilityViewModel { Rate = result })); } catch { return(this.StatusCode(StatusCodes.Status500InternalServerError)); } }
public void WithAllFieldsBeingTheirDefaultStateShouldBeInvalid() { // Assign var model = new ProbabilityCalculationRequestViewModel(); var expectedResult = new List <string> { "The Type field is required.", "The Probabilities field is required.", }; // Act var results = ModelValidator.Validate(model).ToList(); // Assert results.Should().BeEquivalentTo(expectedResult); }
public async Task AndTheRequestsIsValidShouldReturnTheCorrectResult( ProbabilityCalculationRequestViewModel stubbedRequest, ProbabilityViewModel expectedResult) { // Assign var sut = this.builder .WithStubbedNow(this.now) .Build(); // Act var result = await sut.Post(stubbedRequest); // Assert var actionResult = Assert.IsAssignableFrom <ActionResult <ProbabilityViewModel> >(result); var viewResult = Assert.IsAssignableFrom <OkObjectResult>(actionResult.Result); var viewModel = Assert.IsAssignableFrom <ProbabilityViewModel>(viewResult.Value); viewModel.Should().BeEquivalentTo(expectedResult); this.builder.VerifyLogWasCalledCorrectly(stubbedRequest, expectedResult); }
public void WithValidMinimumValuesShouldBeValid() { // Assign var model = new ProbabilityCalculationRequestViewModel { Type = ProbabilityCalculationType.And, Probabilities = new List <ProbabilityViewModel> { new ProbabilityViewModel { Rate = 0 }, new ProbabilityViewModel { Rate = 0 }, }, }; // Act var results = ModelValidator.Validate(model).ToList(); // Assert results.Should().BeEmpty(); }