From 0d2101ca7c8da64ba3a6c02f63be7efbc8d851cd Mon Sep 17 00:00:00 2001 From: Wolfgang Buchner Date: Tue, 7 May 2013 20:53:58 +0200 Subject: [PATCH] unit tests for: stateless updates which fails when executing without changes --- .../tests/update/TestStatelessUpdate.java | 66 ++++++++++++++++++- .../avaje/tests/update/TestUpdatePartial.java | 19 ++++++ 2 files changed, 83 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/avaje/tests/update/TestStatelessUpdate.java b/src/test/java/com/avaje/tests/update/TestStatelessUpdate.java index d1cd9b514..4f9e96d4d 100644 --- a/src/test/java/com/avaje/tests/update/TestStatelessUpdate.java +++ b/src/test/java/com/avaje/tests/update/TestStatelessUpdate.java @@ -1,5 +1,8 @@ package com.avaje.tests.update; +import com.avaje.tests.model.basic.Customer; +import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import com.avaje.ebean.BaseTestCase; @@ -10,14 +13,19 @@ import com.avaje.tests.model.basic.EBasic.Status; public class TestStatelessUpdate extends BaseTestCase { + private EbeanServer server; + + @Before + public void setUp() { + server = Ebean.getServer(null); + } + @Test public void test() { // GlobalProperties.put("ebean.defaultUpdateNullProperties", "true"); // GlobalProperties.put("ebean.defaultDeleteMissingChildren", "false"); - EbeanServer server = Ebean.getServer(null); - EBasic e = new EBasic(); e.setName("something"); e.setStatus(Status.NEW); @@ -38,4 +46,58 @@ public class TestStatelessUpdate extends BaseTestCase { server.update(updateDeflt); } + + /** + * I am expecting that Ebean detects there aren't any changes and don't execute any query. + * Currently a {@link javax.persistence.PersistenceException} with message 'Invalid value "null" for parameter "SQL"' is thrown. + */ + @Test + public void testWithoutChangesAndIgnoreNullValues() { + // arrange + EBasic basic = new EBasic(); + basic.setName("something"); + basic.setStatus(Status.NEW); + basic.setDescription("wow"); + + server.save(basic); + + // act + EBasic basicWithoutChanges = new EBasic(); + basicWithoutChanges.setId(basic.getId()); + server.update(basicWithoutChanges, null, null, true, false); + + // assert + // Nothing to check, simply no exception should occur + // maybe ensure that no update has been executed + } + + /** + * Nice to have: + *
+ * Assuming we have a Version column, it will always be generated an Update despite we have nothing to update. + * It would be nice that this would be recognized and no update would happen. + *
+ *
+ * This feature already works for normal Updates! + *
+ * see: {@link com.avaje.tests.update.TestUpdatePartial#testWithoutChangesAndVersionColumn()} + */ + @Test + public void testWithoutChangesAndVersionColumnAndIgnoreNullValues() { + // arrange + Customer customer = new Customer(); + customer.setName("something"); + + server.save(customer); + + // act + Customer customerWithoutChanges = new Customer(); + customerWithoutChanges.setId(customer.getId()); + server.update(customerWithoutChanges, null, null, true, false); + + Customer result = Ebean.find(Customer.class, customer.getId()); + + // assert + Assert.assertEquals(customer.getUpdtime().getTime(), result.getUpdtime().getTime()); + } } diff --git a/src/test/java/com/avaje/tests/update/TestUpdatePartial.java b/src/test/java/com/avaje/tests/update/TestUpdatePartial.java index 9aa9946be..683333fa0 100644 --- a/src/test/java/com/avaje/tests/update/TestUpdatePartial.java +++ b/src/test/java/com/avaje/tests/update/TestUpdatePartial.java @@ -39,4 +39,23 @@ public class TestUpdatePartial extends BaseTestCase { Ebean.save(c3); } + + /** + * If we have no changes detected, don't execute an Update and don't update the Version column. + */ + @Test + public void testWithoutChangesAndVersionColumn() { + // arrange + Customer customer = new Customer(); + customer.setName("something"); + + Ebean.save(customer); + + // act + Customer customerWithoutChanges = Ebean.find(Customer.class, customer.getId()); + Ebean.save(customerWithoutChanges); + + // assert + Assert.assertEquals(customer.getUpdtime().getTime(), customerWithoutChanges.getUpdtime().getTime()); + } }