package com.silverforge.elasticsearchrawclient.queryDSL.queries.innerQueries; import com.silverforge.elasticsearchrawclient.BuildConfig; import com.silverforge.elasticsearchrawclient.definition.Functionable; import com.silverforge.elasticsearchrawclient.definition.QueryTest; import com.silverforge.elasticsearchrawclient.definition.Queryable; import com.silverforge.elasticsearchrawclient.queryDSL.operators.BoostModeOperator; import com.silverforge.elasticsearchrawclient.queryDSL.operators.ScoreModeOperator; 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 java.util.HashMap; import java.util.Map; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.lessThan; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) @Category(value = QueryTest.class) public class FunctionScoreQueryTest { // region Happy path @Test public void when_minimal_required_params_added_then_query_is_generated_well() { Queryable matchAllQueryable = mock(Queryable.class); when(matchAllQueryable.getQueryString()).thenReturn("{\"match_all\":{}}"); FunctionScoreQuery query = FunctionScoreQuery .builder() .query(matchAllQueryable) .boost(89) .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.startsWith("{\"function_score\":{"), is(true)); assertThat(queryString.endsWith("}}"), is(true)); assertThat(queryString.indexOf("\"query\":{\"match_all\":{}}"), greaterThan(0)); assertThat(queryString.indexOf("\"boost\":\"89\""), greaterThan(0)); } @Test public void when_function_added_then_query_is_generated_well() { Queryable matchAllQueryable = mock(Queryable.class); when(matchAllQueryable.getQueryString()).thenReturn("{\"match_all\":{}}"); Functionable weightFunctionable = mock(Functionable.class); when(weightFunctionable.getFunctionString()).thenReturn("{\"weight\":\"54\"}"); FunctionScoreQuery query = FunctionScoreQuery .builder() .query(matchAllQueryable) .functions(weightFunctionable) .boost(89) .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.startsWith("{\"function_score\":{"), is(true)); assertThat(queryString.endsWith("}}"), is(true)); assertThat(queryString.indexOf("\"query\":{\"match_all\":{}}"), greaterThan(0)); assertThat(queryString.indexOf("\"boost\":\"89\""), greaterThan(0)); assertThat(queryString.indexOf("\"functions\":[{\"weight\":\"54\"}]"), greaterThan(0)); } @Test public void when_multiple_function_param_added_then_query_is_generated_well() { Queryable matchAllQueryable = mock(Queryable.class); when(matchAllQueryable.getQueryString()).thenReturn("{\"match_all\":{}}"); Functionable weightFunctionable = mock(Functionable.class); when(weightFunctionable.getFunctionString()).thenReturn("{\"weight\":\"54\"}"); Functionable randomScoreFunctionable = mock(Functionable.class); when(randomScoreFunctionable.getFunctionString()).thenReturn("{\"random_score\":{\"seed\":\"44\"}}"); FunctionScoreQuery query = FunctionScoreQuery .builder() .query(matchAllQueryable) .functions(weightFunctionable, randomScoreFunctionable) .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.indexOf("\"query\":{\"match_all\":{}}"), greaterThan(0)); assertThat(queryString.indexOf("\"functions\":[{"), greaterThan(0)); assertThat(queryString.indexOf("{\"weight\":\"54\"}"), greaterThan(0)); assertThat(queryString.indexOf("{\"random_score\":{\"seed\":\"44\"}}"), greaterThan(0)); } @Test public void when_all_the_params_added_then_query_is_generated_well() { Queryable matchAllQueryable = mock(Queryable.class); when(matchAllQueryable.getQueryString()).thenReturn("{\"match_all\":{}}"); Functionable weightFunctionable = mock(Functionable.class); when(weightFunctionable.getFunctionString()).thenReturn("{\"weight\":\"54\"}"); Map<String, Integer> params = new HashMap<>(); params.put("param1",1); params.put("param2", 2); FunctionScoreQuery query = FunctionScoreQuery .builder() .query(matchAllQueryable) .boost(8.9f) .boostMode(BoostModeOperator.MULTIPLY) .scoreMode(ScoreModeOperator.MULTIPLY) .minScore(67) .maxBoost(5.123f) .functions(weightFunctionable) .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.indexOf("\"query\":{\"match_all\":{}}"), greaterThan(0)); assertThat(queryString.indexOf("\"boost\":\"8.9\""), greaterThan(0)); assertThat(queryString.indexOf("\"boost_mode\":\"multiply\""), greaterThan(0)); assertThat(queryString.indexOf("\"score_mode\":\"multiply\""), greaterThan(0)); assertThat(queryString.indexOf("\"min_score\":\"67\""), greaterThan(0)); assertThat(queryString.indexOf("\"max_boost\":\"5.123\""), greaterThan(0)); assertThat(queryString.indexOf("\"functions\":[{\"weight\":\"54\"}]"), greaterThan(0)); } // endregion // region Sad path @Test public void when_no_params_added_then_minimal_query_is_generated_well() { FunctionScoreQuery query = FunctionScoreQuery .builder() .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); } @Test public void when_query_param_is_null_then_query_is_generated_well() { FunctionScoreQuery query = FunctionScoreQuery .builder() .boost(89) .boostMode(BoostModeOperator.MULTIPLY) .functions(null) .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.indexOf("\"boost\":\"89\""), greaterThan(0)); assertThat(queryString.indexOf("\"boost_mode\":\"multiply\""), greaterThan(0)); assertThat(queryString.indexOf("\"functions\""), lessThan(0)); assertThat(queryString.indexOf("\"function\""), lessThan(0)); } @Test public void when_function_param_is_null_then_query_is_generated_well() { Queryable matchAllQueryable = mock(Queryable.class); when(matchAllQueryable.getQueryString()).thenReturn("{\"match_all\":{}}"); FunctionScoreQuery query = FunctionScoreQuery .builder() .query(matchAllQueryable) .boost(89) .boostMode(BoostModeOperator.MULTIPLY) .build(); String queryString = query.getQueryString(); assertThat(queryString, notNullValue()); assertThat(queryString, not("")); assertThat(queryString.indexOf("\"query\":{\"match_all\":{}}"), greaterThan(0)); assertThat(queryString.indexOf("\"boost\":\"89\""), greaterThan(0)); assertThat(queryString.indexOf("\"boost_mode\":\"multiply\""), greaterThan(0)); } // endregion }