Exemplo n.º 1
0
 private void ValidateUrlToMatch(SearchResultsAnalysisRequest request)
 {
     if (string.IsNullOrWhiteSpace(request?.UrlToMatch))
     {
         throw new UrlToMatchNotSuppliedException();
     }
 }
Exemplo n.º 2
0
 private void ValidateTargetSearchEngineUrl(SearchResultsAnalysisRequest request)
 {
     if (string.IsNullOrWhiteSpace(request?.TargetSearchEngineUrl))
     {
         throw new TargetSearchEngineUrlNotSuppliedException();
     }
 }
Exemplo n.º 3
0
 private void ValidateKeywords(SearchResultsAnalysisRequest request)
 {
     if (string.IsNullOrWhiteSpace(request?.Keywords))
     {
         throw new KeywordsNotSuppliedException();
     }
 }
Exemplo n.º 4
0
        private SearchEngineParsingResponse GenerateRandomResults(SearchResultsAnalysisRequest request, Random random, int numberOfResults)
        {
            var matchingPositions = GenerateMatchingPositionsBetween1And1000(random, numberOfResults);

            var results = Generate1000Results(request, matchingPositions);

            return(new SearchEngineParsingResponse(results));
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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));
        }
Exemplo n.º 8
0
        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();
        }
Exemplo n.º 9
0
        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));
        }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
        public SearchResultsAnalysisResponse GetSearchResults(SearchResultsAnalysisRequest request)
        {
            ValidateRequest(request);

            var cachedResult = _memoryCache.Get <string>(GetCacheKey(request));

            if (cachedResult == null)
            {
                return(GetSourceResult(request));
            }

            return(new SearchResultsAnalysisResponse(cachedResult));
        }
Exemplo n.º 12
0
        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);
        }
Exemplo n.º 13
0
        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);
        }
Exemplo n.º 14
0
        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);
        }
Exemplo n.º 15
0
 private List <int> FilterResults(SearchResultsAnalysisRequest request, SearchEngineParsingResponse parsingResponse)
 {
     return(parsingResponse.Results.Where(p => p.Result == request.UrlToMatch).Select(p => p.Position).ToList());
 }
Exemplo n.º 16
0
 private void ValidateRequest(SearchResultsAnalysisRequest request)
 {
     ValidateTargetSearchEngineUrl(request);
     ValidateKeywords(request);
     ValidateUrlToMatch(request);
 }
Exemplo n.º 17
0
        private SearchResultsAnalysisResponse GetSourceResult(SearchResultsAnalysisRequest request)
        {
            var parsingResponse = _searchEngineParsingServiceProxy.GetSearchResults(request);

            return(AnalyseResponse(request, parsingResponse));
        }
Exemplo n.º 18
0
        private void CacheResult(SearchResultsAnalysisRequest request, string formattedResult)
        {
            var resultsCacheTimeInSeconds = _configuration.GetValue <int>(Constants.Config.ResultsCacheTimeInSeconds);

            _memoryCache.Set(GetCacheKey(request), formattedResult, TimeSpan.FromSeconds(resultsCacheTimeInSeconds));
        }
Exemplo n.º 19
0
 public SearchEngineParsingResponse GetSearchResults(SearchResultsAnalysisRequest request)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 20
0
        public IActionResult Post([FromBody] SearchResultsAnalysisRequest request)
        {
            var response = _searchResultsAnalysisService.GetSearchResults(request);

            return(Ok(response));
        }
Exemplo n.º 21
0
 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());
 }
Exemplo n.º 22
0
 private string GetCacheKey(SearchResultsAnalysisRequest request)
 {
     return($"{request.TargetSearchEngineUrl}:{request.Keywords}:{request.UrlToMatch}");
 }