FTSearchParamsTest.java

package redis.clients.jedis.search;

import static org.hamcrest.MatcherAssert.assertThat;
import static redis.clients.jedis.util.CommandArgumentsMatchers.containsArguments;
import static redis.clients.jedis.util.CommandArgumentsMatchers.hasArgument;

import java.util.HashMap;
import java.util.Map;

import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

import redis.clients.jedis.CommandArguments;
import redis.clients.jedis.args.RawableFactory;
import redis.clients.jedis.search.SearchProtocol.SearchCommand;

public class FTSearchParamsTest {

  private static final String INDEX = "idx";
  private static final String QUERY = "@price:[$min $max]";

  /** The command prefix FT.SEARCH is built with: SEARCH <index> <query>. */
  private CommandArguments searchArguments() {
    return new CommandArguments(SearchCommand.SEARCH).add(INDEX).add(QUERY);
  }

  @Nested
  class AddParamsTests {

    @Test
    public void paramsMapMergesWhenParametersAlreadySet() {
      Map<String, Object> more = new HashMap<>();
      more.put("max", "2");

      FTSearchParams params = FTSearchParams.searchParams().addParam("min", "1").params(more);

      CommandArguments args = searchArguments();
      params.addParams(args);

      // Expected: FT.SEARCH idx @price:[$min $max] PARAMS 4 <min 1 max 2 in any order>
      assertThat(args, containsArguments("min", "1", "max", "2"));
      assertThat(args, hasArgument(4, RawableFactory.from(4)));
    }

    @Test
    public void paramsMapMergesAcrossTwoMapCalls() {
      Map<String, Object> first = new HashMap<>();
      first.put("min", "1");
      Map<String, Object> second = new HashMap<>();
      second.put("max", "2");

      FTSearchParams params = FTSearchParams.searchParams().params(first).params(second);

      CommandArguments args = searchArguments();
      params.addParams(args);

      // Expected: FT.SEARCH idx @price:[$min $max] PARAMS 4 <min 1 max 2 in any order>
      assertThat(args, containsArguments("min", "1", "max", "2"));
      assertThat(args, hasArgument(4, RawableFactory.from(4)));
    }

    @Test
    public void paramsMapOverwritesValueSetByAddParam() {
      Map<String, Object> map = new HashMap<>();
      map.put("min", "9");

      FTSearchParams params = FTSearchParams.searchParams().addParam("min", "1").params(map);

      CommandArguments args = searchArguments();
      params.addParams(args);

      // Expected: FT.SEARCH idx @price:[$min $max] PARAMS 2 min 9
      assertThat(args, containsArguments("min", "9"));
      assertThat(args, hasArgument(4, RawableFactory.from(2)));
    }

    @Test
    public void addParamOverwritesValueSetByParamsMap() {
      Map<String, Object> map = new HashMap<>();
      map.put("min", "1");

      FTSearchParams params = FTSearchParams.searchParams().params(map).addParam("min", "9");

      CommandArguments args = searchArguments();
      params.addParams(args);

      // Expected: FT.SEARCH idx @price:[$min $max] PARAMS 2 min 9
      assertThat(args, containsArguments("min", "9"));
      assertThat(args, hasArgument(4, RawableFactory.from(2)));
    }
  }
}