package org.springframework.data.simpledb.query.executions; 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; import org.springframework.data.simpledb.query.SampleEntity; import org.springframework.data.simpledb.query.SimpleDbQueryMethod; import java.lang.reflect.Method; import java.util.List; import java.util.Set; import static org.junit.Assert.*; import static org.mockito.Mockito.when; /** * */ public class MultipleResultExecutionTest { @Test public void detectResultType_should_return_COLLECTION_OF_DOMAIN_ENTITIES() throws Exception { SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("selectAll", SampleEntity.class); MultipleResultExecution multipleResultExecution = new MultipleResultExecution(null); assertEquals(MultipleResultExecution.MultipleResultType.COLLECTION_OF_DOMAIN_ENTITIES, multipleResultExecution.detectResultType(repositoryMethod)); } @Test public void detectResultType_for_selected_field_should_return_COLLECTION_OF_DOMAIN_ENTITIES() throws Exception { SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("partialSampleListSelect", SampleEntity.class); MultipleResultExecution multipleResultExecution = new MultipleResultExecution(null); assertEquals(MultipleResultExecution.MultipleResultType.COLLECTION_OF_DOMAIN_ENTITIES, multipleResultExecution.detectResultType(repositoryMethod)); } @Test public void detectResultType_should_return_LIST_OF_LIST_OF_OBJECT() throws Exception { SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("selectCoreFields", SampleEntity.class); MultipleResultExecution multipleResultExecution = new MultipleResultExecution(null); assertEquals(MultipleResultExecution.MultipleResultType.LIST_OF_LIST_OF_OBJECT, multipleResultExecution.detectResultType(repositoryMethod)); } @Test public void detectResultType_for_multiple_selected_attributes_should_return_LIST_OF_LIST_OF_OBJECT() throws Exception { SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("selectFields", SampleEntity.class); MultipleResultExecution multipleResultExecution = new MultipleResultExecution(null); assertEquals(MultipleResultExecution.MultipleResultType.LIST_OF_LIST_OF_OBJECT, multipleResultExecution.detectResultType(repositoryMethod)); } @Test public void detectResultType_should_return_FIELD_OF_TYPE_COLLECTION() throws Exception { SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("sampleListSelect", SampleEntity.class); MultipleResultExecution multipleResultExecution = new MultipleResultExecution(null); assertEquals(MultipleResultExecution.MultipleResultType.FIELD_OF_TYPE_COLLECTION, multipleResultExecution.detectResultType(repositoryMethod)); } @Test public void detectResultType_should_return_LIST_OF_FIELDS() throws Exception { SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("sampleAllSampleListSelect", SampleEntity.class); MultipleResultExecution multipleResultExecution = new MultipleResultExecution(null); assertEquals(MultipleResultExecution.MultipleResultType.LIST_OF_FIELDS, multipleResultExecution.detectResultType(repositoryMethod)); } @Test public void detectResultType_should_return_SET_OF_FIELDS() throws Exception { SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("sampleAllSampleListSelectInSet", SampleEntity.class); MultipleResultExecution multipleResultExecution = new MultipleResultExecution(null); assertEquals(MultipleResultExecution.MultipleResultType.SET_OF_FIELDS, multipleResultExecution.detectResultType(repositoryMethod)); } @Test public void detectResultType_should_return_FIELD_OF_TYPE_COLLECTION_of_list_of_lists() throws Exception { SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("listOfListOfIntegerFieldSelect", SampleEntity.class); MultipleResultExecution multipleResultExecution = new MultipleResultExecution(null); assertEquals(MultipleResultExecution.MultipleResultType.FIELD_OF_TYPE_COLLECTION, multipleResultExecution.detectResultType(repositoryMethod)); } @Test(expected = IllegalArgumentException.class) public void detectResultType_should_return_error_for_inexisting_field() throws Exception { SimpleDbQueryMethod repositoryMethod = prepareQueryMethodToTest("sampleWrongField", SampleEntity.class); MultipleResultExecution multipleResultExecution = new MultipleResultExecution(null); multipleResultExecution.detectResultType(repositoryMethod); } public interface AnnotatedQueryRepository { @Query(value = "select * from `testDB.simpleDbUser` where itemName()='Item_0'") List<SampleEntity> selectAll(); @Query(value = "SELECT sampleList FROM `testDB.simpleDbUser` where itemName()='Item_0'") List<SampleEntity> partialSampleListSelect(); @Query(value = "select sampleList from `testDB.simpleDbUser` where itemName()='Item_0'") List<List<Object>> selectCoreFields(); @Query(value = "select sampleList, sampleList from `testDB.simpleDbUser` where itemName()='Item_0'") List<List<Object>> selectFields(); @Query(value = "select sampleList from `testDB.simpleDbUser`") List<Integer> sampleListSelect(); @Query(value = "select sampleList from `testDB.simpleDbUser`") List<List<Integer>> sampleAllSampleListSelect(); @Query(value = "select sampleList from `testDB.simpleDbUser`") Set<List<Integer>> sampleAllSampleListSelectInSet(); @Query(value = "select sampleFail from `testDB.simpleDbUser`") Set<List<Integer>> sampleWrongField(); @Query(value = "select listOfListOfInteger from `testDB.simpleDbUser`") List<List<Integer>> listOfListOfIntegerFieldSelect(); } @SuppressWarnings({ "unchecked", "rawtypes" }) 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); } }