From 68649d0e98634c2f437251a1c16219990f951eff Mon Sep 17 00:00:00 2001 From: Michael Benz Date: Thu, 5 Jul 2018 09:52:40 +0200 Subject: [PATCH] =?UTF-8?q?Failing=20unit=20test=20to=20demonstrate=20the?= =?UTF-8?q?=20bug=20that=20deleting=20an=20entity=20via=20=E2=80=A6=20(#14?= =?UTF-8?q?45)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Failing unit test to demonstrate the bug that deleting an entity via an Ebean query does not respect the cascade setting. (here a mapped optional OneToOne entity is not deleted using an Ebean query even if the CascadeType.ALL was used) * moved init and cleanup code to @Before and @After JUnit methods and added another test that shows Ebean.delete() works as expected --- .../delete/TestDeleteCascadeByQuery.java | 76 +++++++++++++++++++ .../org/tests/model/onetoone/OtoUser.java | 31 ++++++++ .../tests/model/onetoone/OtoUserOptional.java | 22 ++++++ 3 files changed, 129 insertions(+) create mode 100644 src/test/java/org/tests/basic/delete/TestDeleteCascadeByQuery.java create mode 100644 src/test/java/org/tests/model/onetoone/OtoUser.java create mode 100644 src/test/java/org/tests/model/onetoone/OtoUserOptional.java diff --git a/src/test/java/org/tests/basic/delete/TestDeleteCascadeByQuery.java b/src/test/java/org/tests/basic/delete/TestDeleteCascadeByQuery.java new file mode 100644 index 000000000..5da596325 --- /dev/null +++ b/src/test/java/org/tests/basic/delete/TestDeleteCascadeByQuery.java @@ -0,0 +1,76 @@ +package org.tests.basic.delete; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.ebean.BaseTestCase; +import io.ebean.Ebean; +import io.ebean.Query; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import org.tests.model.onetoone.OtoUser; +import org.tests.model.onetoone.OtoUserOptional; + +public class TestDeleteCascadeByQuery extends BaseTestCase { + + private OtoUser testUser; + private OtoUserOptional userOptional; + private Query userOptionalQuery = Ebean.find(OtoUserOptional.class); + private Query userQuery = Ebean.find(OtoUser.class); + + /** + * Init each test. Delete all existing beans. Then create OtoUser, add OtoUserOptional and save. + */ + @Before + public void init() { + Ebean.deleteAll(userQuery.findList()); + Ebean.deleteAll(userOptionalQuery.findList()); + + userOptional = new OtoUserOptional(); + Ebean.save(userOptional); + testUser = new OtoUser(); + testUser.setOptional(userOptional); + Ebean.save(testUser); + } + + /** + * Test that validates deleting a bean using Ebean.delete() respects the CascadeType.DELETE + * setting. + */ + @Test + public void testDeleteCascadeByEbeanDelete() { + + assertThat(Ebean.delete(testUser)).isTrue(); + + assertThat(userOptionalQuery.findCount()) + .overridingErrorMessage("Entity OtoUserOptional found. Ebean.delete() on the user " + + "did not delete the OneToOne mapped entity as set with CascadeType.ALL") + .isEqualTo(0); + } + + /** + * Test that validates deleting a bean with OneToOne mapping with a query respects the + * CascadeType.DELETE setting. + */ + @Test + public void testDeleteCascadeByQuery() { + + assertThat(userQuery.delete()).isEqualTo(1); + + assertThat(userOptionalQuery.findCount()) + .overridingErrorMessage("Entity OtoUserOptional found. Ebean query delete() on the user " + + "did not delete the OneToOne mapped entity as set with CascadeType.ALL") + .isEqualTo(0); + } + + /** + * Cleanup - Delete all existing beans for the next test. + */ + @After + public void cleanup() { + Ebean.deleteAll(userQuery.findList()); + Ebean.deleteAll(userOptionalQuery.findList()); + } +} diff --git a/src/test/java/org/tests/model/onetoone/OtoUser.java b/src/test/java/org/tests/model/onetoone/OtoUser.java new file mode 100644 index 000000000..d6ff1b6ae --- /dev/null +++ b/src/test/java/org/tests/model/onetoone/OtoUser.java @@ -0,0 +1,31 @@ +package org.tests.model.onetoone; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +import org.tests.model.BaseModel; + +@Entity +@Table(name = "oto_user_model") +public class OtoUser extends BaseModel { + + String name; + + @OneToOne(optional = true, cascade = CascadeType.ALL) + OtoUserOptional userOptional; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public void setOptional(OtoUserOptional userOptional) { + this.userOptional = userOptional; + } + +} diff --git a/src/test/java/org/tests/model/onetoone/OtoUserOptional.java b/src/test/java/org/tests/model/onetoone/OtoUserOptional.java new file mode 100644 index 000000000..3fb1fe19d --- /dev/null +++ b/src/test/java/org/tests/model/onetoone/OtoUserOptional.java @@ -0,0 +1,22 @@ +package org.tests.model.onetoone; + +import javax.persistence.Entity; +import javax.persistence.Table; + +import org.tests.model.BaseModel; + +@Entity +@Table(name = "oto_user_model_optional") +public class OtoUserOptional extends BaseModel { + + String optional; + + public void setPassword(final String optional) { + this.optional = optional; + } + + String getOptional() { + return optional; + } + +}