public async Task <HttpResponseMessage> Get([ModelBinder] AccidentStatisticsQuery accidentStatisticsQuery) { if (accidentStatisticsQuery == null) { accidentStatisticsQuery = AccidentStatisticsQuery.CreateDefault(); } if (ModelState.IsValid) { try { _logger.Information($"Retrieving Accident Statistics for {accidentStatisticsQuery}"); var result = await _accidentStatisticsService.GetAccidentStatistics(accidentStatisticsQuery); HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, result); return(response); } catch (Exception e) { _logger.Error("Unable to get accident statistics", e); return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, $"Unable to get Accident Statistics by {accidentStatisticsQuery}", e)); } } var httpError = new HttpError(ModelState, true); _logger.Error($"Model state is not valid", new Exception($"{httpError.Message} {httpError.MessageDetail} {httpError.ExceptionMessage}")); return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, httpError)); }
public async Task GetFatalAccidentsWithAccidentStatisticIdDescending() { AccidentStatisticsQuery accidentStatisticsQuery = CreateQuery(severity: "FaTaL", sortBy: "accidentStatisticIdDescending"); var actual = await _subject.GetAccidents(accidentStatisticsQuery); actual.Data.Should().OnlyContain(x => x.Severity == Severity.Fatal); actual.Data.Should().BeInDescendingOrder(x => x.AccidentStatisticId); }
public async Task GetSlightAccidentsWithBoroughDescending() { AccidentStatisticsQuery accidentStatisticsQuery = CreateQuery(severity: "SlighT", sortBy: "boroughDescending"); var actual = await _subject.GetAccidents(accidentStatisticsQuery); actual.Data.Should().OnlyContain(x => x.Severity == Severity.Slight); actual.Data.Should().BeInAscendingOrder(x => x.Borough); }
public async Task GetSeriousAccidentsWithLocationDescending() { AccidentStatisticsQuery accidentStatisticsQuery = CreateQuery(severity: "sEriOus", sortBy: "lOcationDescending"); var actual = await _subject.GetAccidents(accidentStatisticsQuery); actual.Data.Should().OnlyContain(x => x.Severity == Severity.Serious); actual.Data.Should().BeInDescendingOrder(x => x.Location); }
public async Task <Paging <AccidentStatistic> > GetAccidentStatistics(AccidentStatisticsQuery accidentStatisticsQuery) { return(await _transportForLondonClient.GetAccidentStatistics( accidentStatisticsQuery.From, accidentStatisticsQuery.To, ParseSeverity(accidentStatisticsQuery.Severity), ParseSortBy(accidentStatisticsQuery.SortBy), accidentStatisticsQuery.Page, accidentStatisticsQuery.PageSize)); }
private bool IsFilterAsExpected(AccidentStatisticsQuery accidentStatisticsQuery, Expression <Func <AccidentStatisticDb, bool> > actualFilter) { // Expression<Func<AccidentStatisticDb, bool>> expectedFilter = filter => // filter.Date >= accidentStatisticsQuery.From && // filter.Date <= accidentStatisticsQuery.To && // filter.Severity == Severity.Serious; // TODO: Investigate how to create a lambda comparer // e.g. https://stackoverflow.com/questions/283537/most-efficient-way-to-test-equality-of-lambda-expressions // var isEqual = LambdaCompare.ShouldEqual(expectedFilter, actualFilter); return(actualFilter != null); }
public AccidentStatisticsControllerShould() { _autoMocker = new AutoMocker(); _subject = _autoMocker.CreateInstance <AccidentStatisticsController>(); _subject.Request = new HttpRequestMessage(); _subject.Configuration = new HttpConfiguration(); _autoFixture = new Fixture(); _pagingResult = _autoFixture.Create <Paging <AccidentStatistic> >(); _accidentStatisticsServiceMock = _autoMocker.GetMock <IAccidentStatisticsService>(); _accidentStatisticsServiceMock.Setup(x => x.GetAccidentStatistics(It.IsAny <AccidentStatisticsQuery>())) .ReturnsAsync(() => _pagingResult); _accidentStatisticsQuery = _autoFixture.Create <AccidentStatisticsQuery>(); }
public async Task <Paging <AccidentStatisticDb> > GetAccidents(AccidentStatisticsQuery accidentStatisticsQuery) { if (accidentStatisticsQuery == null) { throw new ArgumentNullException(nameof(accidentStatisticsQuery)); } var severity = ParseSeverity(accidentStatisticsQuery.Severity); var result = await accidentStatisticRepository.Get(filter => filter.Date >= accidentStatisticsQuery.From && filter.Date <= accidentStatisticsQuery.To && filter.Severity == severity, ParseSortBy(accidentStatisticsQuery.SortBy), accidentStatisticsQuery.Page, accidentStatisticsQuery.PageSize); return(result); }
public AccidentsControllerShould() { _autoMocker = new AutoMocker(); _subject = _autoMocker.CreateInstance <AccidentsController>(); _subject.Request = new HttpRequestMessage(); _subject.Configuration = new HttpConfiguration(); _autoFixture = new Fixture(); // Cater for EF internal self referencing objects that can cause recursion _autoFixture.Behaviors .OfType <ThrowingRecursionBehavior>() .ToList().ForEach(b => _autoFixture.Behaviors.Remove(b)); _autoFixture.Behaviors.Add(new OmitOnRecursionBehavior(1)); _pagingResult = _autoFixture.Create <Paging <AccidentStatisticDb> >(); _accidentsServiceMock = _autoMocker.GetMock <IAccidentsService>(); _accidentsServiceMock.Setup(x => x.GetAccidents(It.IsAny <AccidentStatisticsQuery>())) .ReturnsAsync(() => _pagingResult); _accidentStatisticsQuery = _autoFixture.Create <AccidentStatisticsQuery>(); }
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { if (bindingContext.ModelType != typeof(AccidentStatisticsQuery)) { return(false); } var requestUri = actionContext.Request.RequestUri; if (requestUri == null) { bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Request Uri is required"); return(false); } var queryDictionary = HttpUtility.ParseQueryString(requestUri.Query); if (queryDictionary["from"] != null && !DateTime.TryParse(queryDictionary["from"], out _)) { bindingContext.ModelState.AddModelError(bindingContext.ModelName, $"'{queryDictionary["from"]}' date is invalid"); return(false); } if (queryDictionary["accidentStatisticsQuery.from"] != null && !DateTime.TryParse(queryDictionary["accidentStatisticsQuery.from"], out _)) { bindingContext.ModelState.AddModelError(bindingContext.ModelName, $"'{queryDictionary["accidentStatisticsQuery.from"]}' date is invalid"); return(false); } if (queryDictionary["to"] != null && !DateTime.TryParse(queryDictionary["to"], out _)) { bindingContext.ModelState.AddModelError(bindingContext.ModelName, $"'{queryDictionary["to"]}' date is invalid"); return(false); } if (queryDictionary["accidentStatisticsQuery.to"] != null && !DateTime.TryParse(queryDictionary["accidentStatisticsQuery.to"], out _)) { bindingContext.ModelState.AddModelError(bindingContext.ModelName, $"'{queryDictionary["accidentStatisticsQuery.to"]}' date is invalid"); return(false); } var from = queryDictionary["from"] != null ? DateTime.Parse(queryDictionary["from"]) : (queryDictionary["accidentStatisticsQuery.from"] != null ? DateTime.Parse(queryDictionary["accidentStatisticsQuery.from"]) : _maxYearFirstMonthAndDay); var to = queryDictionary["to"] != null && DateTime.TryParse(queryDictionary["to"], out _) ? DateTime.Parse(queryDictionary["to"]) : (queryDictionary["accidentStatisticsQuery.to"] != null && DateTime.TryParse(queryDictionary["accidentStatisticsQuery.to"], out _) ? DateTime.Parse(queryDictionary["accidentStatisticsQuery.to"]) : _maxYearLastMonthAndDay); var page = queryDictionary["page"] != null ? int.Parse(queryDictionary["page"]) : (queryDictionary["accidentStatisticsQuery.page"] != null ? int.Parse(queryDictionary["accidentStatisticsQuery.page"]) : 1); var pageSize = queryDictionary["pageSize"] != null ? int.Parse(queryDictionary["pageSize"]) : (queryDictionary["accidentStatisticsQuery.pageSize"] != null ? int.Parse(queryDictionary["accidentStatisticsQuery.pageSize"]) : 100); var severity = queryDictionary["severity"] ?? queryDictionary["accidentStatisticsQuery.severity"] ?? "Fatal"; var sortBy = queryDictionary["sortBy"] ?? queryDictionary["orderBy"] ?? queryDictionary["accidentStatisticsQuery.sortBy"] ?? "DateDescending"; var result = new AccidentStatisticsQuery { From = from, To = to, Severity = severity, SortBy = sortBy, Page = page, PageSize = pageSize, }; bindingContext.Model = result; return(true); }