package com.aol.micro.server.transactions;
import org.junit.Test;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.transaction.support.TransactionCallback;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
public class TransactionFlowTest {
TransactionTemplate transactionTemplate = new TransactionTemplate(){
public <T> T execute(TransactionCallback<T> action) throws TransactionException {
return action.doInTransaction(null);
}
};
TransactionTemplate transactionTemplate2 = new TransactionTemplate(){
public <T> T execute(TransactionCallback<T> action) throws TransactionException {
return action.doInTransaction(null);
}
};
@Test
public void test() {
Integer result = TransactionFlow.<Integer>of(transactionTemplate)
.map(this::load)
.map(this::save)
.execute(10)
.get();
assertThat(result,equalTo(-1));
}
@Test
public void flatMapTest(){
String result = TransactionFlow.of(transactionTemplate, this::load)
.flatMap(this::newTransaction)
.execute(10)
.get();
}
@Test
public void errorHandlingGeneral() {
Throwable result = TransactionFlow.<Integer>of(transactionTemplate)
.map(this::load)
.map(this::error)
.execute(10)
.toFailedOptional()
.get();
assertThat(result,instanceOf(RuntimeException.class));
}
@Test(expected=RuntimeException.class)
public void errorHandlingSpecific() {
Throwable result = TransactionFlow.<Integer>of(transactionTemplate)
.map(this::load)
.map(this::error2)
.execute(10,IllegalArgumentException.class)
.toFailedOptional()
.get();
fail("exception expected!");
}
@Test
public void errorHandlingSpecificCaught() {
NullPointerException result = TransactionFlow.<Integer>of(transactionTemplate)
.map(this::load)
.map(this::error2)
.execute(10,NullPointerException.class)
.toFailedOptional()
.get();
assertThat(result,instanceOf(NullPointerException.class));
}
public TransactionFlow<Integer,String> newTransaction(String input){
return TransactionFlow.of(transactionTemplate2, in -> input+":"+in);
}
public String load(Integer input){
return "data";
}
public Integer save(String input){
return -1;
}
public Integer error(String input){
throw new RuntimeException();
}
public Integer error2(String input){
throw new NullPointerException();
}
}