package io.searchbox.action; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonSyntaxException; import io.searchbox.annotations.JestId; import io.searchbox.client.JestResult; import io.searchbox.core.Delete; import io.searchbox.core.Get; import io.searchbox.core.Index; import io.searchbox.core.Update; import io.searchbox.indices.Flush; import org.junit.Test; import static org.junit.Assert.*; /** * @author Dogukan Sonmez */ public class AbstractActionTest { @Test public void buildRestUrlWithValidParameters() { String expected = "twitter/tweet/1"; String actual = new Delete.Builder("1").index("twitter").type("tweet").build().buildURI(); assertEquals(expected, actual); } @Test public void buildUrlWithRequestParameterWithMultipleValues() { Action dummyAction = new DummyAction.Builder() .setParameter("x", "y") .setParameter("x", "z") .setParameter("x", "q") .setParameter("w", "p") .build(); assertEquals("?x=y&x=z&x=q&w=p", dummyAction.getURI()); } @Test public void testEqualsAndHashcode() { Action dummyAction1 = new DummyAction.Builder() .setParameter("x", "y") .setParameter("x", "z") .setHeader("X-Custom-Header", "hatsune") .build(); Action dummyAction2 = new DummyAction.Builder() .setParameter("x", "y") .setParameter("x", "z") .setHeader("X-Custom-Header", "hatsune") .build(); Action dummyAction3 = new DummyAction.Builder() .setParameter("x", "1") .setParameter("x", "z") .setHeader("X-Custom_Header", "hatsune") .build(); Action flush = new Flush.Builder().build(); assertTrue(dummyAction1.equals(dummyAction2)); assertTrue(dummyAction2.equals(dummyAction1)); assertEquals(dummyAction1, dummyAction2); assertEquals(dummyAction1.hashCode(), dummyAction2.hashCode()); assertFalse(dummyAction3.equals(dummyAction1)); assertFalse(dummyAction3.equals(dummyAction2)); assertFalse(dummyAction1.equals(dummyAction3)); assertFalse(dummyAction2.equals(dummyAction3)); assertNotEquals(dummyAction1.hashCode(), dummyAction3.hashCode()); assertNotEquals(dummyAction2.hashCode(), dummyAction3.hashCode()); assertFalse(dummyAction1.equals(flush)); assertFalse(dummyAction2.equals(flush)); assertFalse(dummyAction3.equals(flush)); assertNotEquals(dummyAction1.hashCode(), flush.hashCode()); assertNotEquals(dummyAction2.hashCode(), flush.hashCode()); assertNotEquals(dummyAction3.hashCode(), flush.hashCode()); } @Test public void restMethodNameMultipleClientRequest() { Get get = new Get.Builder("twitter", "1").type("tweet").build(); assertEquals("GET", get.getRestMethodName()); Delete del = new Delete.Builder("1").index("twitter").type("tweet").build(); assertEquals("DELETE", del.getRestMethodName()); assertEquals("GET", get.getRestMethodName()); } @Test public void requestDataMultipleClientRequest() { Index indexDocument = new Index.Builder("\"indexDocumentData\"").index("index").type("type").id("id").build(); Update update = new Update.Builder("\"updateData\"").index("indexName").type("indexType").id("1").build(); assertEquals("\"updateData\"", update.getData(null).toString()); assertEquals("POST", update.getRestMethodName()); assertEquals("indexName/indexType/1/_update", update.getURI()); assertEquals("\"indexDocumentData\"", indexDocument.getData(null).toString()); assertEquals("PUT", indexDocument.getRestMethodName()); assertEquals("index/type/id", indexDocument.getURI()); } @Test public void getIdFromNullSource() { String expected = null; String actual = AbstractAction.getIdFromSource(null); assertEquals(expected, actual); } @Test public void getIdFromSourceWithoutAnnotation() { String expected = null; String actual = AbstractAction.getIdFromSource("JEST"); assertEquals(expected, actual); } @Test public void getIdFromSourceWithAnnotation() { String expected = "jest@searchbox.io"; String actual = AbstractAction.getIdFromSource(new Source("data", "jest@searchbox.io")); assertEquals(expected, actual); } @Test public void getIdFromSourceWithAnnotationWithNullId() { String expected = null; String actual = AbstractAction.getIdFromSource(new Source("data", null)); assertEquals(expected, actual); } static class DummyAction extends GenericResultAbstractAction { public DummyAction(Builder builder) { super(builder); setURI(buildURI()); } @Override public String getRestMethodName() { return "GET"; } public static class Builder extends AbstractAction.Builder<DummyAction, Builder> { @Override public DummyAction build() { return new DummyAction(this); } } } @Test public void convertJsonStringToMapObject() { String json = "{\n" + " \"ok\" : true,\n" + " \"_index\" : \"twitter\",\n" + " \"_type\" : \"tweet\",\n" + " \"_id\" : \"1\"\n" + "}"; JsonObject jsonMap = new DummyAction.Builder().build().parseResponseBody(json); assertNotNull(jsonMap); assertEquals(4, jsonMap.entrySet().size()); assertEquals(true, jsonMap.get("ok").getAsBoolean()); assertEquals("twitter", jsonMap.get("_index").getAsString()); assertEquals("tweet", jsonMap.get("_type").getAsString()); assertEquals("1", jsonMap.get("_id").getAsString()); } @Test public void convertEmptyJsonStringToMapObject() { JsonObject jsonMap = new DummyAction.Builder().build().parseResponseBody(""); assertNotNull(jsonMap); } @Test public void convertNullJsonStringToMapObject() { JsonObject jsonMap = new DummyAction.Builder().build().parseResponseBody(null); assertNotNull(jsonMap); } @Test(expected = JsonSyntaxException.class) public void propagateExceptionWhenTheResponseIsNotJson1() { new DummyAction.Builder().build().parseResponseBody("401 Unauthorized"); } @Test(expected = JsonSyntaxException.class) public void propagateExceptionWhenTheResponseIsNotJson2() { new DummyAction.Builder().build().parseResponseBody("banana"); } @Test public void getSuccessIndexResult() { String jsonString = "{\n" + " \"ok\" : true,\n" + " \"_index\" : \"twitter\",\n" + " \"_type\" : \"tweet\",\n" + " \"_id\" : \"1\"\n" + "}\n"; Index index = new Index.Builder("{\"abc\":\"dce\"}").index("test").build(); JestResult result = index.createNewElasticSearchResult(jsonString, 200, null, new Gson()); assertTrue(result.getErrorMessage(), result.isSucceeded()); assertEquals(200, result.getResponseCode()); } @Test public void getFailedIndexResult() { String jsonString = "{\"error\":\"Invalid index\",\"status\":400}"; Index index = new Index.Builder("{\"abc\":\"dce\"}").index("test").build(); JestResult result = index.createNewElasticSearchResult(jsonString, 400, null, new Gson()); assertFalse(result.isSucceeded()); assertEquals("\"Invalid index\"", result.getErrorMessage()); } @Test public void getSuccessDeleteResult() { String jsonString = "{\n" + " \"ok\" : true,\n" + " \"_index\" : \"twitter\",\n" + " \"_type\" : \"tweet\",\n" + " \"_id\" : \"1\",\n" + " \"found\" : true\n" + "}\n"; Delete delete = new Delete.Builder("1").index("twitter").type("tweet").build(); JestResult result = delete.createNewElasticSearchResult(jsonString, 200, null, new Gson()); assertTrue(result.getErrorMessage(), result.isSucceeded()); } //TODO: This cannot be derived from the result anymore @Test public void getFailedDeleteResult() { String jsonString = "{\n" + " \"_index\" : \"twitter\",\n" + " \"_type\" : \"tweet\",\n" + " \"_id\" : \"1\",\n" + " \"found\" : false\n" + "}\n"; Delete delete = new Delete.Builder("1").index("test").type("tweet").build(); JestResult result = delete.createNewElasticSearchResult(jsonString, 404, null, new Gson()); assertFalse(result.isSucceeded()); } @Test public void getSuccessGetResult() { String jsonString = "{" + " \"_index\" : \"twitter\"," + " \"_type\" : \"tweet\"," + " \"_id\" : \"1\"," + " \"exists\" : true" + "}"; Get get = new Get.Builder("test", "1").build(); JestResult result = get.createNewElasticSearchResult(jsonString, 200, null, new Gson()); assertTrue(result.getErrorMessage(), result.isSucceeded()); } class Source { @JestId String email; String data; Source(String data, String email) { this.data = data; this.email = email; } } }