package rewards;
import static org.junit.Assert.*;
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
/**
* A system test that demonstrates how propagation settings affect transactional execution.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:rewards/system-test-config.xml"})
public class RewardNetworkPropagationTest {
/**
* The object being tested.
*/
@Autowired
private RewardNetwork rewardNetwork;
/**
* A template to use for test verification
*/
private SimpleJdbcTemplate template;
/**
* Manages transaction manually
*/
private PlatformTransactionManager transactionManager;
@Autowired
public void setDataSource(DataSource dataSource) {
this.template = new SimpleJdbcTemplate(dataSource);
}
@Autowired
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
@Test
public void testPropagation() {
// Open a transaction for testing
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
Dining dining = Dining.createDining("100.00", "1234123412341234", "1234567890");
rewardNetwork.rewardAccountFor(dining);
String sql = "select SAVINGS from T_ACCOUNT_BENEFICIARY where NAME = ?";
// Rollback the transaction test transaction
transactionManager.rollback(status);
assertEquals(Double.valueOf(4.00), template.queryForObject(sql, Double.class, "Annabelle"));
assertEquals(Double.valueOf(4.00), template.queryForObject(sql, Double.class, "Corgan"));
}
}