private void ValidateUrlToMatch(SearchResultsAnalysisRequest request) { if (string.IsNullOrWhiteSpace(request?.UrlToMatch)) { throw new UrlToMatchNotSuppliedException(); } }
private void ValidateTargetSearchEngineUrl(SearchResultsAnalysisRequest request) { if (string.IsNullOrWhiteSpace(request?.TargetSearchEngineUrl)) { throw new TargetSearchEngineUrlNotSuppliedException(); } }
private void ValidateKeywords(SearchResultsAnalysisRequest request) { if (string.IsNullOrWhiteSpace(request?.Keywords)) { throw new KeywordsNotSuppliedException(); } }
private SearchEngineParsingResponse GenerateRandomResults(SearchResultsAnalysisRequest request, Random random, int numberOfResults) { var matchingPositions = GenerateMatchingPositionsBetween1And1000(random, numberOfResults); var results = Generate1000Results(request, matchingPositions); return(new SearchEngineParsingResponse(results)); }
public async Task WhenSearchResultsAnalysisRequested_ThenResponseStatusCodeIs200Ok() { var factory = new WebApplicationFactory <Startup>(); var client = factory.CreateClient(); var request = new SearchResultsAnalysisRequest("a", "b", "c"); var response = await client.PostAsJsonAsync(Url, request); response.StatusCode.Should().Be(HttpStatusCode.OK); }
public async Task WhenSearchResultsAnalysisRequested_AndTargetSearchEngineUrlIsNotSupplied_ThenResponseStatusCodeIs400BadRequest() { var factory = new WebApplicationFactory <Startup>(); var client = factory.CreateClient(); var request = new SearchResultsAnalysisRequest("", "b", "c"); var response = await client.PostAsJsonAsync(Url, request); response.StatusCode.Should().Be(HttpStatusCode.BadRequest); }
private SearchResultsAnalysisResponse AnalyseResponse(SearchResultsAnalysisRequest request, SearchEngineParsingResponse parsingResponse) { var filteredResults = FilterResults(request, parsingResponse); var limitedResults = LimitResults(filteredResults); var formattedResult = FormatResult(limitedResults); CacheResult(request, formattedResult); return(new SearchResultsAnalysisResponse(formattedResult)); }
public async Task WhenSearchResultsAnalysisRequested_ThenBodyContainsResults() { var factory = new WebApplicationFactory <Startup>(); var client = factory.CreateClient(); var request = new SearchResultsAnalysisRequest("a", "b", "c"); var response = await client.PostAsJsonAsync(Url, request); var body = await response.Content.ReadAsAsync <SearchResultsAnalysisResponse>(); body.Results.Should().NotBeNullOrWhiteSpace(); }
public SearchEngineParsingResponse GetSearchResults(SearchResultsAnalysisRequest request) { var random = new Random(); var numberOfResults = random.Next(50); if (numberOfResults == 0) { return(new SearchEngineParsingResponse(new List <SearchEngineResult>())); } return(GenerateRandomResults(request, random, numberOfResults)); }
public async Task WhenSearchResultsAnalysisRequested_AndUrlToMatchNotSupplied_ThenBodyContainsError() { var factory = new WebApplicationFactory <Startup>(); var client = factory.CreateClient(); var request = new SearchResultsAnalysisRequest("a", "b", ""); var expectedError = new ErrorResponse("UrlToMatch must be supplied", "UrlToMatchNotSupplied"); var response = await client.PostAsJsonAsync(Url, request); var body = await response.Content.ReadAsAsync <ErrorResponse>(); body.Should().BeEquivalentTo(expectedError); }
public SearchResultsAnalysisResponse GetSearchResults(SearchResultsAnalysisRequest request) { ValidateRequest(request); var cachedResult = _memoryCache.Get <string>(GetCacheKey(request)); if (cachedResult == null) { return(GetSourceResult(request)); } return(new SearchResultsAnalysisResponse(cachedResult)); }
public async Task WhenSearchResultsAnalysisRequested_AndRequestIsWithinCachingPeriod_ThenBodyContainsCachedResults() { var factory = new WebApplicationFactory <Startup>(); var client = factory.CreateClient(); var request = new SearchResultsAnalysisRequest("a", "b", "c"); var response = await client.PostAsJsonAsync(Url, request); var body = await response.Content.ReadAsAsync <SearchResultsAnalysisResponse>(); var response2 = await client.PostAsJsonAsync(Url, request); var body2 = await response2.Content.ReadAsAsync <SearchResultsAnalysisResponse>(); body.Results.Should().Be(body2.Results); }
public async Task WhenSearchResultsAnalysisRequested_MatchingResultsWithPositionGreaterThan100AreFilteredOut() { var urlToMatch = "urlToMatch"; var request = new SearchResultsAnalysisRequest("a", "b", urlToMatch); var results = new List <SearchEngineResult>() { new SearchEngineResult(99, urlToMatch), new SearchEngineResult(100, urlToMatch), new SearchEngineResult(101, urlToMatch) }; var proxyResponse = new SearchEngineParsingResponse(results); var expectedResponse = "99, 100"; var client = CreateClientWithMockProxy(proxyResponse); var response = await client.PostAsJsonAsync(Url, request); var body = await response.Content.ReadAsAsync <SearchResultsAnalysisResponse>(); body.Results.Should().Be(expectedResponse); }
public async Task WhenSearchResultsAnalysisRequested_ThenBodyContainsCommaSeparatedListOfPositionsOfMatchingResults() { var urlToMatch = "urlToMatch"; var request = new SearchResultsAnalysisRequest("a", "b", urlToMatch); var results = new List <SearchEngineResult>() { new SearchEngineResult(1, urlToMatch), new SearchEngineResult(28, urlToMatch), new SearchEngineResult(89, "") }; var proxyResponse = new SearchEngineParsingResponse(results); var expectedResponse = "1, 28"; var client = CreateClientWithMockProxy(proxyResponse); var response = await client.PostAsJsonAsync(Url, request); var body = await response.Content.ReadAsAsync <SearchResultsAnalysisResponse>(); body.Results.Should().Be(expectedResponse); }
private List <int> FilterResults(SearchResultsAnalysisRequest request, SearchEngineParsingResponse parsingResponse) { return(parsingResponse.Results.Where(p => p.Result == request.UrlToMatch).Select(p => p.Position).ToList()); }
private void ValidateRequest(SearchResultsAnalysisRequest request) { ValidateTargetSearchEngineUrl(request); ValidateKeywords(request); ValidateUrlToMatch(request); }
private SearchResultsAnalysisResponse GetSourceResult(SearchResultsAnalysisRequest request) { var parsingResponse = _searchEngineParsingServiceProxy.GetSearchResults(request); return(AnalyseResponse(request, parsingResponse)); }
private void CacheResult(SearchResultsAnalysisRequest request, string formattedResult) { var resultsCacheTimeInSeconds = _configuration.GetValue <int>(Constants.Config.ResultsCacheTimeInSeconds); _memoryCache.Set(GetCacheKey(request), formattedResult, TimeSpan.FromSeconds(resultsCacheTimeInSeconds)); }
public SearchEngineParsingResponse GetSearchResults(SearchResultsAnalysisRequest request) { throw new NotImplementedException(); }
public IActionResult Post([FromBody] SearchResultsAnalysisRequest request) { var response = _searchResultsAnalysisService.GetSearchResults(request); return(Ok(response)); }
private List <SearchEngineResult> Generate1000Results(SearchResultsAnalysisRequest request, IReadOnlyList <int> matchingPositions) { return(Enumerable.Range(1, 1000).Select(p => new SearchEngineResult(p, matchingPositions.Contains(p) ? request.UrlToMatch : "http://www.someotherurl.com")).ToList()); }
private string GetCacheKey(SearchResultsAnalysisRequest request) { return($"{request.TargetSearchEngineUrl}:{request.Keywords}:{request.UrlToMatch}"); }