package org.tests.lifecycle;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import org.tests.model.basic.EBasicWithLifecycle;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class TestLifecycleAnnotatedBean extends BaseTestCase {
@Test
public void shouldExecutePrePersistMethodsWhenSavingBean() {
EBasicWithLifecycle bean = new EBasicWithLifecycle();
bean.setName("PrePersist");
Ebean.save(bean);
assertThat(bean.getBuffer()).contains("prePersist1");
assertThat(bean.getBuffer()).contains("prePersist2");
}
@Test
public void shouldExecutePostPersistMethodsWhenSavingBean() {
EBasicWithLifecycle bean = new EBasicWithLifecycle();
bean.setName("PostPersist");
Ebean.save(bean);
assertThat(bean.getBuffer()).contains("postPersist1");
assertThat(bean.getBuffer()).contains("postPersist2");
}
@Test
public void shouldExecutePostLoadMethodsWhenFindingBean() {
EBasicWithLifecycle bean = new EBasicWithLifecycle();
bean.setName("PostLoad");
Ebean.save(bean);
EBasicWithLifecycle loaded = Ebean.find(EBasicWithLifecycle.class, bean.getId());
assertThat(loaded.getBuffer()).contains("postLoad1");
assertThat(loaded.getBuffer()).contains("postLoad2");
}
@Test
public void shouldExecutePreUpdateMethodsWhenUpdatingBean() {
EBasicWithLifecycle bean = new EBasicWithLifecycle();
bean.setName("Persisted");
Ebean.save(bean);
bean.setName("PreUpdate");
Ebean.save(bean);
assertThat(bean.getBuffer()).contains("preUpdate1");
assertThat(bean.getBuffer()).contains("preUpdate2");
}
@Test
public void shouldExecutePostUpdateMethodsWhenUpdatingBean() {
EBasicWithLifecycle bean = new EBasicWithLifecycle();
bean.setName("Persisted");
Ebean.save(bean);
bean.setName("PostUpdate");
Ebean.save(bean);
assertThat(bean.getBuffer()).contains("postUpdate1");
assertThat(bean.getBuffer()).contains("postUpdate2");
}
@Test
public void shouldExecutePreRemoveMethodsWhenRemovingBean() {
EBasicWithLifecycle bean = new EBasicWithLifecycle();
bean.setName("Persisted");
Ebean.save(bean);
Ebean.delete(bean);
assertThat(bean.getBuffer()).contains("preSoftDelete");
assertThat(bean.getBuffer()).contains("postSoftDelete");
Ebean.deletePermanent(bean);
assertThat(bean.getBuffer()).contains("preRemove1");
assertThat(bean.getBuffer()).contains("preRemove2");
assertThat(bean.getBuffer()).contains("postRemove1");
assertThat(bean.getBuffer()).contains("postRemove2");
}
@Test
public void shouldExecutePostRemoveMethodsWhenRemovingBean() {
EBasicWithLifecycle bean = new EBasicWithLifecycle();
bean.setName("Persisted");
Ebean.save(bean);
Ebean.deletePermanent(bean);
assertThat(bean.getBuffer()).contains("postRemove1");
assertThat(bean.getBuffer()).contains("postRemove2");
}
@Test
public void shouldExecutePostConstructMethodsWhenFindingBean() {
EBasicWithLifecycle bean = new EBasicWithLifecycle();
bean.setName("PostConstruct");
Ebean.save(bean);
EBasicWithLifecycle loaded = Ebean.find(EBasicWithLifecycle.class, bean.getId());
assertThat(loaded.getBuffer()).contains("postConstruct1");
assertThat(loaded.getBuffer()).contains("postConstruct2");
// assert also that postLoad was executed
assertThat(loaded.getBuffer()).contains("postLoad1");
assertThat(loaded.getBuffer()).contains("postLoad2");
}
@Test
public void shouldExecutePostConstructMethodsWhenInstantiated() {
EBasicWithLifecycle bean = Ebean.getDefaultServer().createEntityBean(EBasicWithLifecycle.class);
bean.setName("PostConstruct");
assertThat(bean.getBuffer()).contains("postConstruct1");
assertThat(bean.getBuffer()).contains("postConstruct2");
// assert also that postLoad is not executed now
assertThat(bean.getBuffer()).doesNotContain("postLoad1");
assertThat(bean.getBuffer()).doesNotContain("postLoad2");
}
@Test
public void testLazyLoadBehaviour() {
EBasicWithLifecycle bean = new EBasicWithLifecycle();
bean.setName("LazyLoad");
Ebean.save(bean);
BeanDescriptor<EBasicWithLifecycle> desc = ((SpiEbeanServer) server()).getBeanDescriptor(EBasicWithLifecycle.class);
EBasicWithLifecycle loaded = desc.createReference(false, false, bean.getId(), null);
// Here you see the big difference.
// @PostLoad is executed always, also on lazy loaded beans
assertThat(loaded.getBuffer()).contains("postConstruct1");
assertThat(loaded.getBuffer()).contains("postConstruct2");
// assert also that postLoad is not yet executed
assertThat(loaded.getBuffer()).doesNotContain("postLoad1");
assertThat(loaded.getBuffer()).doesNotContain("postLoad2");
// now read name -> will load the bean
assertThat(loaded.getName()).isEqualTo("LazyLoad");
assertThat(loaded.getBuffer()).contains("postLoad1");
assertThat(loaded.getBuffer()).contains("postLoad2");
}
}