package de.randi2.core.integration.modelDatabase;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import javax.persistence.OptimisticLockException;
import org.hibernate.StaleObjectStateException;
import org.junit.Before;
import org.junit.Test;
import org.springframework.transaction.annotation.Transactional;
import de.randi2.model.AbstractDomainObject;
import de.randi2.model.Login;
import de.randi2.testUtility.utility.AbstractDomainDatabaseTest;
public class AbstractDomainObjectDatabaseTest extends AbstractDomainDatabaseTest<AbstractDomainObject> {
private Login domainObject;
public AbstractDomainObjectDatabaseTest() {
super(AbstractDomainObject.class);
}
@Before
public void setUp() {
super.setUp();
domainObject = factory.getLogin();
}
@Test
@Transactional
public void testTimestamps() {
domainObject = factory.getLogin();
entityManager.persist(domainObject);
assertNotNull(domainObject.getCreatedAt());
assertNotNull(domainObject.getUpdatedAt());
domainObject.setUsername("hello@world.com");
domainObject = entityManager.merge(domainObject);
assertTrue(domainObject.getCreatedAt().before(domainObject.getUpdatedAt()) || domainObject.getCreatedAt().equals(domainObject.getUpdatedAt()));
}
@Test
@Transactional
public void testSave(){
domainObject = factory.getLogin();
entityManager.persist(domainObject);
entityManager.flush();
assertNotSame(AbstractDomainObject.NOT_YET_SAVED_ID, domainObject.getId());
assertTrue(domainObject.getId() > 0);
// assertEquals(0, domainObject.getVersion());
}
@Test
@Transactional
public void testOptimisticLocking() {
entityManager.persist(domainObject);
entityManager.flush();
entityManager.clear();
int version = domainObject.getVersion();
Login v1 = entityManager.find(Login.class, domainObject.getId());
entityManager.detach(v1);
Login v2 = entityManager.find(Login.class, domainObject.getId());
entityManager.detach(v2);
v1.setPassword("Aenderung$1");
v1 = entityManager.merge(v1);
entityManager.flush();
entityManager.clear();
assertTrue(version < v1.getVersion());
assertTrue(v2.getVersion() < v1.getVersion());
// v2.setPassword("Aenderung$2");
try {
v2 = entityManager.merge(v2);
fail("Should fail because of Version Conflicts");
} catch (OptimisticLockException e) {
entityManager.detach(v2);
}
Login v3 = entityManager.find(Login.class, domainObject.getId());
assertEquals(v1.getPassword(), v3.getPassword());
}
}