package com.silverforge.elasticsearchrawclient.queryDSL.queries; import com.silverforge.elasticsearchrawclient.BuildConfig; import com.silverforge.elasticsearchrawclient.exceptions.MandatoryParametersAreMissingException; import com.silverforge.elasticsearchrawclient.definition.Queryable; import com.silverforge.elasticsearchrawclient.queryDSL.operators.SortOperator; import com.silverforge.elasticsearchrawclient.queryDSL.queries.sorting.GeoDistanceSorting; import com.silverforge.elasticsearchrawclient.queryDSL.queries.sorting.ScriptBasedSorting; import com.silverforge.elasticsearchrawclient.queryDSL.queries.sorting.Sorting; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.annotation.Config; import static org.junit.Assert.*; import static org.hamcrest.Matchers.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) @Category(value = com.silverforge.elasticsearchrawclient.definition.QueryTest.class) public class QueryTest { // region Happy path @Test public void when_inner_query_added_then_query_generated_well() { Queryable matchAllQueryable = mock(Queryable.class); when(matchAllQueryable.getQueryString()).thenReturn("{\"match_all\":{}}"); Query query = Query .builder() .query(matchAllQueryable) .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString, is("{\"query\":{\"match_all\":{}}}")); } @Test public void when_inner_query_and_from_and_size_added_then_query_generated_well() { Queryable matchAllQueryable = mock(Queryable.class); when(matchAllQueryable.getQueryString()).thenReturn("{\"match_all\":{}}"); Query query = Query .builder() .from(20) .size(100) .query(matchAllQueryable) .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.startsWith("{"), is(true)); assertThat(queryString.endsWith("}"), is(true)); assertThat(queryString.indexOf("\"query\":{\"match_all\":{}}"), greaterThan(0)); assertThat(queryString.indexOf("\"from\":\"20\""), greaterThan(0)); assertThat(queryString.indexOf("\"size\":\"100\""), greaterThan(0)); } @Test public void when_sorting_is_added_then_query_generated_well() throws MandatoryParametersAreMissingException { Queryable matchAllQueryable = mock(Queryable.class); when(matchAllQueryable.getQueryString()).thenReturn("{\"match_all\":{}}"); String queryString = Query .builder() .query(matchAllQueryable) .sort( Sorting .builder() .fieldName("name") .order(SortOperator.DESC) .build()) .build() .getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.startsWith("{"), is(true)); assertThat(queryString.endsWith("}"), is(true)); assertThat(queryString.indexOf("\"query\":{\"match_all\":{}}"), greaterThan(0)); assertThat(queryString.indexOf("\"sort\":[{\"name\":{\"order\":\"desc\"}}]"), greaterThan(0)); } @Test public void when_sortings_are_added_then_query_generated_well() throws MandatoryParametersAreMissingException { ScriptBasedSorting scriptBasedSorting = mock(ScriptBasedSorting.class); when(scriptBasedSorting.getSortableQuery()).thenReturn("{\"_script\":{\"type\":\"number\",\"script\":{\"inline\":\"doc['field_name'].value*factor\",\"params\":{\"factor\":\"1.1\"}},\"order\":\"asc\"}}"); GeoDistanceSorting geoDistanceSorting = mock(GeoDistanceSorting.class); when(geoDistanceSorting.getSortableQuery()).thenReturn("{\"_geo_distance\":{\"pin.location\":[-70, 40],\"order\":\"asc\",\"unit\":\"km\"}}"); Queryable matchAllQueryable = mock(Queryable.class); when(matchAllQueryable.getQueryString()).thenReturn("{\"match_all\":{}}"); String queryString = Query .builder() .query(matchAllQueryable) .trackScores(false) .sort( scriptBasedSorting, geoDistanceSorting, Sorting .builder() .fieldName("name") .order(SortOperator.DESC) .build()) .build() .getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.startsWith("{"), is(true)); assertThat(queryString.endsWith("}"), is(true)); assertThat(queryString.indexOf("\"track_scores\":\"false\""), greaterThan(0)); assertThat(queryString.indexOf("\"query\":{\"match_all\":{}}"), greaterThan(0)); assertThat(queryString.indexOf("\"sort\":[{"), greaterThan(0)); assertThat(queryString.indexOf("}]"), greaterThan(0)); assertThat(queryString.indexOf("{\"_script\":{\"type\":\"number\",\"script\":{\"inline\":\"doc['field_name'].value*factor\",\"params\":{\"factor\":\"1.1\"}},\"order\":\"asc\"}}"), greaterThan(0)); assertThat(queryString.indexOf("{\"_geo_distance\":{\"pin.location\":[-70, 40],\"order\":\"asc\",\"unit\":\"km\"}}"), greaterThan(0)); assertThat(queryString.indexOf("{\"name\":{\"order\":\"desc\"}}"), greaterThan(0)); } // endregion // region Sad path @Test public void when_no_parameters_added_then_query_generated_well() throws MandatoryParametersAreMissingException { String queryString = Query .builder() .build() .getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString, is("{}")); } // endregion }