package de.ppi.samples.fuwesta.dao.api;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Date;
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.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.Tag;
import de.ppi.samples.fuwesta.model.User;
/**
* Test some functionality of {@link PostDao} to get an better understanding of
* JPA.
*
*/
@SpringBootTest(classes = FuWeStaServer.class,
webEnvironment = WebEnvironment.RANDOM_PORT)
public class PostDaoTest extends AbstractTransactionalJUnit4SpringContextTests {
/**
* Name of the table user.
*/
private static final String POST_TABLE_NAME = "POST";
/** The user dao. */
@Resource
private PostDao postDao;
/** The user dao. */
@Resource
private UserDao userDao;
/** The user dao. */
@Resource
private TagDao tagDao;
/** 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(POST_TABLE_NAME) > 0 || countRowsInTable("T_USER") > 0)) {
deleteFromTables("TAG_POSTINGS", "TAG", "POST", "T_USER");
deleted = true;
}
if (countRowsInTable(POST_TABLE_NAME) == 0) {
setSqlScriptEncoding("UTF-8");
executeSqlScript("classpath:post-data.sql", false);
}
}
// /**
// * @throws java.lang.Exception
// */
// @Before
// public void setUp() throws Exception {
// }
//
// /**
// * @throws java.lang.Exception
// */
// @After
// public void tearDown() throws Exception {
// }
/**
* Test method for
* {@link org.springframework.data.repository.CrudRepository#save(S)}.
*/
@SuppressWarnings("boxing")
@Test
@Rollback(true)
public void testSaveInsert() {
// Arrange
User user = userDao.findOne(1L);
Tag tag = tagDao.findOne(1L);
Post post = new Post();
post.setContent("Blafasel");
post.setCreationTime(new Date());
post.setTitle("JUnit");
post.setUser(user);
post.getTags().add(tag);
// Act
postDao.save(post);
// Assert
em.flush();
assertThat(countRowsInTable("TAG_POSTINGS")).isEqualTo(1);
}
/**
* Test method for
* {@link org.springframework.data.repository.CrudRepository#save(S)}.
*/
@SuppressWarnings("boxing")
@Test
@Rollback(true)
public void testSaveUpdate() {
// Arrange
User user = userDao.findOne(1L);
Tag tag = tagDao.findOne(2L);
final Post post = postDao.findOne(1L);
post.setUser(user);
post.getTags().add(tag);
final Post newPost = new Post();
newPost.setContent(post.getContent());
newPost.setCreationTime(post.getCreationTime());
newPost.setId(post.getId());
newPost.setTags(post.getTags());
newPost.setTitle(post.getTitle());
newPost.setUser(post.getUser());
newPost.setVersion(post.getVersion());
newPost.getTags().clear();
// Act
postDao.save(post);
// Assert
em.flush();
assertThat(countRowsInTable("TAG_POSTINGS")).isEqualTo(1);
}
}