package com.github.obourgain.elasticsearch.http.handler.document;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.assertj.core.api.Assertions;
import org.assertj.core.data.MapEntry;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.search.lookup.SourceLookup;
import org.junit.Ignore;
import org.junit.Test;
import com.github.obourgain.elasticsearch.http.AbstractTest;
import com.github.obourgain.elasticsearch.http.response.ElasticsearchHttpException;
import com.github.obourgain.elasticsearch.http.handler.document.update.UpdateResponse;
public class UpdateActionHandlerTest extends AbstractTest {
@Test
public void should_update_document_with_doc() throws Exception {
BytesReference source = source().bytes();
Map<String, Object> expected = SourceLookup.sourceAsMap(source);
index(THE_INDEX, THE_TYPE, THE_ID, expected);
UpdateResponse updateResponse = httpClient.update(new UpdateRequest(THE_INDEX, THE_TYPE, THE_ID).doc(source.toBytes())).get();
Assertions.assertThat(updateResponse.getIndex()).isEqualTo(THE_INDEX);
Assertions.assertThat(updateResponse.getType()).isEqualTo(THE_TYPE);
Assertions.assertThat(updateResponse.getId()).isEqualTo(THE_ID);
Assertions.assertThat(updateResponse.getVersion()).isEqualTo(2);
Assertions.assertThat(updateResponse.isCreated()).isFalse();
}
@Test
public void should_upsert() throws Exception {
BytesReference source = source().bytes();
Map<String, Object> expected = SourceLookup.sourceAsMap(source);
UpdateResponse updateResponse = httpClient.update(new UpdateRequest(THE_INDEX, THE_TYPE, THE_ID)
.doc(source.toBytes())
.upsert(source.toBytes())
).get();
Assertions.assertThat(updateResponse.getIndex()).isEqualTo(THE_INDEX);
Assertions.assertThat(updateResponse.getType()).isEqualTo(THE_TYPE);
Assertions.assertThat(updateResponse.getId()).isEqualTo(THE_ID);
Assertions.assertThat(updateResponse.getVersion()).isEqualTo(1);
Assertions.assertThat(updateResponse.isCreated()).isTrue();
Map<String, Object> actualSource = get(THE_INDEX, THE_TYPE, THE_ID).getSource();
compareMap(expected, actualSource);
}
@Test
public void should_use_doc_as_upsert() throws Exception {
BytesReference source = source().bytes();
Map<String, Object> expected = SourceLookup.sourceAsMap(source);
UpdateRequest updateRequest = new UpdateRequest(THE_INDEX, THE_TYPE, THE_ID).doc(source.toBytes());
updateRequest.docAsUpsert(true);
UpdateResponse updateResponse = httpClient.update(updateRequest).get();
Assertions.assertThat(updateResponse.getIndex()).isEqualTo(THE_INDEX);
Assertions.assertThat(updateResponse.getType()).isEqualTo(THE_TYPE);
Assertions.assertThat(updateResponse.getId()).isEqualTo(THE_ID);
Assertions.assertThat(updateResponse.getVersion()).isEqualTo(1);
Assertions.assertThat(updateResponse.isCreated()).isTrue();
Map<String, Object> actualSource = get(THE_INDEX, THE_TYPE, THE_ID).getSource();
compareMap(expected, actualSource);
}
@Test
@Ignore("ElasticsearchIllegalArgumentException[script_lang not supported [groovy]]")
public void should_update_document_with_script() throws Exception {
BytesReference source = source().bytes();
Map<String, Object> expected = SourceLookup.sourceAsMap(source);
index(THE_INDEX, THE_TYPE, THE_ID, expected);
UpdateResponse updateResponse = httpClient.update(new UpdateRequest(THE_INDEX, THE_TYPE, THE_ID)
.script("ctx._source.new_fields = \"value\"")).get();
Assertions.assertThat(updateResponse.getIndex()).isEqualTo(THE_INDEX);
Assertions.assertThat(updateResponse.getType()).isEqualTo(THE_TYPE);
Assertions.assertThat(updateResponse.getId()).isEqualTo(THE_ID);
Assertions.assertThat(updateResponse.getVersion()).isEqualTo(2);
Assertions.assertThat(updateResponse.isCreated()).isFalse();
Map<String, Object> actualSource = get(THE_INDEX, THE_TYPE, THE_ID).getSource();
Assertions.assertThat(actualSource).contains(MapEntry.entry("actualSource", "value"));
}
@Test
public void should_not_update_document_when_version_does_not_match() throws Exception {
BytesReference source = source().bytes();
index(THE_INDEX, THE_TYPE, THE_ID, SourceLookup.sourceAsMap(source));
try {
httpClient.update(new UpdateRequest(THE_INDEX, THE_TYPE, THE_ID).doc(source.toBytes()).version(3)).get();
fail();
} catch (ExecutionException e) {
Assertions.assertThat(e).hasCauseInstanceOf(ElasticsearchHttpException.class);
Assertions.assertThat(e.getCause()).hasMessageStartingWith("status code 409");
Assertions.assertThat(e.getCause()).hasMessageContaining("VersionConflictEngineException");
}
}
}