package io.searchbox.core;
import com.google.gson.Gson;
import com.google.gson.JsonParser;
import io.searchbox.annotations.JestId;
import io.searchbox.annotations.JestVersion;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.*;
/**
* @author cihat keser
*/
public class SearchResultTest {
String json = "{\n" +
" \"_shards\":{\n" +
" \"total\" : 5,\n" +
" \"successful\" : 5,\n" +
" \"failed\" : 0\n" +
" },\n" +
" \"hits\":{\n" +
" \"total\" : 1,\n" +
" \"hits\" : [\n" +
" {\n" +
" \"_index\" : \"twitter\",\n" +
" \"_type\" : \"tweet\",\n" +
" \"_id\" : \"1\",\n" +
" \"_source\" : {\n" +
" \"user\" : \"kimchy\",\n" +
" \"postDate\" : \"2009-11-15T14:12:12\",\n" +
" \"message\" : \"trying out Elasticsearch\"\n" +
" },\n" +
" \"sort\" : [\n" +
" 1234.5678\n" +
" ]\n" +
" }\n" +
" ]\n" +
" }\n" +
"}";
@Test
public void testGetMaxScoreWhenMissing() {
SearchResult searchResult = new SearchResult(new Gson());
searchResult.setSucceeded(true);
searchResult.setJsonString(json);
searchResult.setJsonObject(new JsonParser().parse(json).getAsJsonObject());
searchResult.setPathToResult("hits/hits/_source");
Float maxScore = searchResult.getMaxScore();
assertNull(maxScore);
}
@Test
public void testGetMaxScore() {
String jsonWithMaxScore = "{\n" +
" \"_shards\":{\n" +
" \"total\" : 5,\n" +
" \"successful\" : 5,\n" +
" \"failed\" : 0\n" +
" },\n" +
" \"hits\":{\n" +
" \"max_score\" : 0.028130025,\n" +
" \"total\" : 1,\n" +
" \"hits\" : [\n" +
" {\n" +
" \"_index\" : \"twitter\",\n" +
" \"_type\" : \"tweet\",\n" +
" \"_id\" : \"1\",\n" +
" \"_source\" : {\n" +
" \"user\" : \"kimchy\",\n" +
" \"postDate\" : \"2009-11-15T14:12:12\",\n" +
" \"message\" : \"trying out Elasticsearch\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
"}";
SearchResult searchResult = new SearchResult(new Gson());
searchResult.setSucceeded(true);
searchResult.setJsonString(jsonWithMaxScore);
searchResult.setJsonObject(new JsonParser().parse(jsonWithMaxScore).getAsJsonObject());
searchResult.setPathToResult("hits/hits/_source");
Float maxScore = searchResult.getMaxScore();
assertNotNull(maxScore);
assertEquals(new Float("0.028130025"), maxScore);
}
@Test
public void testGetTotal() {
SearchResult searchResult = new SearchResult(new Gson());
searchResult.setSucceeded(true);
searchResult.setJsonString(json);
searchResult.setJsonObject(new JsonParser().parse(json).getAsJsonObject());
searchResult.setPathToResult("hits/hits/_source");
Integer total = searchResult.getTotal();
assertNotNull(total);
assertEquals(new Integer(1), total);
}
@Test
public void testGetTotalWhenTotalMissing() {
String jsonWithoutTotal = "{\n" +
" \"_shards\":{\n" +
" \"total\" : 5,\n" +
" \"successful\" : 5,\n" +
" \"failed\" : 0\n" +
" },\n" +
" \"hits\":{\n" +
" \"hits\" : [\n" +
" {\n" +
" \"_index\" : \"twitter\",\n" +
" \"_type\" : \"tweet\",\n" +
" \"_id\" : \"1\",\n" +
" \"_source\" : {\n" +
" \"user\" : \"kimchy\",\n" +
" \"postDate\" : \"2009-11-15T14:12:12\",\n" +
" \"message\" : \"trying out Elasticsearch\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
"}";
SearchResult searchResult = new SearchResult(new Gson());
searchResult.setSucceeded(true);
searchResult.setJsonString(jsonWithoutTotal);
searchResult.setJsonObject(new JsonParser().parse(jsonWithoutTotal).getAsJsonObject());
searchResult.setPathToResult("hits/hits/_source");
Integer total = searchResult.getTotal();
assertNull(total);
}
@Test
public void testGetHits() {
SearchResult searchResult = new SearchResult(new Gson());
searchResult.setSucceeded(true);
searchResult.setJsonString(json);
searchResult.setJsonObject(new JsonParser().parse(json).getAsJsonObject());
searchResult.setPathToResult("hits/hits/_source");
List hits = searchResult.getHits(Object.class);
assertNotNull(hits);
assertFalse("should have 1 hit", hits.isEmpty());
hits = searchResult.getHits(Object.class, Object.class);
assertNotNull(hits);
assertFalse("should have 1 hit", hits.isEmpty());
}
@Test
public void testGetFirstHit() {
SearchResult searchResult = new SearchResult(new Gson());
searchResult.setSucceeded(true);
searchResult.setJsonString(json);
searchResult.setJsonObject(new JsonParser().parse(json).getAsJsonObject());
searchResult.setPathToResult("hits/hits/_source");
SearchResult.Hit hit = searchResult.getFirstHit(Object.class);
assertNotNull(hit);
assertNotNull(hit.source);
assertNull(hit.explanation);
assertNotNull(hit.sort);
assertNotNull(hit.id);
assertNull(hit.score);
hit = searchResult.getFirstHit(Object.class, Object.class);
assertNotNull(hit);
assertNotNull(hit.source);
assertNull(hit.explanation);
assertNotNull(hit.sort);
assertNotNull(hit.id);
assertNull(hit.score);
}
@Test
public void testGetHitsWhenOperationFails() {
SearchResult searchResult = new SearchResult(new Gson());
searchResult.setSucceeded(false);
List hits = searchResult.getHits(Object.class);
assertNotNull(hits);
assertTrue(hits.isEmpty());
hits = searchResult.getHits(Object.class, Object.class);
assertNotNull(hits);
assertTrue(hits.isEmpty());
}
@Test
public void testGetFirstHitWhenOperationFails() {
SearchResult searchResult = new SearchResult(new Gson());
searchResult.setSucceeded(false);
SearchResult.Hit hit = searchResult.getFirstHit(Object.class);
assertNull(hit);
hit = searchResult.getFirstHit(Object.class, Object.class);
assertNull(hit);
}
@Test
public void testGetScore() {
String jsonWithScore = "{\n" +
" \"_shards\":{\n" +
" \"total\" : 5,\n" +
" \"successful\" : 5,\n" +
" \"failed\" : 0\n" +
" },\n" +
" \"hits\":{\n" +
" \"total\" : 1,\n" +
" \"hits\" : [\n" +
" {\n" +
" \"_index\" : \"twitter\",\n" +
" \"_type\" : \"tweet\",\n" +
" \"_score\" : \"1.02332\",\n" +
" \"_id\" : \"1\",\n" +
" \"_source\" : {\n" +
" \"user\" : \"kimchy\",\n" +
" \"postDate\" : \"2009-11-15T14:12:12\",\n" +
" \"message\" : \"trying out Elasticsearch\"\n" +
" },\n" +
" \"sort\" : [\n" +
" 1234.5678\n" +
" ]\n" +
" }\n" +
" ]\n" +
" }\n" +
"}";
SearchResult searchResult = new SearchResult(new Gson());
searchResult.setSucceeded(true);
searchResult.setJsonString(jsonWithScore);
searchResult.setJsonObject(new JsonParser().parse(jsonWithScore).getAsJsonObject());
searchResult.setPathToResult("hits/hits/_source");
SearchResult.Hit hit = searchResult.getFirstHit(Object.class);
assertNotNull(hit);
assertNotNull(hit.source);
assertNull(hit.explanation);
assertNotNull(hit.sort);
assertNotNull(hit.id);
assertNotNull(hit.score);
hit = searchResult.getFirstHit(Object.class, Object.class);
assertNotNull(hit);
assertNotNull(hit.source);
assertNull(hit.explanation);
assertNotNull(hit.sort);
assertNotNull(hit.id);
assertNotNull(hit.score);
}
@Test
public void testGetVersion() {
Long someVersion = Integer.MAX_VALUE + 10L;
String jsonWithVersion = "{\n" +
" \"_shards\":{\n" +
" \"total\" : 5,\n" +
" \"successful\" : 5,\n" +
" \"failed\" : 0\n" +
" },\n" +
" \"hits\":{\n" +
" \"total\" : 1,\n" +
" \"hits\" : [\n" +
" {\n" +
" \"_index\" : \"twitter\",\n" +
" \"_type\" : \"tweet\",\n" +
" \"_score\" : \"1.02332\",\n" +
" \"_id\" : \"1\",\n" +
" \"_version\" : \"" + someVersion + "\",\n" +
" \"_source\" : {\n" +
" \"user\" : \"kimchy\",\n" +
" \"postDate\" : \"2009-11-15T14:12:12\",\n" +
" \"message\" : \"trying out Elasticsearch\"\n" +
" },\n" +
" \"sort\" : [\n" +
" 1234.5678\n" +
" ]\n" +
" }\n" +
" ]\n" +
" }\n" +
"}";
SearchResult searchResult = new SearchResult(new Gson());
searchResult.setSucceeded(true);
searchResult.setJsonString(jsonWithVersion);
searchResult.setJsonObject(new JsonParser().parse(jsonWithVersion).getAsJsonObject());
searchResult.setPathToResult("hits/hits/_source");
SearchResult.Hit<TestObject, Void> hit = searchResult.getFirstHit(TestObject.class);
assertNotNull(hit.source);
assertNull(hit.explanation);
assertNotNull(hit.sort);
assertNotNull(hit.score);
assertEquals("Incorrect version", someVersion, hit.source.getVersion());
}
class TestObject {
@JestId
private String id;
@JestVersion
private Long version;
public TestObject() {}
public Long getVersion() {
return version;
}
public String getId() {
return id;
}
}
}