diff --git a/server/src/test/java/org/elasticsearch/search/source/SourceFetchingIT.java b/server/src/test/java/org/elasticsearch/search/source/SourceFetchingIT.java index a7df3bc6883da..e7bec8bc1dd18 100644 --- a/server/src/test/java/org/elasticsearch/search/source/SourceFetchingIT.java +++ b/server/src/test/java/org/elasticsearch/search/source/SourceFetchingIT.java @@ -22,6 +22,10 @@ import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.test.ESIntegTestCase; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.IsEqual.equalTo; @@ -95,4 +99,35 @@ public void testSourceWithWildcardFiltering() { assertThat(response.getHits().getAt(0).getSourceAsMap().size(), equalTo(1)); assertThat((String) response.getHits().getAt(0).getSourceAsMap().get("field"), equalTo("value")); } + + public void testSourceFilteringWithJsonField() { + prepareCreate("test").addMapping("_doc", "headers", "type=json").get(); + ensureGreen(); + + Map headers = new HashMap<>(); + headers.put("content-type", "application/json"); + headers.put("origin", "https://www.elastic.co"); + Map source = Collections.singletonMap("headers", headers); + + client().prepareIndex("test", "_doc", "1").setSource(source).get(); + refresh(); + + SearchResponse response = client().prepareSearch("test").setFetchSource(true).get(); + assertThat(response.getHits().getAt(0).getSourceAsMap(), equalTo(source)); + + // Check 'include' filtering. + response = client().prepareSearch("test").setFetchSource("headers", null).get(); + assertThat(response.getHits().getAt(0).getSourceAsMap(), equalTo(source)); + + response = client().prepareSearch("test").setFetchSource("headers.content-type", null).get(); + Map filteredSource = Collections.singletonMap("headers", + Collections.singletonMap("content-type", "application/json")); + assertThat(response.getHits().getAt(0).getSourceAsMap(), equalTo(filteredSource)); + + // Check 'exclude' filtering. + response = client().prepareSearch("test").setFetchSource(null, "headers.content-type").get(); + filteredSource = Collections.singletonMap("headers", + Collections.singletonMap("origin", "https://www.elastic.co")); + assertThat(response.getHits().getAt(0).getSourceAsMap(), equalTo(filteredSource)); + } }