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); }
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); }
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); }
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); }
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); }
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")); }