package de.ppi.samples.fuwesta.dao.api; import static org.assertj.core.api.Assertions.assertThat; import java.util.Iterator; import java.util.List; import javax.annotation.Resource; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.junit.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; import org.springframework.test.context.transaction.BeforeTransaction; import de.ppi.samples.fuwesta.FuWeStaServer; import de.ppi.samples.fuwesta.model.Post; import de.ppi.samples.fuwesta.model.User; /** * Class UserDaoTest. This test is more for demonstration what and how you can * test with spring-data. It tries to show the possibilities. How ever in a real * project it's useless to test generated source. * */ @SpringBootTest(classes = FuWeStaServer.class, webEnvironment = WebEnvironment.RANDOM_PORT) public class UserDaoTest extends AbstractTransactionalJUnit4SpringContextTests { /** * Name of the table user. */ private static final String USER_TABLE_NAME = "T_USER"; /** * Number of users in testdata. */ private static final int NUMBER_OF_USERS = 4; /** The user dao. */ @Resource private UserDao userDao; /** Flag that testdata are deleted. */ private boolean deleted = false; /** * The {@link EntityManager}. */ @PersistenceContext private EntityManager em; /** * Inserting Testdata. * * @throws Exception if something fails. */ @BeforeTransaction public void setupData() throws Exception { if (!deleted && countRowsInTable(USER_TABLE_NAME) > 0) { deleteFromTables("TAG_POSTINGS", "TAG", "POST", USER_TABLE_NAME); deleted = true; } if (countRowsInTable(USER_TABLE_NAME) == 0) { setSqlScriptEncoding("UTF-8"); executeSqlScript("classpath:user-data.sql", false); } } /** * Test method for {@link UserDao#findByFirstName(String)}. */ @Test public void testFindByFirstName() { User testUser = userDao.findByFirstName("Erwin"); assertThat(testUser).isNotNull(); assertThat(testUser.getFirstName()).isEqualTo("Erwin"); } /** * Test method for {@link UserDao#findDistinctUserByPostingsTitle(String)}. */ @Test @Rollback(true) public void testFindByPostingsTitle() { // Check that precondition are as expected. assertNumberOfEntries(NUMBER_OF_USERS); List<User> checkUsers = userDao.findDistinctUserByPostingsTitleLikeOrderByLastNameAsc("Test"); assertThat(checkUsers).isEmpty(); // arrange test-data final User dummyUser = userDao.findByUserId("emum"); List<User> testUser = userDao.findAllByFirstNameOrderByLastNameAsc("Erna"); assertThat(testUser).hasSize(2); for (User user : testUser) { final Post post = new Post(); post.setTitle("SomeTestTitel" + user.getId()); post.setUser(dummyUser); user.getPostings().add(post); } // act checkUsers = userDao.findDistinctUserByPostingsTitleLikeOrderByLastNameAsc("%Test%"); // assert that every thing is as expected assertThat(checkUsers).isNotNull(); assertThat(checkUsers).isEqualTo(testUser); assertNumberOfEntries(NUMBER_OF_USERS); assertThat(countRowsInTable("POST")).isEqualTo(2); } /** * Test method for {@link UserDao#nonsensFinder(String, String, String)}. */ @Test @Rollback(true) public void testNonsensFinder() { // Check that precondition are as expected. assertNumberOfEntries(NUMBER_OF_USERS); List<User> checkUsers = userDao.nonsensFinder("Erna", "Erwin", "Test"); assertThat(checkUsers).isEmpty(); // arrange test-data List<User> testUser = userDao.findAllByFirstNameOrderByLastNameAsc("Erna"); assertThat(testUser).hasSize(2); for (User user : testUser) { final Post post = new Post(); post.setTitle("Test"); user.getPostings().add(post); } // act checkUsers = userDao.nonsensFinder("Erna", "Erwin", "Test"); // assert that every thing is as expected assertThat(checkUsers).isNotNull(); assertThat(checkUsers).isEqualTo(testUser); assertNumberOfEntries(NUMBER_OF_USERS); assertThat(countRowsInTable("POST")).isEqualTo(2); } /** * Test method for * {@link UserDao#findAllByFirstNameOrderByLastNameAsc(String)} . */ @Test public void testFindAllByFirstNameOrderByLastNameAsc() { List<User> testUser = userDao.findAllByFirstNameOrderByLastNameAsc("Erna"); assertThat(testUser).isNotNull(); assertThat(testUser.get(0).getLastName()).isEqualTo("Musterfrau"); assertThat(testUser.get(1).getLastName()).isEqualTo("Müller"); } /** * Test method for * {@link UserDao#findAllByLastNameOrderByFirstNameDesc(String)}. */ @Test public void testFindAllByLastNameOrderByFirstNameDesc() { List<User> testUsers = userDao.findAllByLastNameOrderByFirstNameDesc("Mustermann"); assertThat(testUsers).isNotNull().hasSize(2); assertThat(testUsers.get(0).getFirstName()).isEqualTo("Max"); } /** * Test method for * {@link org.springframework.data.repository.PagingAndSortingRepository#findAll(org.springframework.data.domain.Sort)} * . */ @Test public void testFindAllSort() { final Sort sort = new Sort(new Sort.Order(Direction.DESC, "userId")); Iterator<User> userList = userDao.findAll(sort).iterator(); User user = userList.next(); assertThat(user.getUserId()).isEqualTo("mmum"); user = userList.next(); assertThat(user.getUserId()).isEqualTo("emüf"); user = userList.next(); assertThat(user.getUserId()).isEqualTo("emum"); user = userList.next(); assertThat(user.getUserId()).isEqualTo("emuf"); assertThat(userList.hasNext()).isFalse(); } /** * Test method for * {@link org.springframework.data.repository.PagingAndSortingRepository#findAll(org.springframework.data.domain.Pageable)} * . */ @Test public void testFindAllPageable() { final Sort sort = new Sort(new Sort.Order(Direction.DESC, "userId")); final int page = 0; final int pageSize = 2; final Page<User> testusers = userDao.findAll(new PageRequest(page, pageSize, sort)); assertThat(testusers).isNotNull(); assertThat(testusers.getNumber()).isEqualTo(page); assertThat(testusers.getSize()).isEqualTo(pageSize); assertThat(testusers.getNumberOfElements()).isEqualTo(2); assertThat(testusers.getTotalElements()).isEqualTo(NUMBER_OF_USERS); assertThat(testusers.getTotalPages()).isEqualTo(2); Iterator<User> userList = testusers.iterator(); User user = userList.next(); assertThat(user.getUserId()).isEqualTo("mmum"); user = userList.next(); assertThat(user.getUserId()).isEqualTo("emüf"); assertThat(userList.hasNext()).isFalse(); } /** * Test method for * {@link org.springframework.data.repository.PagingAndSortingRepository#findAll(org.springframework.data.domain.Pageable)} * . */ @Test public void testFindAllPageableWithNull() { final Page<User> testusers = userDao.findAll((PageRequest) null); assertThat(testusers).isNotNull(); assertThat(testusers.getNumber()).isEqualTo(0); assertThat(testusers.getSize()).isEqualTo(0); assertThat(testusers.getNumberOfElements()).isEqualTo(NUMBER_OF_USERS); assertThat(testusers.getTotalElements()).isEqualTo(NUMBER_OF_USERS); assertThat(testusers.getTotalPages()).isEqualTo(1); } /** * Test method for * {@link org.springframework.data.repository.CrudRepository#save(S)}. */ @Test @Rollback(true) public void testSaveS() { User testUser = new User(); testUser.setUserId("test"); Post post1 = new Post(); post1.setTitle("Test"); Post post2 = new Post(); post2.setTitle("Test2"); testUser.getPostings().add(post1); testUser.getPostings().add(post2); userDao.save(testUser); em.flush(); assertThat(userDao.findByUserId("test")).isEqualTo(testUser); } /** * Test method for * {@link org.springframework.data.repository.CrudRepository#save(java.lang.Iterable)} * . */ @Test public void testSaveIterableOfS() { // Not tested } /** * Test method for * {@link org.springframework.data.repository.CrudRepository#findOne(java.io.Serializable)} * . */ @Test public void testFindOne() { User testUser = userDao.findOne(Long.valueOf(1)); assertThat(testUser.getLastName()).isEqualTo("Mustermann"); } /** * Test method for * {@link org.springframework.data.repository.CrudRepository#exists(java.io.Serializable)} * . */ @Test public void testExists() { assertThat(userDao.exists(Long.valueOf(1))).isTrue(); } /** * Test method for * {@link org.springframework.data.repository.CrudRepository#findAll()}. */ @Test public void testFindAll() { // implicit tested with testDeleteIterableOfQextendsT } /** * Test method for * {@link org.springframework.data.repository.CrudRepository#findAll(java.lang.Iterable)} * . */ @Test public void testFindAllIterableOfID() { // Not tested } /** * Test method for * {@link org.springframework.data.repository.CrudRepository#count()}. */ @Test public void testCount() { assertThat(userDao.count()).isEqualTo(NUMBER_OF_USERS); } /** * Test method for {@link CustomUserDao#countNumberOfUsers()}. */ @Test public void testCountNumberOfUsers() { assertThat(userDao.countNumberOfUsers()).isEqualTo(NUMBER_OF_USERS); } /** * Test method for * {@link org.springframework.data.repository.CrudRepository#delete(java.io.Serializable)} * . */ @Test public void testDeleteID() { assertNumberOfEntries(NUMBER_OF_USERS); userDao.delete(Long.valueOf(1)); assertNumberOfEntries(NUMBER_OF_USERS - 1); assertThat(userDao.findByUserId("emum")).isNull(); } /** * Test method for * {@link org.springframework.data.repository.CrudRepository#delete(java.lang.Object)} * . */ @Test public void testDeleteT() { assertNumberOfEntries(NUMBER_OF_USERS); userDao.delete(userDao.findOne(Long.valueOf(1))); assertNumberOfEntries(NUMBER_OF_USERS - 1); assertThat(userDao.findByUserId("emum")).isNull(); } /** * Test method for * {@link org.springframework.data.repository.CrudRepository#delete(java.lang.Iterable)} * . */ @Test public void testDeleteIterableOfQextendsT() { assertNumberOfEntries(NUMBER_OF_USERS); userDao.delete(userDao.findAll()); assertNumberOfEntries(0); } /** * Test method for * {@link org.springframework.data.repository.CrudRepository#deleteAll()}. */ @Test public void testDeleteAll() { assertNumberOfEntries(NUMBER_OF_USERS); userDao.deleteAll(); assertNumberOfEntries(0); } /** * Assert that the number of entries in the table is the given numbers. * * @param expectedNumbers the number of expected entries. */ private void assertNumberOfEntries(int expectedNumbers) { em.flush(); assertThat(countRowsInTable(USER_TABLE_NAME)) .isEqualTo(expectedNumbers); } }