package com.silverforge.elasticsearchrawclient.queryDSL.queries.innerQueries; import com.silverforge.elasticsearchrawclient.BuildConfig; import com.silverforge.elasticsearchrawclient.exceptions.MandatoryParametersAreMissingException; import com.silverforge.elasticsearchrawclient.definition.QueryTest; import com.silverforge.elasticsearchrawclient.definition.Queryable; 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.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.*; @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) @Category(value = QueryTest.class) public class BoolQueryTest { // region Happy path @Test public void when_query_fully_defined_then_query_generated_with_must_should_must_not() throws MandatoryParametersAreMissingException { Queryable matchQueryable = mock(Queryable.class); when(matchQueryable.getQueryString()).thenReturn("{\"match\":{\"name\":\"Karcag\"}}"); Queryable matchAllQueryable = mock(Queryable.class); when(matchAllQueryable.getQueryString()).thenReturn("{\"match_all\":{}}"); Queryable multiMatchQueryable = mock(Queryable.class); when(multiMatchQueryable.getQueryString()).thenReturn("{\"multi_match\":{\"fields\":[\"name\",\"population\"],\"query\":\"Karcag Budapest\",\"use_dis_max\":\"false\",\"analyzer\":\"standard\",\"tie_breaker\":\"0.4\"}}"); Queryable complicatedMatchQueryable = mock(Queryable.class); when(complicatedMatchQueryable.getQueryString()).thenReturn("{\"match\":{\"name\":{\"query\":\"Karcag Budapest\",\"operator\":\"or\",\"analyzer\":\"keyword\"}}}"); BoolQuery query = BoolQuery .builder() .must( matchAllQueryable, matchQueryable) .should( multiMatchQueryable) .mustNot( BoolQuery .builder() .should( complicatedMatchQueryable) .build()) .minimumShouldMatch(23) .disableCoord(false) .boost(1.0F) .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.startsWith("{\"bool\":{"), is(true)); assertThat(queryString.endsWith("}}"), is(true)); assertThat(queryString.indexOf("\"must\":["), greaterThan(0)); assertThat(queryString.indexOf("\"must_not\":["), greaterThan(0)); assertThat(queryString.indexOf("\"should\":["), greaterThan(0)); assertThat(queryString.indexOf("\"minimum_should_match\":\"23\""), greaterThan(0)); assertThat(queryString.indexOf("\"disable_coord\":\"false\""), greaterThan(0)); assertThat(queryString.indexOf("\"boost\":\"1.0\""), greaterThan(0)); } @Test public void when_must_defined_then_query_generated_with_must() throws MandatoryParametersAreMissingException { Queryable matchQueryable = mock(Queryable.class); when(matchQueryable.getQueryString()).thenReturn("{\"match\":{\"name\":\"Karcag\"}}"); BoolQuery query = BoolQuery .builder() .must(matchQueryable) .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.startsWith("{\"bool\":{"), is(true)); assertThat(queryString.endsWith("}}"), is(true)); assertThat(queryString.indexOf("\"must\":[{\"match\":{\"name\":\"Karcag\"}}]"), greaterThan(0)); } @Test public void when_must_not_defined_then_query_generated_with_must_not() throws MandatoryParametersAreMissingException { Queryable matchAllQueryable = mock(Queryable.class); when(matchAllQueryable.getQueryString()).thenReturn("{\"match_all\":{}}"); BoolQuery query = BoolQuery .builder() .mustNot(matchAllQueryable) .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.startsWith("{\"bool\":{"), is(true)); assertThat(queryString.endsWith("}}"), is(true)); assertThat(queryString.indexOf("\"must_not\":[{\"match_all\":{}}]"), greaterThan(0)); } @Test public void when_should_defined_then_query_generated_with_should() throws MandatoryParametersAreMissingException { Queryable matchAllQueryable = mock(Queryable.class); when(matchAllQueryable.getQueryString()).thenReturn("{\"match_all\":{}}"); BoolQuery query = BoolQuery .builder() .should(matchAllQueryable) .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.startsWith("{\"bool\":{"), is(true)); assertThat(queryString.endsWith("}}"), is(true)); assertThat(queryString.indexOf("\"should\":[{\"match_all\":{}}]"), greaterThan(0)); } // endregion // region Sad path @Test public void when_no_parameters_defined_then_empty_query_string_is_generated() { BoolQuery query = BoolQuery .builder() .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString, is("{\"bool\":{}}")); } // endregion }