package com.github.obourgain.elasticsearch.http.response.entity; import static com.github.obourgain.elasticsearch.http.TestFilesUtils.readFromClasspath; import static net.javacrumbs.jsonunit.fluent.JsonFluentAssert.assertThatJson; import static org.assertj.core.api.Assertions.assertThat; import java.io.IOException; import java.util.List; import org.assertj.core.data.Offset; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentParser; import org.junit.Test; public class HitTest { @Test public void should_parse_hit() throws IOException { String json = readFromClasspath("json/entity/hit.json"); String source = readFromClasspath("json/entity/source.json"); XContentParser parser = XContentHelper.createParser(json.getBytes(), 0, json.length()); parser.nextToken(); Hit hit = new Hit().parse(parser); assertThat(hit.getId()).isEqualTo("1"); assertThat(hit.getType()).isEqualTo("tweet"); assertThat(hit.getIndex()).isEqualTo("twitter"); assertThat(hit.getScore()).isEqualTo(1.7f, Offset.offset(0.01f)); assertThatJson(new String(hit.getSource())).isEqualTo(source); } @Test public void should_parse_array_of_hits() throws IOException { String json = readFromClasspath("json/entity/hit_array.json"); String source = readFromClasspath("json/entity/source.json"); XContentParser parser = XContentHelper.createParser(json.getBytes(), 0, json.length()); parser.nextToken(); List<Hit> hits = Hit.parseHitArray(parser); assertThat(hits).hasSize(2); Hit hit = hits.get(0); assertThat(hit.getId()).isEqualTo("1"); assertThat(hit.getType()).isEqualTo("tweet"); assertThat(hit.getIndex()).isEqualTo("twitter"); assertThat(hit.getScore()).isEqualTo(1.7f, Offset.offset(0.01f)); assertThatJson(new String(hit.getSource())).isEqualTo(source); Hit hit2 = hits.get(1); assertThat(hit2.getId()).isEqualTo("2"); assertThat(hit2.getType()).isEqualTo("tweet"); assertThat(hit2.getIndex()).isEqualTo("twitter"); } @Test public void should_parse_hit_with_highlights() throws Exception { String json = readFromClasspath("json/entity/hit_with_highlight.json"); XContentParser parser = XContentHelper.createParser(json.getBytes(), 0, json.length()); parser.nextToken(); Hit hit = new Hit().parse(parser); assertThat(hit.getId()).isEqualTo("2"); assertThat(hit.getType()).isEqualTo("tweet"); assertThat(hit.getIndex()).isEqualTo("twitter2"); assertThat(hit.getScore()).isEqualTo(1, Offset.offset(0.01f)); assertThat(hit.getSource().length).isGreaterThan(1); assertThat(hit.getHighlights()).hasSize(1); assertThat(hit.getHighlights().get("message").getValues()).contains("the <em>message</em>"); } @Test public void should_parse_hit_with_highlight_with_multi_values() throws Exception { String json = readFromClasspath("json/entity/hit_with_highlight_with_multi_values.json"); XContentParser parser = XContentHelper.createParser(json.getBytes(), 0, json.length()); parser.nextToken(); Hit hit = new Hit().parse(parser); assertThat(hit.getId()).isEqualTo("1"); assertThat(hit.getType()).isEqualTo("tweet"); assertThat(hit.getIndex()).isEqualTo("twitter2"); assertThat(hit.getHighlights()).hasSize(1); assertThat(hit.getHighlights()).containsKey("message"); assertThat(hit.getHighlights().get("message").getValues()).contains("the <em>message</em>", "twice the <em>message</em>"); } @Test public void should_parse_hit_with_highlight_with_multi_highlights_in_a_field() throws Exception { String json = readFromClasspath("json/entity/hit_with_highlight_with_multi_highlight_in_a_value.json"); XContentParser parser = XContentHelper.createParser(json.getBytes(), 0, json.length()); parser.nextToken(); Hit hit = new Hit().parse(parser); assertThat(hit.getId()).isEqualTo("1"); assertThat(hit.getType()).isEqualTo("tweet"); assertThat(hit.getIndex()).isEqualTo("twitter2"); assertThat(hit.getHighlights()).hasSize(1); assertThat(hit.getHighlights()).containsKey("message"); assertThat(hit.getHighlights().get("message").getValues()).containsOnly("the <em>message</em> is a <em>message</em>"); } @Test public void should_parse_hit_with_sort() throws Exception { // beware, score is null is sorting and track_score is not set to true String json = readFromClasspath("json/entity/hit_with_sort.json"); XContentParser parser = XContentHelper.createParser(json.getBytes(), 0, json.length()); parser.nextToken(); Hit hit = new Hit().parse(parser); assertThat(hit.getId()).isEqualTo("2"); assertThat(hit.getType()).isEqualTo("tweet"); assertThat(hit.getIndex()).isEqualTo("twitter2"); assertThat(hit.getScore()).isNull(); assertThat(hit.getSource().length).isGreaterThan(1); assertThat(hit.getSort()).hasSize(1).containsOnly("12"); } @Test public void should_parse_hit_with_fields() throws Exception { String json = readFromClasspath("json/entity/hit_with_fields.json"); XContentParser parser = XContentHelper.createParser(json.getBytes(), 0, json.length()); parser.nextToken(); Hit hit = new Hit().parse(parser); assertThat(hit.getId()).isEqualTo("1"); assertThat(hit.getType()).isEqualTo("tweet"); assertThat(hit.getIndex()).isEqualTo("twitter2"); assertThat(hit.getScore()).isEqualTo(1, Offset.offset(0.01f)); assertThat(hit.getSource()).isNull(); assertThat(hit.getFields()).hasSize(2); assertThat(hit.getFields()).containsKey("message"); assertThat(hit.getFields()).containsKey("the_int"); assertThat(hit.getFields().get("message").getValues()).containsOnly("the message"); assertThat(hit.getFields().get("the_int").getValues()).containsOnly("2"); } @Test public void should_parse_hit_with_explanation() throws Exception { String json = readFromClasspath("json/entity/hit_with_explanation.json"); XContentParser parser = XContentHelper.createParser(json.getBytes(), 0, json.length()); parser.nextToken(); Hit hit = new Hit().parse(parser); assertThat(hit.getId()).isEqualTo("1"); assertThat(hit.getType()).isEqualTo("tweet"); assertThat(hit.getIndex()).isEqualTo("twitter2"); assertThat(hit.getScore()).isEqualTo(1, Offset.offset(0.01f)); assertThat(hit.getExplanation()).isNotNull(); assertThat(hit.getExplanation().getValue()).isEqualTo(1); assertThat(hit.getExplanation().getDescription()).isEqualTo("ConstantScore(*:*), product of:"); assertThat(hit.getExplanation().getDetails()).hasSize(2); assertThat(hit.getExplanation().getDetails().get(0).getDetails()).isEmpty(); assertThat(hit.getExplanation().getDetails().get(0).getValue()).isEqualTo(1); assertThat(hit.getExplanation().getDetails().get(0).getDescription()).isEqualTo("boost"); assertThat(hit.getExplanation().getDetails().get(0).getDetails()).isEmpty(); assertThat(hit.getExplanation().getDetails().get(0).getValue()).isEqualTo(1); assertThat(hit.getExplanation().getDetails().get(1).getDescription()).isEqualTo("queryNorm"); } @Test public void should_parse_hit_with_matched_queries() throws Exception { String json = readFromClasspath("json/entity/hit_with_matched_query.json"); XContentParser parser = XContentHelper.createParser(json.getBytes(), 0, json.length()); parser.nextToken(); Hit hit = new Hit().parse(parser); assertThat(hit.getId()).isEqualTo("11"); assertThat(hit.getType()).isEqualTo("tweet"); assertThat(hit.getIndex()).isEqualTo("twitter"); assertThat(hit.getScore()).isEqualTo(1, Offset.offset(0.01f)); assertThat(hit.getMatchedQueries()).containsOnly("test"); } }