コード例 #1
0
        public async Task GivenValidSearchShouldConvertElasticResponseToSuggestionModelAndOkResult()
        {
            var validSearchResponse = new Mock <ISearchResponse <City> >();

            validSearchResponse.Setup(x => x.IsValid).Returns(true);
            validSearchResponse.Setup(x => x.MaxScore).Returns(1);

            var hits     = new List <IHit <City> >();
            var hit      = new Mock <IHit <City> >();
            var montreal = new City {
                Name = "Montreal", Country = "CA", Location = new Location(1, 2)
            };

            hit.Setup(x => x.Source).Returns(montreal);
            hits.Add(hit.Object);

            validSearchResponse.Setup(x => x.Hits).Returns(hits);
            _citySearchServiceMock.Setup(x => x.SearchAsync(It.IsAny <SearchCriteria>())).Returns(Task.FromResult(validSearchResponse.Object));

            var p = new QueryParametersV2 {
                q = "search"
            };
            var response = await _suggestions.GetSuggestions(p);

            (response.Result as ObjectResult).StatusCode.Should().Be(StatusCodes.Status200OK);
            var suggestions = (response.Result as OkObjectResult).Value as Suggestion[];

            suggestions.Length.Should().Be(1);
            suggestions[0].Name.Should().Be(string.Concat(montreal.Name, ", ", montreal.Country));
            suggestions[0].Longitude.Should().Be(montreal.Location.Lon);
            suggestions[0].Latitude.Should().Be(montreal.Location.Lat);
        }
コード例 #2
0
        public async Task GivenInternalErrorShouldReturnError500()
        {
            _citySearchServiceMock.Setup(x => x.SearchAsync(It.IsAny <SearchCriteria>())).Throws <Exception>();
            var p = new QueryParametersV2 {
                q = "search"
            };
            var response = await _suggestions.GetSuggestions(p);

            (response.Result as ObjectResult).StatusCode.Should().Be(StatusCodes.Status500InternalServerError);
        }
コード例 #3
0
        public async Task GivenInValidSearchShouldReturnError500()
        {
            var invalidSearchResponse = new Mock <ISearchResponse <City> >();

            invalidSearchResponse.Setup(x => x.IsValid).Returns(false);
            _citySearchServiceMock.Setup(x => x.SearchAsync(It.IsAny <SearchCriteria>())).Returns(Task.FromResult(invalidSearchResponse.Object));

            var p = new QueryParametersV2 {
                q = "search"
            };
            var response = await _suggestions.GetSuggestions(p);

            (response.Result as ObjectResult).StatusCode.Should().Be(StatusCodes.Status500InternalServerError);
        }
コード例 #4
0
        public async Task GivenEmptyLonLatInQueryParametersShouldPassDoubleMinValue()
        {
            SearchCriteria searchCriteria = null;

            _citySearchServiceMock.Setup(x => x.SearchAsync(It.IsAny <SearchCriteria>())).Callback((SearchCriteria s) => searchCriteria = s);

            var p = new QueryParametersV2 {
                q = "search"
            };
            var response = await _suggestions.GetSuggestions(p);

            searchCriteria.Text.Should().Be(p.q);
            searchCriteria.Longitude.Should().Be(double.MinValue);
            searchCriteria.Latitude.Should().Be(double.MinValue);
        }
コード例 #5
0
        public async Task QueryParametersShouldBePassedToCitySearchService()
        {
            SearchCriteria searchCriteria = null;

            _citySearchServiceMock.Setup(x => x.SearchAsync(It.IsAny <SearchCriteria>())).Callback((SearchCriteria s) => searchCriteria = s);

            var p = new QueryParametersV2 {
                q = "search", Longitude = 1, Latitude = 2
            };
            var response = await _suggestions.GetSuggestions(p);

            searchCriteria.Text.Should().Be(p.q);
            searchCriteria.Longitude.Should().Be(p.Longitude);
            searchCriteria.Latitude.Should().Be(p.Latitude);
        }
コード例 #6
0
        public async Task <ActionResult <IEnumerable <Suggestion> > > GetSuggestions([FromQuery] QueryParametersV2 parameters)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            try
            {
                var criteria = new SearchCriteria
                {
                    Text       = parameters.q,
                    Longitude  = parameters.Longitude ?? double.MinValue,
                    Latitude   = parameters.Latitude ?? double.MinValue,
                    SearchFrom = parameters.From ?? 0,
                    SearchSize = parameters.Size ?? 5,
                };
                var result = await _citySearchService.SearchAsync(criteria);

                if (result.IsValid)
                {
                    var suggestions = _mapper.Map <Suggestion[]>(result.Hits);

                    //Tweak score to fall between 0 and 1 since not supported by Lucene and ElasticSearch
                    foreach (var suggestion in suggestions)
                    {
                        suggestion.Score = suggestion.Score / result.MaxScore;
                    }

                    return(Ok(suggestions));
                }
                else
                {
                    _logger.Log(LogLevel.Error, result.DebugInformation);
                }
            }
            catch (Exception e)
            {
                _logger.Log(LogLevel.Error, e, "Exception in GetSuggestions");
            }

            return(StatusCode(StatusCodes.Status500InternalServerError, "Server error"));
        }