package de.ppi.samples.fuwesta.service.impl;
import static org.assertj.core.api.Assertions.assertThat;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TransactionRequiredException;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import de.ppi.samples.fuwesta.FuWeStaServer;
import de.ppi.samples.fuwesta.model.User;
import de.ppi.samples.fuwesta.service.api.UserService;
/**
* Class for testing @link {@link UserServiceImpl} in with attach and detach.
*
*/
@SpringBootTest(classes = FuWeStaServer.class,
webEnvironment = WebEnvironment.RANDOM_PORT)
public class UserServiceImplControllerTest extends
AbstractTransactionalJUnit4SpringContextTests {
/** The user service. */
@Resource(name = "userService")
private UserService userService;
/**
* The {@link EntityManager}.
*/
@PersistenceContext
private EntityManager em;
/**
* Test how the Entities are attached and detached.
*/
@Test
public void testDetach() {
// Arrange
User testUser = new User("testId1");
Long id = userService.save(testUser).getId();
resetEntityManager();
testUser = userService.read(id);
testUser.setFirstName("FirstName");
resetEntityManager();
// Act
testUser = userService.read(id);
// Assert
assertThat(testUser.getFirstName()).isNullOrEmpty();
}
/**
* Test how the Entities are attached and detached.
*/
@Test
public void testAttach() {
// Arrange
final String firstName = "FirstName";
User testUser = new User("testId2");
Long id = userService.save(testUser).getId();
resetEntityManager();
testUser = userService.read(id);
testUser.setFirstName(firstName);
userService.save(testUser);
em.flush();
resetEntityManager();
// Act
testUser = userService.read(id);
// Assert
assertThat(testUser.getFirstName()).isEqualTo(firstName);
}
/**
* Reset entity-Manager this should fail (no-transaction), but to be sure.
*/
private void resetEntityManager() {
try {
em.clear();
} catch (TransactionRequiredException e) {
// expected.
}
}
}