v4 refactor for diff() support

This commit is contained in:
Rob Bygrave
2014-04-21 12:34:51 +12:00
parent 2344f57f84
commit 5e2d592c2a
3 changed files with 363 additions and 95 deletions
@@ -0,0 +1,147 @@
package com.avaje.ebeaninternal.server.core;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.Map;
import java.util.Set;
import org.junit.Assert;
import org.junit.Test;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.EbeanServer;
import com.avaje.ebean.ValuePair;
import com.avaje.ebeaninternal.api.SpiEbeanServer;
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
import com.avaje.tests.model.basic.Customer;
import com.avaje.tests.model.basic.Order;
import com.avaje.tests.model.basic.Order.Status;
public class TestDiffHelpSimple extends BaseTestCase {
DiffHelp diffHelp = new DiffHelp();
long firstTime = System.currentTimeMillis()-10000;
long secondTime = System.currentTimeMillis();
EbeanServer server;
BeanDescriptor<Order> orderDesc;
public TestDiffHelpSimple() {
server = Ebean.getServer(null);
SpiEbeanServer spiServer = (SpiEbeanServer)server;
orderDesc = spiServer.getBeanDescriptor(Order.class);
}
private Order createBaseOrder(EbeanServer server) {
Order order1 = new Order();
order1.setId(12);
order1.setCretime(new Timestamp(firstTime));
order1.setCustomer(server.getReference(Customer.class, 1234));
order1.setStatus(Status.NEW);
order1.setShipDate(new Date(firstTime));
order1.setOrderDate(new Date(firstTime));
return order1;
}
@Test
public void testBasicChanges() {
Order order1 = createBaseOrder(server);
Order order2 = new Order();
order2.setId(14);
order2.setCretime(new Timestamp(secondTime));
order2.setCustomer(server.getReference(Customer.class, 2133));
order2.setStatus(Status.COMPLETE);
order2.setShipDate(new Date(secondTime));
order2.setOrderDate(new Date(secondTime));
Map<String, ValuePair> diff = diffHelp.diff(order1, order2, orderDesc);
Assert.assertEquals(5, diff.size());
Set<String> keySet = diff.keySet();
Assert.assertTrue(keySet.contains("cretime"));
Assert.assertTrue(keySet.contains("status"));
Assert.assertTrue(keySet.contains("shipDate"));
Assert.assertTrue(keySet.contains("orderDate"));
Assert.assertTrue(keySet.contains("customer"));
}
@Test
public void testIdIgnored() {
Order order1 = createBaseOrder(server);
Order order2 = createBaseOrder(server);
order2.setId(14);
Map<String, ValuePair> diff = diffHelp.diff(order1, order2, orderDesc);
Assert.assertEquals(0, diff.size());
}
@Test
public void testSecondValueNull() {
Order order1 = createBaseOrder(server);
Order order2 = createBaseOrder(server);
order2.setCustomer(server.getReference(Customer.class, 2133));
order2.setStatus(Status.COMPLETE);
order2.setShipDate(null);
Map<String, ValuePair> diff = diffHelp.diff(order1, order2, orderDesc);
Assert.assertEquals(3, diff.size());
Set<String> keySet = diff.keySet();
Assert.assertTrue(keySet.contains("status"));
Assert.assertTrue(keySet.contains("customer"));
Assert.assertTrue(keySet.contains("shipDate"));
ValuePair shipDatePair = diff.get("shipDate");
Assert.assertEquals(order1.getShipDate(),shipDatePair.getNewValue());
Assert.assertEquals(order2.getShipDate(),shipDatePair.getOldValue());
Assert.assertNull(shipDatePair.getOldValue());
}
@Test
public void testFirstValueNull() {
Order order1 = createBaseOrder(server);
order1.setShipDate(null);
Order order2 = createBaseOrder(server);
order2.setShipDate(new Date(secondTime));
Map<String, ValuePair> diff = diffHelp.diff(order1, order2, orderDesc);
Assert.assertEquals(1, diff.size());
Set<String> keySet = diff.keySet();
Assert.assertTrue(keySet.contains("shipDate"));
ValuePair shipDatePair = diff.get("shipDate");
Assert.assertEquals(order1.getShipDate(),shipDatePair.getNewValue());
Assert.assertEquals(order2.getShipDate(),shipDatePair.getOldValue());
Assert.assertNull(shipDatePair.getNewValue());
}
@Test
public void testBothNull() {
Order order1 = createBaseOrder(server);
order1.setShipDate(null);
Order order2 = createBaseOrder(server);
order2.setShipDate(null);
Map<String, ValuePair> diff = diffHelp.diff(order1, order2, orderDesc);
Assert.assertEquals(0, diff.size());
}
}
@@ -0,0 +1,129 @@
package com.avaje.ebeaninternal.server.core;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.EbeanServer;
import com.avaje.ebean.ValuePair;
import com.avaje.ebeaninternal.api.SpiEbeanServer;
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
import com.avaje.tests.model.embedded.EMain;
import com.avaje.tests.model.embedded.Eembeddable;
public class TestDiffHelpWithEmbedded extends BaseTestCase {
DiffHelp diffHelp = new DiffHelp();
EbeanServer server;
BeanDescriptor<EMain> emainDesc;
public TestDiffHelpWithEmbedded() {
server = Ebean.getServer(null);
SpiEbeanServer spiServer = (SpiEbeanServer)server;
emainDesc = spiServer.getBeanDescriptor(EMain.class);
}
@Test
public void testChangeExistingEmbedded() {
EMain emain1 = createEMain();
EMain emain2 = createEMain();
emain2.getEmbeddable().setDescription("baz");
Map<String, ValuePair> diff = diffHelp.diff(emain1, emain2, emainDesc);
Assert.assertEquals(1, diff.size());
ValuePair valuePair = diff.get("embeddable.description");
Assert.assertNotNull(valuePair);
Assert.assertEquals("bar",valuePair.getNewValue());
Assert.assertEquals("baz",valuePair.getOldValue());
}
/**
* Same result as testChangeExistingEmbedded.
*/
@Test
public void testSetViaNewEmbedded() {
EMain emain1 = createEMain();
EMain emain2 = createEMain();
Eembeddable embeddable = new Eembeddable();
embeddable.setDescription("baz");
emain2.setEmbeddable(embeddable);
Map<String, ValuePair> diff = diffHelp.diff(emain1, emain2, emainDesc);
Assert.assertEquals(1, diff.size());
ValuePair valuePair = diff.get("embeddable.description");
Assert.assertNotNull(valuePair);
Assert.assertEquals("bar",valuePair.getNewValue());
Assert.assertEquals("baz",valuePair.getOldValue());
}
@Test
public void testFirstEmbeddedIsNull() {
EMain emain1 = createEMain();
emain1.setEmbeddable(null);
EMain emain2 = createEMain();
Map<String, ValuePair> diff = diffHelp.diff(emain1, emain2, emainDesc);
Assert.assertEquals(1, diff.size());
ValuePair valuePair = diff.get("embeddable");
Assert.assertNotNull(valuePair);
Assert.assertNull(valuePair.getNewValue());
Assert.assertTrue(valuePair.getOldValue() instanceof Eembeddable);
Assert.assertEquals("bar",((Eembeddable)valuePair.getOldValue()).getDescription());
}
@Test
public void testSecondEmbeddedIsNull() {
EMain emain1 = createEMain();
EMain emain2 = createEMain();
emain2.setEmbeddable(null);
Map<String, ValuePair> diff = diffHelp.diff(emain1, emain2, emainDesc);
Assert.assertEquals(1, diff.size());
ValuePair valuePair = diff.get("embeddable");
Assert.assertNotNull(valuePair);
Assert.assertNull(valuePair.getOldValue());
Assert.assertTrue(valuePair.getNewValue() instanceof Eembeddable);
Assert.assertEquals("bar",((Eembeddable)valuePair.getNewValue()).getDescription());
}
@Test
public void testBothEmbeddedIsNull() {
EMain emain1 = createEMain();
emain1.setEmbeddable(null);
EMain emain2 = createEMain();
emain2.setEmbeddable(null);
Map<String, ValuePair> diff = diffHelp.diff(emain1, emain2, emainDesc);
Assert.assertEquals(0, diff.size());
}
private EMain createEMain() {
EMain emain = new EMain();
emain.setName("foo");
emain.setVersion(13l);
Eembeddable embeddable = new Eembeddable();
embeddable.setDescription("bar");
emain.setEmbeddable(embeddable);
return emain;
}
}