package com.hantsylabs.example.spring.dao; import static org.junit.Assert.assertTrue; import java.util.Calendar; import java.util.Date; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; import org.springframework.test.context.transaction.TransactionalTestExecutionListener; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import com.hantsylabs.example.spring.jpa.ConferenceRepository; import com.hantsylabs.example.spring.model.Conference; import com.hantsylabs.example.spring.model.Contact; import com.hantsylabs.example.spring.model.Signup; import com.hantsylabs.example.spring.model.SignupInfo; import com.hantsylabs.example.spring.model.Status; import com.hantsylabs.example.spring.mongo.ContactRepository; import com.hantsylabs.example.spring.mongo.SignupRepository; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:/com/hantsylabs/example/spring/config/applicationContext-jpa.xml", "classpath:/com/hantsylabs/example/spring/config/applicationContext-mongo.xml" }) // @TransactionConfiguration(transactionManager = "transactionManager") @TestExecutionListeners({ TransactionalTestExecutionListener.class, DependencyInjectionTestExecutionListener.class }) public class ConferenceCrossStoreImplTest { private static final Logger log = LoggerFactory .getLogger(ConferenceCrossStoreImplTest.class); @Autowired private ConferenceRepository conferenceRepository; @Autowired private SignupRepository signupRepository; @Autowired private ContactRepository contactRepository; @Autowired PlatformTransactionManager transactionManager; TransactionTemplate transactionTemplate; @PersistenceContext EntityManager em; private Conference newConference() { Conference conf = new Conference(); conf.setName("JUD2013"); conf.setSlug("jud-2013"); conf.setDescription("JBoss User Developer Conference 2013 Boston"); Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_YEAR, 30); Date startedDate = cal.getTime(); conf.setStartedDate(startedDate); cal.add(Calendar.DAY_OF_YEAR, 7); Date endedDate = cal.getTime(); conf.setEndedDate(endedDate); log.debug("new conference object:" + conf); return conf; } private Signup newSignup() { Signup signup = new Signup(); signup.setComment("test comments"); signup.setCompany("TestCompany"); signup.setCreatedDate(new Date()); signup.setEmail("test@test.com"); signup.setFirstName("Hantsy"); signup.setLastName("Bai"); signup.setOccupation("Developer"); signup.setPhone("123 222 444"); signup.setStatus(Status.PENDING); return signup; } @BeforeClass public static void init() { log.debug("==================before class========================="); } Long id; @Before // @Transactional(propagation = Propagation.REQUIRED) public void beforeTestCase() { log.debug("==================before test case========================="); transactionTemplate = new TransactionTemplate(transactionManager); transactionTemplate.execute(new TransactionCallback<Void>() { @Override public Void doInTransaction(TransactionStatus status) { Conference conference = newConference(); conference.setSlug("test-jud"); conference.setName("Test JUD"); SignupInfo signupInfo = new SignupInfo(); Signup signup1 = newSignup(); Signup signup2 = newSignup(); signup2.setEmail("testanother@tom.com"); signup1 = signupRepository.save(signup1); signup2 = signupRepository.save(signup2); // conference.addSignup(signup1); // conference.addSignup(signup2); signupInfo.getSignups().add(signup1); signupInfo.getSignups().add(signup2); conference.setSignupInfo(signupInfo); conference.setContact(new Contact("Hantsy")); em.persist(conference); em.flush(); id = conference.getId(); return null; } }); transactionTemplate.execute(new TransactionCallback<Void>() { @Override public Void doInTransaction(TransactionStatus status) { em.clear(); return null; } }); } @After @Transactional public void afterTestCase() { log.debug("==================after test case========================="); conferenceRepository.deleteAll(); } @Test @Transactional public void saveContactSignup() { log.debug("==================enter saveContanct and Signup========================="); Contact contact = contactRepository.save(new Contact("Hantsy")); log.debug("saved contact @" + contact.getId()); assertTrue(null != contact.getId()); Signup singup = signupRepository.save(newSignup()); log.debug("saved singup @" + singup.getId()); assertTrue(null != singup.getId()); } @Test // @Transactional(propagation = Propagation.REQUIRES_NEW) public void retrieveConference() { log.debug("==================enter retrieveConference========================="); assertTrue(null != id); Conference conf = em.find(Conference.class, id); log.debug("conf@@@" + conf); assertTrue(null != conf); // log.debug("contact id @@@" + conf.getContact().getId()); // assertTrue(null!=conf.getContact().getId()); /** * Id is not assigned by Spring data mongo....why@ */ assertTrue("Hantsy".equals(conf.getContact().getName())); // TODO does not support List log.debug("signup size @" + conf.getSignupInfo().getSignups().size()); assertTrue(2 == conf.getSignupInfo().getSignups().size()); } }