Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
 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);
 }
Esempio n. 7
0
 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>();
 }
Esempio n. 8
0
        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>();
        }
Esempio n. 10
0
        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);
        }