package de.zalando.sprocwrapper.proxy;
import de.zalando.sprocwrapper.SProcCall;
import de.zalando.sprocwrapper.SProcParam;
import de.zalando.sprocwrapper.SProcService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
/**
* @author Soroosh Sarabadani
*/
public class SProcCallHandlerTest {
private static final SProcServiceAnnotationHandler.HandlerResult DEFAULT_HANDLER_RESULT = new SProcServiceAnnotationHandler.HandlerResult("", new SubVirtualShardKeyStrategy(), false, null);
private SProcCallHandler handler;
@Before
public void setup() {
this.handler = new SProcCallHandler();
}
@Test
public void should_find_all_methods_annotated_with_SprocCall() {
class Sample {
@SProcCall
public void a() {
}
@SProcCall
public void b() {
}
}
List<Method> sProcCallAnnotatedMethods = handler.findSProcCallAnnotatedMethods(Sample.class);
Assert.assertEquals(2, sProcCallAnnotatedMethods.size());
}
@Test
public void handle_should_return_empty_map_when_there_is_no_annotated_method() {
Map<Method, StoredProcedure> result = handler.handle(String.class, SProcServiceAnnotationHandler.DEFAULT_HANDLER_RESULT);
Assert.assertEquals(0, result.size());
}
@Test(expected = IllegalArgumentException.class)
public void handle_should_throw_exception_when_handlerResult_is_null() {
handler.handle(String.class, null);
}
@Test(expected = IllegalArgumentException.class)
public void handle_should_throw_exception_when_class_is_null() {
handler.handle(null, SProcServiceAnnotationHandler.DEFAULT_HANDLER_RESULT);
}
@Test
public void handle_should_create_storedprocedure_with_name_X() {
class Sample {
@SProcCall(name = "X")
public void a() {
}
}
List<Method> sProcCallAnnotatedMethods = handler.findSProcCallAnnotatedMethods(Sample.class);
Map<Method, StoredProcedure> handle = handler.handle(Sample.class, SProcServiceAnnotationHandler.DEFAULT_HANDLER_RESULT);
Assert.assertEquals("X", handle.get(sProcCallAnnotatedMethods.get(0)).getName());
}
@Test
public void handle_should_create_storedprocedure_with_parameter() {
class Sample {
@SProcCall
public void a(@SProcParam(name = "var") String dummyParameter1) {
}
}
List<Method> sProcCallAnnotatedMethods = handler.findSProcCallAnnotatedMethods(Sample.class);
Map<Method, StoredProcedure> handle = handler.handle(Sample.class, SProcServiceAnnotationHandler.DEFAULT_HANDLER_RESULT);
StoredProcedure storedProcedure = handle.get(sProcCallAnnotatedMethods.get(0));
Assert.assertEquals("?", storedProcedure.getSqlParameterList());
}
@Test
public void handle_should_create_storedprocedure_with_parameterized_parameter() {
class Sample {
@SProcCall
public void a(@SProcParam(name = "var") List<String> dummyParameter1) {
}
}
List<Method> sProcCallAnnotatedMethods = handler.findSProcCallAnnotatedMethods(Sample.class);
Map<Method, StoredProcedure> handle = handler.handle(Sample.class, SProcServiceAnnotationHandler.DEFAULT_HANDLER_RESULT);
StoredProcedure storedProcedure = handle.get(sProcCallAnnotatedMethods.get(0));
Assert.assertEquals("?", storedProcedure.getSqlParameterList());
}
@Test
public void NONE_ONE_PHASE_TWO_PHASE_should_return_correspond_write_transaction() {
Assert.assertEquals(SProcService.WriteTransaction.NONE, SProcCallHandler.mapSprocWriteTransactionToServiceWriteTransaction(SProcCall.WriteTransaction.NONE,DEFAULT_HANDLER_RESULT));
Assert.assertEquals(SProcService.WriteTransaction.ONE_PHASE,SProcCallHandler.mapSprocWriteTransactionToServiceWriteTransaction(SProcCall.WriteTransaction.ONE_PHASE, DEFAULT_HANDLER_RESULT));
Assert.assertEquals(SProcService.WriteTransaction.TWO_PHASE, SProcCallHandler.mapSprocWriteTransactionToServiceWriteTransaction(SProcCall.WriteTransaction.TWO_PHASE, DEFAULT_HANDLER_RESULT));
}
@Test(expected = IllegalArgumentException.class)
public void mapSprocWriteTransactionToServiceWriteTransaction_should_throw_exception_when_SprocService_is_null() {
SProcCallHandler.mapSprocWriteTransactionToServiceWriteTransaction(SProcCall.WriteTransaction.USE_FROM_SERVICE, DEFAULT_HANDLER_RESULT);
}
@Test(expected = IllegalArgumentException.class)
public void mapSprocWriteTransactionToServiceWriteTransaction_should_throw_exception_when_sproccall_wirtetransaction_is_null() {
SProcCallHandler.mapSprocWriteTransactionToServiceWriteTransaction(SProcCall.WriteTransaction.USE_FROM_SERVICE, DEFAULT_HANDLER_RESULT);
}
@Test
public void mapSprocWriteTransactionToServiceWriteTransaction_should_return_service_writetransaction() {
SProcService.WriteTransaction writeTransaction = SProcCallHandler.mapSprocWriteTransactionToServiceWriteTransaction(SProcCall.WriteTransaction.USE_FROM_SERVICE, new SProcServiceAnnotationHandler.HandlerResult("", new SubVirtualShardKeyStrategy(), false, SProcService.WriteTransaction.ONE_PHASE));
Assert.assertEquals(SProcService.WriteTransaction.ONE_PHASE,writeTransaction);
}
}