package com.github.obourgain.elasticsearch.http.handler.document; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import org.assertj.core.api.Assertions; import org.elasticsearch.action.get.MultiGetRequest; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.search.fetch.source.FetchSourceContext; import org.elasticsearch.search.lookup.SourceLookup; import org.junit.Test; import com.github.obourgain.elasticsearch.http.AbstractTest; import com.github.obourgain.elasticsearch.http.handler.document.multiget.MultiGetResponse; import com.github.obourgain.elasticsearch.http.handler.document.multiget.MultiGetResponseError; public class MultiGetActionHandlerTest extends AbstractTest { @Test public void should_get_document() throws IOException, ExecutionException, InterruptedException { BytesReference source = source().bytes(); Map<String, Object> expected = SourceLookup.sourceAsMap(source); createDoc(THE_INDEX, THE_TYPE, THE_ID, source.toUtf8()); MultiGetRequest multiGetRequest = new MultiGetRequest().add(THE_INDEX, THE_TYPE, THE_ID); MultiGetResponse response = httpClient.multiGet(multiGetRequest).get(); Assertions.assertThat(response.all()).hasSize(1); Assertions.assertThat(response.errors()).hasSize(0); compareMap(expected, response.documents().get(0).getSource()); } @Test public void should_get_several_documents() throws IOException, ExecutionException, InterruptedException { BytesReference source = source().bytes(); createDoc(THE_INDEX, THE_TYPE, THE_ID, source.toUtf8()); createDoc(THE_INDEX, THE_TYPE, "2", source.toUtf8()); createDoc(THE_INDEX, THE_TYPE, "3", source.toUtf8()); MultiGetRequest multiGetRequest = new MultiGetRequest() .add(THE_INDEX, THE_TYPE, THE_ID) .add(THE_INDEX, THE_TYPE, "2") .add(THE_INDEX, THE_TYPE, "3"); MultiGetResponse response = httpClient.multiGet(multiGetRequest).get(); Assertions.assertThat(response.all()).hasSize(3); Assertions.assertThat(response.errors()).hasSize(0); Assertions.assertThat(response.documents().get(0).getId()).isEqualTo(THE_ID); Assertions.assertThat(response.documents().get(1).getId()).isEqualTo("2"); Assertions.assertThat(response.documents().get(2).getId()).isEqualTo("3"); } @Test public void should_get_documents_without_source() throws IOException, ExecutionException, InterruptedException { BytesReference source = source().bytes(); createDoc(THE_INDEX, THE_TYPE, THE_ID, source.toUtf8()); MultiGetRequest.Item item = new MultiGetRequest.Item(THE_INDEX, THE_TYPE, THE_ID).fields("the_string_field").fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE); MultiGetRequest multiGetRequest = new MultiGetRequest().add(item); MultiGetResponse response = httpClient.multiGet(multiGetRequest).get(); Assertions.assertThat(response.all()).hasSize(1); Assertions.assertThat(response.errors()).hasSize(0); Assertions.assertThat(response.documents().get(0).getSource()).isNull(); Assertions.assertThat(response.documents().get(0).getFields()).hasSize(1).containsKey("the_string_field"); } @Test public void should_get_document_version() throws IOException, ExecutionException, InterruptedException { BytesReference source = source().bytes(); createDoc(THE_INDEX, THE_TYPE, THE_ID, source.toUtf8()); createDoc(THE_INDEX, THE_TYPE, THE_ID, source.toUtf8()); MultiGetRequest.Item item = new MultiGetRequest.Item(THE_INDEX, THE_TYPE, THE_ID) .version(2) .fields("the_string_field") .fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE); MultiGetRequest multiGetRequest = new MultiGetRequest().add(item); MultiGetResponse response = httpClient.multiGet(multiGetRequest).get(); Assertions.assertThat(response.all()).hasSize(1); Assertions.assertThat(response.errors()).hasSize(0); Assertions.assertThat(response.documents().get(0).getVersion()).isEqualTo(2); } @Test public void should_fail_when_version_different() throws IOException, InterruptedException, ExecutionException { BytesReference source = source().bytes(); createDoc(THE_INDEX, THE_TYPE, THE_ID, source.toUtf8()); createDoc(THE_INDEX, THE_TYPE, THE_ID, source.toUtf8()); MultiGetRequest.Item item = new MultiGetRequest.Item(THE_INDEX, THE_TYPE, THE_ID) .version(1) .fields("the_string_field") .fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE); MultiGetRequest multiGetRequest = new MultiGetRequest().add(item); MultiGetResponse response = httpClient.multiGet(multiGetRequest).get(); Assertions.assertThat(response.all()).hasSize(1); List<MultiGetResponseError> errors = response.errors(); Assertions.assertThat(errors).hasSize(1); Assertions.assertThat(errors.get(0).getIndex()).isEqualTo(THE_INDEX); Assertions.assertThat(errors.get(0).getType()).isEqualTo(THE_TYPE); Assertions.assertThat(errors.get(0).getId()).isEqualTo(THE_ID); Assertions.assertThat(errors.get(0).getError()).contains("VersionConflictEngineException[[the_index]") // skip the shard number .contains("[the_type][the_id]: version conflict, current [2], provided [1]]"); } }