private void AssertSearch(TraineeshipSearchRequestParameters parameters, string expectedJsonQuery)
        {
            var searchResponse = new Mock <ISearchResponse <TraineeshipSearchResult> >();

            searchResponse.Setup(s => s.Total).Returns(0);
            searchResponse.Setup(s => s.Documents).Returns(Enumerable.Empty <TraineeshipSearchResult>().ToList());

            Func <SearchDescriptor <TraineeshipSearchResult>, ISearchRequest> actualSearchDescriptorFunc = null;

            var mockClient = new Mock <IElasticClient>();

            mockClient.Setup(c => c.Search <TraineeshipSearchResult>(It.IsAny <Func <SearchDescriptor <TraineeshipSearchResult>, ISearchRequest> >()))
            .Callback <Func <SearchDescriptor <TraineeshipSearchResult>, ISearchRequest> >(d => actualSearchDescriptorFunc = d)
            .Returns(searchResponse.Object);

            var mockFactory = new Mock <IElasticClientFactory>();

            mockFactory.Setup(f => f.CreateClient(It.IsAny <Action <IApiCallDetails> >())).Returns(mockClient.Object);

            var mockLogger = new Mock <ILog>();

            var sut = new TraineeshipSearchClient(mockFactory.Object, "traineeships", mockLogger.Object);

            var response = sut.Search(parameters);

            var baseSearchDescriptor = new SearchDescriptor <TraineeshipSearchResult>();
            var query = actualSearchDescriptorFunc(baseSearchDescriptor);

            var elasticClient = new ElasticClient();
            var stream        = new MemoryStream();

            elasticClient.RequestResponseSerializer.Serialize(query, stream);
            var actualJsonQuery = System.Text.Encoding.UTF8.GetString(stream.ToArray());

            var actualJsonQueryJToken = JToken.Parse(actualJsonQuery);

            var expectedJsonQueryJToken = JToken.Parse(expectedJsonQuery);

            actualJsonQueryJToken.Should().BeEquivalentTo(expectedJsonQueryJToken);
        }
        public void GetAllVacancyIds_ShouldScrollResults()
        {
            const string expectedJsonQuery = "{\"from\":0,\"size\":100,\"query\":{\"match_all\":{}}}";

            var searchResponse = new Mock <ISearchResponse <TraineeshipSearchResult> >();

            searchResponse.Setup(s => s.ScrollId).Returns("scrollId-100");

            Func <SearchDescriptor <TraineeshipSearchResult>, ISearchRequest> actualSearchDescriptorFunc = null;

            var mockClient = new Mock <IElasticClient>();

            mockClient.Setup(c => c.Search <TraineeshipSearchResult>(It.IsAny <Func <SearchDescriptor <TraineeshipSearchResult>, ISearchRequest> >()))
            .Callback <Func <SearchDescriptor <TraineeshipSearchResult>, ISearchRequest> >(d => actualSearchDescriptorFunc = d)
            .Returns(searchResponse.Object);

            var scrollResponse1 = new Mock <ISearchResponse <TraineeshipSearchResult> >();

            scrollResponse1.Setup(r => r.Documents)
            .Returns(new List <TraineeshipSearchResult>
            {
                new TraineeshipSearchResult {
                    Id = 3
                },
                new TraineeshipSearchResult {
                    Id = 4
                }
            });

            var scrollResponse2 = new Mock <ISearchResponse <TraineeshipSearchResult> >();

            scrollResponse2.Setup(r => r.Documents)
            .Returns(new List <TraineeshipSearchResult>
            {
                new TraineeshipSearchResult {
                    Id = 5
                },
                new TraineeshipSearchResult {
                    Id = 6
                }
            });

            var scrollResponse3 = new Mock <ISearchResponse <TraineeshipSearchResult> >();

            scrollResponse3.Setup(r => r.Documents)
            .Returns(Enumerable.Empty <TraineeshipSearchResult>().ToList());

            mockClient.SetupSequence(c => c.Scroll <TraineeshipSearchResult>(It.Is <ScrollRequest>(r => r.ScrollId == "scrollId-100")))
            .Returns(scrollResponse1.Object)
            .Returns(scrollResponse2.Object)
            .Returns(scrollResponse3.Object);

            var mockFactory = new Mock <IElasticClientFactory>();

            mockFactory.Setup(f => f.CreateClient(It.IsAny <Action <IApiCallDetails> >())).Returns(mockClient.Object);

            var mockLogger = new Mock <ILog>();

            var sut = new TraineeshipSearchClient(mockFactory.Object, "traineeships", mockLogger.Object);

            var actualResponse = sut.GetAllVacancyIds().ToList();

            var baseSearchDescriptor = new SearchDescriptor <TraineeshipSearchResult>();
            var query = actualSearchDescriptorFunc(baseSearchDescriptor);

            var elasticClient = new ElasticClient();
            var stream        = new MemoryStream();

            elasticClient.RequestResponseSerializer.Serialize(query, stream);
            var actualJsonQuery = System.Text.Encoding.UTF8.GetString(stream.ToArray());

            var actualJsonQueryJToken = JToken.Parse(actualJsonQuery);

            var expectedJsonQueryJToken = JToken.Parse(expectedJsonQuery);

            actualResponse.Count.Should().Be(4);
            actualResponse[0].Should().Be(3);
            actualResponse[1].Should().Be(4);
            actualResponse[2].Should().Be(5);
            actualResponse[3].Should().Be(6);

            actualJsonQueryJToken.Should().BeEquivalentTo(expectedJsonQueryJToken);

            mockClient.Verify(c => c.Scroll <TraineeshipSearchResult>(It.IsAny <ScrollRequest>()), Times.Exactly(3));
        }