public async Task Can_Select_Fastest_First()
        {
            // Arrange
            var results1 = new List <(string Title, string Url)> {
                ("new_t1", "new_u1"), ("new_t2", "new_u2")
            };
            var engineMock1 = CreateSearchEngine(results1, 200);

            var results2 = new List <(string Title, string Url)> {
                ("new2_t1", "new2_u1"), ("new2_t2", "new2_u2")
            };
            var engineMock2 = CreateSearchEngine(results2, 300);

            var searchEnginesFactory = new Mock <ISearchEnginesFactory>();

            searchEnginesFactory.Setup(x => x.Create())
            .Returns(() => new List <ISearchEngine> {
                engineMock1.Object, engineMock2.Object
            });

            // Act
            var contorller = new FastestResultSearchService(
                _searchRequestRepository,
                searchEnginesFactory.Object);
            var result = await contorller.Search("query");

            // Assert
            CollectionAssert.AreEqual(results1.Select(x => x.Title).ToList(), result.Select(x => x.Title).ToList());
            CollectionAssert.AreEqual(results1.Select(x => x.Url).ToList(), result.Select(x => x.Url).ToList());
        }
        public async Task Can_Save_To_Cache()
        {
            // Arrange
            var query   = "query";
            var results = new List <(string Title, string Url)> {
                ("new_t1", "new_u1"), ("new_t2", "new_u2")
            };
            var engineMock = CreateSearchEngine(results, 0);

            var searchEnginesFactory = new Mock <ISearchEnginesFactory>();

            searchEnginesFactory.Setup(x => x.Create())
            .Returns(() => new List <ISearchEngine> {
                engineMock.Object
            });

            // Act
            var contorller = new FastestResultSearchService(
                _searchRequestRepository,
                searchEnginesFactory.Object);
            var result = await contorller.Search(query);

            // Assert
            var savedRequest = await _searchRequestRepository.GetAsync(query);

            Assert.AreEqual(query, savedRequest.Query);
            CollectionAssert.AreEqual(results.Select(x => x.Title).ToList(),
                                      savedRequest.Results.Select(x => x.Title).ToList());
            CollectionAssert.AreEqual(results.Select(x => x.Url).ToList(),
                                      savedRequest.Results.Select(x => x.Url).ToList());
        }
        public async Task Can_Use_Cached_Result()
        {
            // Arrange
            var query           = "query";
            var newFoundResults = new List <(string Title, string Url)> {
                ("new_t1", "new_u1"), ("new_t2", "new_u2")
            };
            var engineMock = CreateSearchEngine(newFoundResults, 0);

            var searchEnginesFactory = new Mock <ISearchEnginesFactory>();

            searchEnginesFactory.Setup(x => x.Create())
            .Returns(() => new List <ISearchEngine> {
                engineMock.Object
            });

            var cachedResults = new List <(string Title, string Url)> {
                ("q1_t1", "q1_u1"), ("q1_t2", "q1_u2")
            };

            _searchRequestRepository.Add(
                new SearchRequest
                (
                    query: "query",
                    results: cachedResults.Select(x => new SearchResult(x.Title, x.Url)).ToList()
                ));

            // Act
            var contorller = new FastestResultSearchService(
                _searchRequestRepository,
                searchEnginesFactory.Object);
            var result = await contorller.Search(query);

            // Assert
            CollectionAssert.AreNotEqual(newFoundResults.Select(x => x.Title).ToList(), result.Select(x => x.Title).ToList());
            CollectionAssert.AreNotEqual(newFoundResults.Select(x => x.Url).ToList(), result.Select(x => x.Url).ToList());
            CollectionAssert.AreEqual(cachedResults.Select(x => x.Title).ToList(), result.Select(x => x.Title).ToList());
            CollectionAssert.AreEqual(cachedResults.Select(x => x.Url).ToList(), result.Select(x => x.Url).ToList());
        }