package org.springframework.data.simpledb.query;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.query.Parameter;
import org.springframework.data.repository.query.Parameters;
import org.springframework.data.simpledb.attributeutil.SimpleDBAttributeConverter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public class QueryUtilsArrayTest {
@Test
public void buildQueryConditionsWithParameters_should_construct_correct_named_query_for_in_operator() {
final String bind_query = "select * from customer_all WHERE age in :age and x= :name";
final int firstAge = 23;
final int secondAge = 25;
final String convertedFirstAge = SimpleDBAttributeConverter.encode(firstAge);
final String convertedSecondAge = SimpleDBAttributeConverter.encode(secondAge);
String expectedQuery = "select * from customer_all WHERE age in ('" + convertedFirstAge + "','"+convertedSecondAge+"') and x= 'name'";
final Parameters parameters = getMockParameters(new String[]{":name", ":age"}, new Class[]{String.class, int[].class});
String resultedQuery = QueryUtils.buildQuery(bind_query, parameters, "name", new int[]{firstAge, secondAge});
assertThat(resultedQuery, is(expectedQuery));
}
@Test
public void buildQueryConditionsWithParameters_should_construct_correct_named_query_for_in_operator_with_no_space() {
final String bind_query = "select * from customer_all WHERE age in:age";
final int firstAge = 23;
final int secondAge = 25;
final String convertedFirstAge = SimpleDBAttributeConverter.encode(firstAge);
final String convertedSecondAge = SimpleDBAttributeConverter.encode(secondAge);
String expectedQuery = "select * from customer_all WHERE age in('" + convertedFirstAge + "','"+convertedSecondAge+"')";
final Parameters parameters = getMockParameters(new String[]{":age"}, new Class[]{String.class});
String resultedQuery = QueryUtils.buildQuery(bind_query, parameters, new int[]{firstAge, secondAge});
assertThat(resultedQuery, is(expectedQuery));
}
static final List<Class<?>> TYPES = Arrays.<Class<?>>asList(Pageable.class, Sort.class);
@SuppressWarnings({ "rawtypes", "unchecked" })
private Parameter getMockParameter(String placeHolder, Integer idx, Class clazz) {
Parameter mockParameter = Mockito.mock(Parameter.class);
Mockito.when(mockParameter.getPlaceholder()).thenReturn(placeHolder);
Mockito.when(mockParameter.isNamedParameter()).thenReturn(Boolean.TRUE);
Mockito.when(mockParameter.getIndex()).thenReturn(idx);
Mockito.when(mockParameter.getType()).thenReturn(clazz);
Mockito.when(mockParameter.isSpecialParameter()).thenReturn(TYPES.contains(clazz));
return mockParameter;
}
@SuppressWarnings({ "rawtypes" })
private Parameters getMockParameters(String[] placeHolders, Class[] clazzes) {
Parameters mockParameters = Mockito.mock(Parameters.class);
List<Parameter> parameters = new ArrayList<Parameter>(placeHolders.length);
for(int idx = 0; idx < placeHolders.length; ++idx) {
parameters.add(getMockParameter(placeHolders[idx], idx, clazzes[idx]));
}
Mockito.when(mockParameters.iterator()).thenReturn(parameters.iterator());
Mockito.when(mockParameters.getNumberOfParameters()).thenReturn(parameters.size());
return mockParameters;
}
}