public void QueryEvaluationWithNoNullResponseThrowsInvalidOperationException()
        {
            using (var httpStub = new HttpStub(c => { }))
            {
                var context = MakeElasticContext(httpStub.Uri);

                Assert.Throws<InvalidOperationException>(() => context.Query<Robot>().FirstOrDefault());

                var request = httpStub.Requests.Single();
                Assert.Equal("POST", request.HttpMethod);
                Assert.Equal("/robots/_search", request.RawUrl);
            }
        }
        public void QueryEvaluationCausesPostToConnectionEndpoint()
        {
            using (var httpStub = new HttpStub(ZeroHits))
            {
                var context = MakeElasticContext(httpStub.Uri);

                var dummy = context.Query<Robot>().FirstOrDefault();

                var request = httpStub.Requests.Single();
                Assert.Equal("POST", request.HttpMethod);
                Assert.Equal("/robots/_search", request.RawUrl);
            }
        }
        public void ProviderExecuteTCausesPostToConnectionEndpoint()
        {
            using (var httpStub = new HttpStub(ZeroHits))
            {
                var provider = new ElasticQueryProvider(new ElasticConnection(httpStub.Uri), mapping, log, retryPolicy, "prefix");
                var query = new ElasticQuery<Robot>(provider);

                provider.Execute<IEnumerable<Robot>>(query.Expression);

                var request = httpStub.Requests.Single();
                Assert.Equal("POST", request.HttpMethod);
                Assert.Equal("/robots/_search", request.RawUrl);
            }
        }
        public async void AcceptEncodingIsGzip()
        {
            using(var httpStub = new HttpStub(ZeroHits, 1))
            {
                var context = MakeElasticContext(httpStub.Uri);

                var dummy = context.Query<Robot>().FirstOrDefault();
                Assert.Null(dummy);

                await httpStub.Completion;
                var request = httpStub.Requests.Single();
                Assert.Contains("Accept-Encoding", request.Headers.AllKeys);
                Assert.Equal("gzip", request.Headers["Accept-Encoding"]);
            }            
        }
        public async void ProviderExecuteCausesPostToConnectionEndpoint()
        {
            using (var httpStub = new HttpStub(ZeroHits, 1))
            {
                var provider = new ElasticQueryProvider(new ElasticConnection(httpStub.Uri), mapping, log, retryPolicy);
                var query = new ElasticQuery<Robot>(provider);

                provider.Execute(query.Expression);

                await httpStub.Completion;
                var request = httpStub.Requests.Single();
                Assert.Equal("POST", request.HttpMethod);
                Assert.Equal("/_all/robots/_search", request.RawUrl);
            }
        }
        public void QueryImplicitGetEnumeratorCausesConnection()
        {
            using (var httpStub = new HttpStub(ZeroHits))
            {
                var provider = new ElasticQueryProvider(new ElasticConnection(httpStub.Uri), mapping, log, retryPolicy, "prefix");
                var query = new ElasticQuery<Robot>(provider);

                var enumerator = query.GetEnumerator();

                var request = httpStub.Requests.Single();
                Assert.Equal("POST", request.HttpMethod);
                Assert.Equal("/robots/_search", request.RawUrl);
                Assert.NotNull(enumerator);
            }
        }
        public void ConstantFalseDoesNotCauseConnection()
        {
            using (var httpStub = new HttpStub(ZeroHits, 1))
            {
                var provider = new ElasticQueryProvider(new ElasticConnection(httpStub.Uri), mapping, log, retryPolicy, "prefix");
                var query = new ElasticQuery<Robot>(provider).Where(f => false);

                ((IEnumerable)query).GetEnumerator();

                Assert.Empty(httpStub.Requests);
            }
        }
        public async void QueryExplicitIEnumerableGetEnumeratorCausesConnection()
        {
            using (var httpStub = new HttpStub(ZeroHits, 1))
            {
                var provider = new ElasticQueryProvider(new ElasticConnection(httpStub.Uri), mapping, log, retryPolicy, "prefix");
                var query = new ElasticQuery<Robot>(provider);

                var enumerator = ((IEnumerable)query).GetEnumerator();

                await httpStub.Completion;
                var request = httpStub.Requests.Single();
                Assert.Equal("POST", request.HttpMethod);
                Assert.Equal("/_all/robots/_search", request.RawUrl);
                Assert.NotNull(enumerator);
            }
        }