package org.transgalactica.management.business.logistics.service.config;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.Advised;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.transgalactica.fwk.test.util.SecurityContextTestUtils;
import org.transgalactica.management.business.logistics.exception.HangarInexistantException;
import org.transgalactica.management.business.logistics.service.HangarService;
import org.transgalactica.management.business.logistics.TestConfig;
import org.transgalactica.management.data.materiel.bo.HangarEntity;
import org.transgalactica.management.data.materiel.bo.impl.JpaHangarEntity;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
public class ServiceTransactionInterceptorTest {
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
@Qualifier("daoHangarService")
private HangarService hangarService;
private TransactionDefinition transactionDefinition;
@Before
public void setSecurityRoleInContext() {
SecurityContextTestUtils.setUsernamePasswordAuthenticationTokenInSecurityContext("superGestionnaire", "xxx",
"ROLE_SUPER_GESTIONNAIRE");
}
@Before
public void createTransactionDefinition() {
transactionDefinition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
}
private HangarEntity createHangar() {
HangarEntity hangar = (HangarEntity) BeanUtils.instantiateClass(JpaHangarEntity.class);
hangar.setLocalisation("test");
hangar.setNombreEmplacements(1);
return hangar;
}
@Test
public void testProxificationServiceHangar() {
assertTrue(hangarService instanceof Advised);
Advised advised = (Advised) hangarService;
Advisor[] advisors = advised.getAdvisors();
boolean transactionInterceptorFound = false;
for (int i = 0; i < advisors.length && !transactionInterceptorFound; i++) {
transactionInterceptorFound = advisors[i].getAdvice() instanceof TransactionInterceptor;
}
assertTrue(transactionInterceptorFound);
}
@DirtiesContext
@Test
public void testCommit() {
HangarEntity hangar = createHangar();
TransactionStatus status = transactionManager.getTransaction(transactionDefinition);
hangarService.enregistrerHangar(hangar);
assertFalse(status.isCompleted());
transactionManager.commit(status);
assertTrue(status.isCompleted());
hangarService.chargerHangar(hangar.getNumero());
}
@Test
public void testRollback() {
HangarEntity hangar = createHangar();
TransactionStatus status = transactionManager.getTransaction(transactionDefinition);
hangarService.enregistrerHangar(hangar);
assertFalse(status.isCompleted());
transactionManager.rollback(status);
assertTrue(status.isCompleted());
try {
hangarService.chargerHangar(hangar.getNumero());
}
catch (HangarInexistantException e) {
return;
}
fail();
}
}