Пример #1
0
        public static IEnumerable <object[]> CheckWebsiteStatusCachingAsyncUnitTestDataGenerator()
        {
            var request = new CheckWebsiteStatusRequest()
            {
                Count        = 10,
                Link         = "l2",
                Query        = "search",
                SearchEngine = SearchEngineType.Google.ToString()
            };

            var searchEngineHandler = new Mock <ISearchEngineHandler>();

            searchEngineHandler.Setup(h => h.EngineType).Returns(SearchEngineType.Google);
            searchEngineHandler.Setup(h => h.SelectLinksAsync(It.IsAny <string>(), It.IsAny <int>())).Returns(
                Task.FromResult((new List <string>()
            {
                "L1", "L2", "L3"
            }).AsEnumerable()));

            var cacheHandler = new Mock <ICacheHandler>();

            cacheHandler.Setup(ch => ch.GetCacheObject <CheckWebsiteStatusResponse>(It.IsAny <string>()))
            .Returns((CheckWebsiteStatusResponse)null);

            yield return(new object[] { searchEngineHandler, cacheHandler, request, false });

            cacheHandler = new Mock <ICacheHandler>();
            cacheHandler.Setup(ch => ch.GetCacheObject <CheckWebsiteStatusResponse>(It.IsAny <string>()))
            .Returns(new CheckWebsiteStatusResponse());
            yield return(new object[] { searchEngineHandler, cacheHandler, request, true });
        }
        public async Task <IActionResult> CheckLinkStatus([FromBody] CheckWebsiteStatusRequest request)
        {
            try
            {
                var result = await searchService.CheckWebsiteStatusAsync(request);

                return(Ok(result));
            }
            catch (SearchEngineHandlerNotFound e)
            {
                return(NotFound(e.Message));
            }
            catch (Exception e)
            {
                return(BadRequest(e));
            }
        }
Пример #3
0
        public async Task <CheckWebsiteStatusResponse> CheckWebsiteStatusAsync(CheckWebsiteStatusRequest request)
        {
            var key = request.GenerateCacheKey();

            var cachedResponse = cacheHandler.GetCacheObject <CheckWebsiteStatusResponse>(key);

            if (cachedResponse != null)
            {
                return(cachedResponse);
            }

            if (!Enum.TryParse <SearchEngineType>(request.SearchEngine, true, out var engineType))
            {
                throw new SearchEngineHandlerNotFound(request.SearchEngine);
            }

            var searchEngine = searchEngineHandlers.Select(engineType);

            var links = (await searchEngine.SelectLinksAsync(request.Query, request.Count)).ToList();

            var resultItems = new List <SearchResultItem>();

            for (var i = 0; i < links.Count; i++)
            {
                if (links[i].Contains(request.Link, StringComparison.InvariantCultureIgnoreCase))
                {
                    resultItems.Add(new SearchResultItem()
                    {
                        Position = i + 1
                    });
                }
            }

            var response = new CheckWebsiteStatusResponse()
            {
                ResultItems = resultItems
            };

            cacheHandler.SetCacheObject(key, response);

            return(response);
        }
Пример #4
0
        public async Task CheckWebsiteStatusAsyncUnitTest(
            IEnumerable <ISearchEngineHandler> searchEngineHandlers,
            CheckWebsiteStatusRequest request,
            CheckWebsiteStatusResponse response,
            Type exceptionType)
        {
            var cacheHandler = new Mock <ICacheHandler>();

            var searchService = new SearchService(searchEngineHandlers, cacheHandler.Object);

            if (exceptionType == null)
            {
                var result = await searchService.CheckWebsiteStatusAsync(request);

                Assert.Equal(response.ResultItems.Count(), result.ResultItems.Count());
            }
            else
            {
                await Assert.ThrowsAsync(exceptionType, () => searchService.CheckWebsiteStatusAsync(request));
            }
        }
Пример #5
0
        public async Task CheckWebsiteStatusCachingAsyncUnitTest(
            Mock <ISearchEngineHandler> searchEngineHandler,
            Mock <ICacheHandler> cacheHandler,
            CheckWebsiteStatusRequest request,
            bool isCached)
        {
            searchEngineHandler.Invocations.Clear();
            cacheHandler.Invocations.Clear();

            var searchService = new SearchService(
                new List <ISearchEngineHandler>()
            {
                searchEngineHandler.Object
            },
                cacheHandler.Object);

            await searchService.CheckWebsiteStatusAsync(request);

            cacheHandler.Verify(ch => ch.GetCacheObject <CheckWebsiteStatusResponse>(It.IsAny <string>()), Times.Once);

            if (isCached)
            {
                searchEngineHandler.Verify(h => h.SelectLinksAsync(It.IsAny <string>(), It.IsAny <int>()), Times.Never);

                cacheHandler.Verify(
                    ch => ch.SetCacheObject(It.IsAny <string>(), It.IsAny <CheckWebsiteStatusResponse>()),
                    Times.Never);
            }
            else
            {
                searchEngineHandler.Verify(h => h.SelectLinksAsync(It.IsAny <string>(), It.IsAny <int>()), Times.Once);

                cacheHandler.Verify(
                    ch => ch.SetCacheObject(It.IsAny <string>(), It.IsAny <CheckWebsiteStatusResponse>()),
                    Times.Once);
            }
        }
 public static string GenerateCacheKey(this CheckWebsiteStatusRequest request)
 {
     return($"{request.SearchEngine.TrimKeyPart()}_{request.Query.TrimKeyPart()}_{request.Link.TrimKeyPart()}");
 }