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