package fr.openwide.core.test.wicket.more.model; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.apache.wicket.model.IModel; import org.hamcrest.CoreMatchers; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import com.google.common.base.Equivalence; import fr.openwide.core.test.wicket.more.business.person.model.Person; import fr.openwide.core.test.wicket.more.business.person.service.IPersonService; public abstract class AbstractTestGenericEntityModel extends AbstractTestModel<Person> { @Autowired private IPersonService personService; @PersistenceContext private EntityManager entityManager; public AbstractTestGenericEntityModel() { super(Equivalence.equals()); } protected abstract IModel<Person> createModel(); protected abstract IModel<Person> createModel(Person person); @Test public void testNotAttached() { IModel<Person> model = createModel(); model = serializeAndDeserialize(model); assertNull(model.getObject()); } @Test public void testAttachedNull() { IModel<Person> model = createModel(null); model = serializeAndDeserialize(model); assertNull(model.getObject()); } @Test public void testAttachedWhenTransient() { Person person = new Person("John", "Doe"); IModel<Person> model = createModel(person); model = serializeAndDeserialize(model); assertThat(model.getObject(), CoreMatchers.not(isEquivalent(person))); } @Test public void testAttachedWhenPersisted() throws Exception { Person person = new Person("John", "Doe"); personService.create(person); assertThat(person, isAttachedToSession()); IModel<Person> model = createModel(person); assertThat(model.getObject(), isAttachedToSession()); model = serializeAndDeserialize(model); assertThat(model.getObject(), isEquivalent(person)); assertThat(person, isAttachedToSession()); assertThat(model.getObject(), isAttachedToSession()); } @Test public void testAttachedWhenTransientAndDetachedWhenPersisted() throws Exception { Person person = new Person("John", "Doe"); IModel<Person> model = createModel(person); personService.create(person); assertThat(person, isAttachedToSession()); assertThat(model.getObject(), isAttachedToSession()); model = serializeAndDeserialize(model); assertThat(model.getObject(), isEquivalent(person)); assertThat(person, isAttachedToSession()); assertThat(model.getObject(), isAttachedToSession()); } @Test public void testAttachedWhenPersistedAndDetachedWhenTransient() throws Exception { Person person = new Person("John", "Doe"); personService.create(person); assertThat(person, isAttachedToSession()); IModel<Person> model = createModel(person); assertThat(model.getObject(), isAttachedToSession()); personService.delete(person); model = serializeAndDeserialize(model); assertNull(model.getObject()); // Tries to load an entity whose id no longer exists => null } @Test public void testDetachedWhenTransientThenDetachedWhenPersisted() throws Exception { Person person = new Person("John", "Doe"); IModel<Person> model = createModel(person); model.detach(); // First detach() // Simulate work on the same object obtained from another model personService.create(person); assertThat(person, isAttachedToSession()); model = serializeAndDeserialize(model); // Includes a second detach() assertThat(model.getObject(), isEquivalent(person)); assertThat(person, isAttachedToSession()); assertThat(model.getObject(), isAttachedToSession()); } }