package com.hantsylabs.example.spring.dao; import static org.junit.Assert.assertTrue; import java.util.Calendar; import java.util.Date; import java.util.List; 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.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.repository.support.*; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.hantsylabs.example.spring.config.MongoConfig; import com.hantsylabs.example.spring.model.Address; import com.hantsylabs.example.spring.model.Conference; import com.hantsylabs.example.spring.model.QConference; import com.hantsylabs.example.spring.model.QSignup; import com.hantsylabs.example.spring.model.Signup; import com.hantsylabs.example.spring.model.Status; import com.hantsylabs.example.spring.mongo.ConferenceRepository; import com.hantsylabs.example.spring.mongo.SignupRepository; import com.mysema.query.BooleanBuilder; import com.mysema.query.mongodb.JoinBuilder; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) public class ConferencRepositoryImplTest { private static final Logger log = LoggerFactory .getLogger(ConferencRepositoryImplTest.class); @Autowired private ConferenceRepository conferenceRepository; @Autowired private SignupRepository signupRepository; @Autowired MongoTemplate mongoTemplate; 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); conf.setAddress(newAddress()); log.debug("new conference object:" + conf); return conf; } private Address newAddress() { Address address = new Address(); address.setAddressLine1("address line 1"); address.setAddressLine2("address line 2"); address.setCity("NY"); address.setCountry("CN"); address.setZipCode("510000"); return address; } 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 beforeClass() { log.debug("==================before class========================="); } @Before public void beforeTestCase() { log.debug("==================before test case========================="); signupRepository.deleteAll(); conferenceRepository.deleteAll(); // conferenceRepository.save(newConference()); } @After public void afterTestCase() { log.debug("==================after test case========================="); // signupRepository.deleteAll(); // conferenceRepository.deleteAll(); } @Test public void retrieveConference() { Conference conference = newConference(); conference.setSlug("test-jud"); conference.setName("Test JUD"); conference.getAddress().setCountry("CN"); conference = conferenceRepository.save(conference); assertTrue(null != conference.getId()); conference = conferenceRepository.findBySlug("test-jud"); assertTrue(null != conference); List<Conference> confs = conferenceRepository .findByAddressCountry("CN"); log.debug("findByAddressCountry@" + confs.size()); assertTrue(1 == confs.size()); Conference conference2 = newConference(); conference2.setSlug("test-jud"); conference2.setName("Test JUD"); conference2.getAddress().setCountry("US"); conference2 = conferenceRepository.save(conference2); confs = conferenceRepository.searchByDescription("Boston"); log.debug("searchByDescription@" + confs.size()); assertTrue(2 == confs.size()); confs = conferenceRepository.findByDescriptionLike("Boston"); log.debug("findByDescriptionLike@" + confs.size()); assertTrue(2 == confs.size()); confs = conferenceRepository.findByDescriptionRegex(".*Boston.*"); log.debug("findByDescriptionRegex@" + confs.size()); assertTrue(2 == confs.size()); Signup signup = newSignup(); signup.setConference(conference); signupRepository.save(signup); assertTrue(null != signup.getId()); List<Signup> signups = signupRepository.findByConference(conference); assertTrue(1 == signups.size()); Signup signup2 = newSignup(); signup2.setComment("another comments"); signup2.setConference(conference); signupRepository.save(signup2); assertTrue(null != signup2.getId()); List<Signup> signups2 = signupRepository.findByConference(conference); assertTrue(2 == signups2.size()); } @Test public void updateConference() { Conference conference = newConference(); conference.setSlug("test-jud"); conference.setName("Test JUD"); conference.getAddress().setCountry("US"); conference = conferenceRepository.save(conference); String cid = conference.getId(); log.debug("saved conference id@" + cid); assertTrue(null != cid); conference = conferenceRepository.findBySlug("test-jud"); assertTrue(null != conference); conferenceRepository.updateConferenceDescription("MyDesc", cid); Conference conf = conferenceRepository.findOne(cid); assertTrue("MyDesc".equals(conf.getDescription())); } @Test public void retrieveConferenceByQueryDSL() { Conference conference = newConference(); conference.setSlug("test-jud"); conference.setName("Test JUD"); conference.getAddress().setCountry("US"); conference = conferenceRepository.save(conference); log.debug("conference @" + conference); String cid = conference.getId(); log.debug("saved conference id @" + cid); assertTrue(null != cid); QConference qconf = QConference.conference; List<Conference> conferences = (List<Conference>) conferenceRepository .findAll(qconf.slug.eq("test-jud")); log.debug("conferences.size()@" + conferences.size()); assertTrue(1 == conferences.size()); List<Conference> conferences2 = (List<Conference>) conferenceRepository .findAll(QConference.conference.address.country.eq("US")); log.debug("conferences2.size()@" + conferences2.size()); assertTrue(1 == conferences2.size()); Conference conf = conferenceRepository.findOne(cid); Signup signup = newSignup(); signup.setConference(conf); signup = signupRepository.save(signup); log.debug("signup @" + signup); assertTrue(null != signup.getId()); List<Signup> signups = mongoTemplate.find( Query.query(Criteria.where("conference").is(conf)), Signup.class); // List<Signup> signups = (List<Signup>) signupRepository // .findAll(QSignup.signup.conference.eq(conf)); // log.debug("signups.size()@" + signups.size()); assertTrue(1 == signups.size()); Signup signup2 = newSignup(); signup2.setComment("another comments"); signup2.setConference(conf); signup2 = signupRepository.save(signup2); log.debug("signup2 @" + signup2); assertTrue(null != signup2.getId()); // List<Signup> signups2 = (List<Signup>) signupRepository // .findAll(QSignup.signup.conference.eq(conf)); List<Signup> signups2 = mongoTemplate.find( Query.query(Criteria.where("conference").is(conf)), Signup.class); log.debug("signups2.size()@" + signups2.size()); assertTrue(2 == signups2.size()); } @Test public void testMongodbQuery() { Conference conference = newConference(); conference.setSlug("test-jud"); conference.setName("Test JUD"); conference.getAddress().setCountry("US"); conference = conferenceRepository.save(conference); log.debug("conference @" + conference); String cid = conference.getId(); log.debug("saved conference id @" + cid); assertTrue(null != cid); Conference conf = conferenceRepository.findOne(cid); Signup signup = newSignup(); signup.setConference(conf); signup = signupRepository.save(signup); log.debug("signup @" + signup); // TODO does not work as expected. List<Signup> signups1 = mongoTemplate.find( Query.query(Criteria.where("conference").is(conf)), Signup.class); log.debug("signups1.size()@" + signups1.size()); assertTrue(1 == signups1.size()); // QSignup qsignup = QSignup.signup; // QConference qconf = QConference.conference; // // BooleanBuilder booleanBuilder=new BooleanBuilder(); // booleanBuilder.and(qsignup.conference.id.eq(conf.getId())); // // // List<Signup> signups = (List<Signup>) // signupRepository.findAll(booleanBuilder); // // log.debug("signups.size()@" + signups.size()); // assertTrue(1 == signups.size()); } }