package egovframework.rte.psl.data.mongodb; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.List; import egovframework.rte.psl.data.mongodb.domain.Address; import egovframework.rte.psl.data.mongodb.domain.Person; import egovframework.rte.psl.data.mongodb.repository.PersonRepository; import javax.annotation.PostConstruct; import javax.annotation.Resource; import org.junit.After; import org.junit.Before; 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.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Metrics; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.mongodb.BasicDBObject; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath*:META-INF/spring/context-data-*.xml") public class PersonRepositoryTest { private static final Logger LOGGER = LoggerFactory.getLogger(PersonRepositoryTest.class); @Autowired private PersonRepository repository; // to use GeoSpatial methods (create 2d index) @Resource(name="mongoTemplate") private MongoTemplate mongoTemplate; private Person makePerson() { Person person = new Person(); person.setFirstname("Gildong"); person.setLastname("Hong"); Address address = new Address(); address.setZipCode("100-100"); address.setAddress("Seoul, Korea"); person.setAddress(address); person.setLocation(new double[] {43.0, 48.0}); return person; } @PostConstruct public void before() { mongoTemplate.getCollection("person").createIndex(new BasicDBObject("location", "2d")); } @Before public void setUp() { Person person = makePerson(); person = repository.save(person); LOGGER.info("Persion ID : " + person.getId()); } @After public void tearDown() { repository.deleteAll(); } @Test public void readsFirstPageCorrectly() { Page<Person> persons = repository.findAll(new PageRequest(0, 10)); LOGGER.info("Persons Total elements : " + persons.getTotalElements()); assertTrue(persons.isFirst()); } @Test public void testQueryMethods() { List<Person> list = repository.findByLastname("Hong"); LOGGER.info("Number of Hong = : " + list.size()); assertEquals(1, list.size()); Page<Person> persons = repository.findByFirstname("Gildong", new PageRequest(0, 10)); assertTrue(persons.isFirst()); assertEquals(1L, persons.getTotalElements()); assertEquals(1, persons.getTotalPages()); Person hong = list.get(0); LOGGER.info("Hong Person id = " + hong.getId()); Address address = hong.getAddress(); Person found = repository.findByAddress(address); LOGGER.info("Found Person id = " + hong.getId()); assertEquals(hong, found); } @Test public void testDeleteMothods() { Long deleted = repository.deletePersonByLastname("Hong"); assertEquals(1L, deleted.longValue()); List<Person> list = repository.deleteByLastname("Hong"); assertEquals(0, list.size()); } @Test public void testGeoSpatialMethods() { // To test, run mondo command "db.person.ensureIndex( {location: "2d"} )" Point point = new Point(43.1, 48.1); Distance distance = new Distance(200, Metrics.KILOMETERS); List<Person> list = repository.findByLocationNear(point, distance); assertEquals(1, list.size()); } @Test public void testQueryAnnotation() { List<Person> list = repository.findByThePersonsFirstname("Gildong"); assertEquals(1, list.size()); } }