package org.springframework.data.simpledb.query;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
import java.lang.reflect.Method;
import java.util.List;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.simpledb.annotation.Query;
import org.springframework.data.simpledb.core.SimpleDbDomain;
public class SimpleDbQueryMethodWithSelectAndWhereClauseTest {
@Test
public void getAnnotatedQuery_should_returned_completed_where_clause_in_query() throws Exception {
SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("selectPartialFieldsWithWhereClause",
SampleEntity.class);
// @Query(select = {"item_id", "sampleAttribute"}, where =
// "sampleAttribute<='3' or item_id = `5`")
String expectedResult = "select item_id, sampleAttribute from `testDB.sampleEntity` where sampleAttribute<='3' or item_id = `5`";
assertEquals(expectedResult, repositoryMethod.getAnnotatedQuery());
}
@Test
public void getAnnotatedQuery_should_work_for_empty_where_clause() throws Exception {
SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("selectWithEmptyWhereClause",
SampleEntity.class);
String expectedResult = "select item_id from `testDB.sampleEntity`";
assertEquals(expectedResult, repositoryMethod.getAnnotatedQuery());
}
@Test
public void getAnnotatedQuery_should_work_with_repetitive_field_in_where_statement() throws Exception {
SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("whereTricky", SampleEntity.class);
// @Query(select = {"item_id"}, where =
// "item_id >= `3` and item_id <= `5`")
String expectedResult = "select item_id from `testDB.sampleEntity` where item_id >= `3` and item_id <= `5`";
assertEquals(expectedResult, repositoryMethod.getAnnotatedQuery());
}
@Test
public void getAnnotatedQuery_should_work_with_repetitive_field_in_select_statement() throws Exception {
SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("selectTricky", SampleEntity.class);
// @Query(select = {"item_id", "item_id" }, where =
// "item_id >= `3` and item_id <= `5`")
String expectedResult = "select item_id, item_id from `testDB.sampleEntity` where item_id >= `3` and item_id <= `5`";
assertEquals(expectedResult, repositoryMethod.getAnnotatedQuery());
}
public interface AnnotatedQueryRepository {
@Query(select = { "item_id", "sampleAttribute" }, where = "sampleAttribute<='3' or item_id = `5`")
List<SampleEntity> selectPartialFieldsWithWhereClause();
@Query(select = { "item_id" }, where = "")
List<SampleEntity> selectWithEmptyWhereClause();
@Query(select = { "item_id" }, where = "item_id >= `3` and item_id <= `5`")
List<SampleEntity> whereTricky();
@Query(select = { "item_id", "item_id" }, where = "item_id >= `3` and item_id <= `5`")
List<SampleEntity> selectTricky();
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private SimpleDbQueryMethod prepareQueryMethodToTest(String methodName, Class<?> entityClass) throws Exception {
RepositoryMetadata repositoryMetadata = Mockito.mock(RepositoryMetadata.class);
when(repositoryMetadata.getDomainType()).thenReturn((Class) entityClass);
Method testMethod = AnnotatedQueryRepository.class.getMethod(methodName);
when(repositoryMetadata.getReturnedDomainClass(testMethod)).thenReturn((Class) entityClass);
SimpleDbDomain simpleDbDomain = new SimpleDbDomain();
return new SimpleDbQueryMethod(testMethod, repositoryMetadata, simpleDbDomain);
}
}