async public Task <IActionResult> SearchDatasetVersion(SearchModel searchModel)
        {
            if (searchModel == null || searchModel.PageNumber < 1 || searchModel.Top < 1)
            {
                _logger.Error("A null or invalid search model was provided for searching datasets");

                return(new BadRequestObjectResult("An invalid search model was provided"));
            }

            IDictionary <string, string[]> searchModelDictionary = searchModel.Filters;

            List <Filter> filters = searchModelDictionary.Select(keyValueFilterPair => new Filter(keyValueFilterPair.Key, keyValueFilterPair.Value, false, "eq")).ToList();

            FilterHelper filterHelper = new FilterHelper(filters);

            int skip = (searchModel.PageNumber - 1) * searchModel.Top;
            SearchParameters searchParameters = new SearchParameters()
            {
                Filter = filterHelper.BuildAndFilterQuery(),
                IncludeTotalResultCount = true,
                OrderBy = new[] { "version desc" },
                Skip    = skip,
                Top     = searchModel.Top
            };

            SearchResults <DatasetVersionIndex> searchResults = await _searchVersionRepository.Search(searchModel.SearchTerm, searchParameters);

            DatasetVersionSearchResults datasetVersionSearchResults = new DatasetVersionSearchResults()
            {
                TotalCount = (int)(searchResults?.TotalCount ?? 0),
                Results    = searchResults.Results.Select(ConvertToDatasetVersionSearchResult)
            };

            return(new OkObjectResult(datasetVersionSearchResults));
        }
        public async Task SearchDatasetVersion_GivenValidParameters_ShouldReturnOkResult()
        {
            // Arrange
            SearchModel model = new SearchModel
            {
                PageNumber    = 10,
                Top           = 50,
                IncludeFacets = false
            };

            string blobName = "v1/Pe and sports Data.xlsx";

            SearchResults <DatasetVersionIndex> mockSearchResults = new SearchResults <DatasetVersionIndex>();

            mockSearchResults.Results = new List <Repositories.Common.Search.SearchResult <DatasetVersionIndex> >()
            {
                CreateDatasetVersionResult(new DatasetVersionIndex()
                {
                    Id                = "df073a02-bbc5-44ee-a84b-5931c6e7cf1e-v1",
                    Name              = "Pe and sports Data",
                    Version           = 1,
                    BlobName          = blobName,
                    DefinitionName    = "PSG",
                    DatasetId         = "df073a02-bbc5-44ee-a84b-5931c6e7cf1e",
                    Description       = "150 rows starting",
                    LastUpdatedByName = "James",
                    LastUpdatedDate   = new DateTime(2019, 1, 1),
                    FundingStreamId   = "DSG",
                    FundingStreamName = "Dedicated schools grant"
                })
            };

            ISearchRepository <DatasetVersionIndex> mockDatasetVersionIndexRepository = CreateDatasetVersionSearchRepository();

            mockDatasetVersionIndexRepository.Search(Arg.Any <string>(), Arg.Any <SearchParameters>()).Returns(mockSearchResults);
            DatasetSearchService service = CreateDatasetSearchService(searchRepositoryDatasetVersion: mockDatasetVersionIndexRepository);

            // Act
            IActionResult actionResult = await service.SearchDatasetVersion(model);

            // Assert
            actionResult.Should().BeOfType <OkObjectResult>();

            OkObjectResult objectResult = actionResult as OkObjectResult;
            DatasetVersionSearchResults datasetVersionSearchResults = objectResult.Value as DatasetVersionSearchResults;

            datasetVersionSearchResults.Results.Count().Should().Be(1);

            DatasetVersionSearchResult datasetVersionSearchResult = datasetVersionSearchResults.Results.First();

            datasetVersionSearchResult.Id.Should().Be("df073a02-bbc5-44ee-a84b-5931c6e7cf1e-v1");
            datasetVersionSearchResult.Name.Should().Be("Pe and sports Data");
            datasetVersionSearchResult.Version.Should().Be(1);
            datasetVersionSearchResult.BlobName.Should().Be(blobName);
            datasetVersionSearchResult.DefinitionName.Should().Be("PSG");
            datasetVersionSearchResult.DatasetId.Should().Be("df073a02-bbc5-44ee-a84b-5931c6e7cf1e");
            datasetVersionSearchResult.Description.Should().Be("150 rows starting");
            datasetVersionSearchResult.LastUpdatedByName.Should().Be("James");
            datasetVersionSearchResult.LastUpdatedDate.Should().Be(new DateTime(2019, 1, 1));
            datasetVersionSearchResult.FundingStreamId.Should().Be("DSG");
            datasetVersionSearchResult.FundingStreamName.Should().Be("Dedicated schools grant");
        }
        public async Task SearchDatasetVersion_GivenValidParameters_ShouldReturnOkResult()
        {
            // Arrange
            SearchModel model = new SearchModel
            {
                PageNumber    = 10,
                Top           = 50,
                IncludeFacets = false
            };

            string blobName = "v1/Pe and sports Data.xlsx";

            string json = JsonConvert.SerializeObject(model);

            byte[]       byteArray = Encoding.UTF8.GetBytes(json);
            MemoryStream stream    = new MemoryStream(byteArray);

            HttpRequest request = Substitute.For <HttpRequest>();

            request
            .Body
            .Returns(stream);

            SearchResults <DatasetVersionIndex> mockSearchResults = new SearchResults <DatasetVersionIndex>();

            mockSearchResults.Results = new List <Repositories.Common.Search.SearchResult <DatasetVersionIndex> >()
            {
                CreateDatasetVersionResult(new DatasetVersionIndex()
                {
                    Id                = "df073a02-bbc5-44ee-a84b-5931c6e7cf1e-v1",
                    Name              = "Pe and sports Data",
                    Version           = 1,
                    BlobName          = blobName,
                    DefinitionName    = "PSG",
                    DatasetId         = "df073a02-bbc5-44ee-a84b-5931c6e7cf1e",
                    Description       = "150 rows starting",
                    LastUpdatedByName = "James",
                    LastUpdatedDate   = new DateTime(2019, 1, 1)
                })
            };

            ISearchRepository <DatasetVersionIndex> mockDatasetVersionIndexRepository = CreateDatasetVersionSearchRepository();

            mockDatasetVersionIndexRepository.Search(Arg.Any <string>(), Arg.Any <SearchParameters>()).Returns(mockSearchResults);
            DatasetSearchService service = CreateDatasetSearchService(searchRepositoryDatasetVersion: mockDatasetVersionIndexRepository);

            // Act
            IActionResult actionResult = await service.SearchDatasetVersion(request);

            // Assert
            actionResult.Should().BeOfType <OkObjectResult>();

            OkObjectResult objectResult = actionResult as OkObjectResult;
            DatasetVersionSearchResults datasetVersionSearchResults = objectResult.Value as DatasetVersionSearchResults;

            datasetVersionSearchResults.Results.Count().Should().Be(1);

            DatasetVersionSearchResult datasetVersionSearchResult = datasetVersionSearchResults.Results.First();

            datasetVersionSearchResult.Id.Should().Be("df073a02-bbc5-44ee-a84b-5931c6e7cf1e-v1");
            datasetVersionSearchResult.Name.Should().Be("Pe and sports Data");
            datasetVersionSearchResult.Version.Should().Be(1);
            datasetVersionSearchResult.BlobName.Should().Be(blobName);
            datasetVersionSearchResult.DefinitionName.Should().Be("PSG");
            datasetVersionSearchResult.DatasetId.Should().Be("df073a02-bbc5-44ee-a84b-5931c6e7cf1e");
            datasetVersionSearchResult.Description.Should().Be("150 rows starting");
            datasetVersionSearchResult.LastUpdatedByName.Should().Be("James");
            datasetVersionSearchResult.LastUpdatedDate.Should().Be(new DateTime(2019, 1, 1));
        }