You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rs...@apache.org on 2017/02/27 21:32:02 UTC

johnzon git commit: JOHNZON-103 added tests for JsonPatchDiff ADD and REMOVE

Repository: johnzon
Updated Branches:
  refs/heads/master 2940f6e13 -> ce46007e6


JOHNZON-103 added tests for JsonPatchDiff ADD and REMOVE


Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/ce46007e
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/ce46007e
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/ce46007e

Branch: refs/heads/master
Commit: ce46007e6beaa0ef2a30bf931408d7ab665ace2e
Parents: 2940f6e
Author: Reinhard Sandtner <rs...@apache.org>
Authored: Mon Feb 27 22:31:35 2017 +0100
Committer: Reinhard Sandtner <rs...@apache.org>
Committed: Mon Feb 27 22:31:35 2017 +0100

----------------------------------------------------------------------
 .../org/apache/johnzon/core/JsonPatchDiff.java  |  21 ++-
 .../apache/johnzon/core/JsonPatchDiffTest.java  | 164 +++++++++++++++++--
 2 files changed, 163 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/ce46007e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchDiff.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchDiff.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchDiff.java
index 81a7bf2..2d0f05c 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchDiff.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchDiff.java
@@ -29,17 +29,17 @@ import javax.json.JsonValue;
 /**
  * Create a diff from a source and target JsonStructure
  */
-public class JsonPatchDiff {
+class JsonPatchDiff {
 
     private final JsonStructure source;
     private final JsonStructure target;
 
-    public JsonPatchDiff(JsonStructure source, JsonStructure target) {
+    JsonPatchDiff(JsonStructure source, JsonStructure target) {
         this.source = source;
         this.target = target;
     }
 
-    public JsonPatch calculateDiff() {
+    JsonPatch calculateDiff() {
         JsonPatchBuilder patchBuilder = new JsonPatchBuilderImpl();
 
         diff(patchBuilder, "/", source, target);
@@ -48,9 +48,10 @@ public class JsonPatchDiff {
     }
 
     private void diff(JsonPatchBuilder patchBuilder, String basePath, JsonStructure source, JsonStructure target) {
-        if (source instanceof JsonObject && target instanceof JsonObject) {
+        if (isJsonObject(source) && isJsonObject(target)) {
             // handle JsonObjects
             diffJsonObjects(patchBuilder, basePath, (JsonObject) source, (JsonObject) target);
+
         } else if (source instanceof JsonArray && target instanceof JsonArray) {
             // handle JsonArray
             //X TODO
@@ -66,8 +67,11 @@ public class JsonPatchDiff {
         for (Map.Entry<String, JsonValue> sourceEntry : sourceEntries) {
             String attributeName = sourceEntry.getKey();
             if (target.containsKey(attributeName)) {
-                JsonValue targetValue = ((JsonObject) target).get(attributeName);
-                if (!sourceEntry.getValue().equals(targetValue)) {
+                JsonValue targetValue = target.get(attributeName);
+
+                if (isJsonObject(targetValue) && isJsonObject(targetValue)) {
+                    diffJsonObjects(patchBuilder, basePath + attributeName + "/", (JsonObject) sourceEntry.getValue(), (JsonObject) targetValue);
+                } else if (!sourceEntry.getValue().equals(targetValue)) {
                     // replace the original value
                     patchBuilder.replace(basePath + attributeName, targetValue);
                 }
@@ -85,4 +89,9 @@ public class JsonPatchDiff {
         }
 
     }
+
+
+    private static boolean isJsonObject(JsonValue jsonValue) {
+        return jsonValue instanceof JsonObject;
+    }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/ce46007e/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java
index 3462a19..48ff05a 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java
@@ -16,6 +16,9 @@
  */
 package org.apache.johnzon.core;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
 import java.io.StringReader;
 
 import javax.json.Json;
@@ -42,14 +45,133 @@ public class JsonPatchDiffTest {
         // adding "b"
         JsonPatch jsonPatch = Json.createDiff(Json.createReader(new StringReader(jsonA)).readObject(),
                 Json.createReader(new StringReader(jsonB)).readObject());
-        Assert.assertNotNull(jsonPatch);
+        assertNotNull(jsonPatch);
         JsonArray patchOperations = jsonPatch.toJsonArray();
-        Assert.assertNotNull(patchOperations);
-        Assert.assertEquals(1, patchOperations.size());
-        containsOperation(patchOperations, JsonPatch.Operation.ADD, "/b", "xb");
+        assertNotNull(patchOperations);
+        assertEquals(1, patchOperations.size());
+        containsOperation(patchOperations, JsonPatch.Operation.ADD, "/b", Json.createValue("xb"));
+    }
+
+    @Test
+    public void testAddDiffNewObject() {
+
+        JsonObject target = Json.createObjectBuilder()
+                .add("a", Json.createObjectBuilder()
+                        .add("aa", "value")
+                        .add("ab", "another"))
+                .build();
+
+        JsonPatch patch = Json.createDiff(JsonValue.EMPTY_JSON_OBJECT, target);
+        assertNotNull(patch);
+
+        JsonArray operations = patch.toJsonArray();
+        assertEquals(1, operations.size());
+
+        containsOperation(operations, JsonPatch.Operation.ADD, "/a", target.get("a"));
+    }
+
+    @Test
+    public void testAddDiffInNestedObject() {
+
+        JsonObject source = Json.createObjectBuilder()
+                .add("a", Json.createObjectBuilder()
+                        .add("aa", "value"))
+                .build();
+
+        JsonObject target = Json.createObjectBuilder()
+                .add("a", Json.createObjectBuilder()
+                        .add("aa", "value")
+                        .add("bb", "another value"))
+                .build();
+
+        JsonPatch patch = Json.createDiff(source, target);
+        assertNotNull(patch);
+
+        JsonArray operations = patch.toJsonArray();
+        assertEquals(1, operations.size());
+
+        containsOperation(operations, JsonPatch.Operation.ADD, "/a/bb", Json.createValue("another value"));
+    }
+
+    @Test
+    public void testRemoveDiffObject() {
+
+        JsonObject source = Json.createObjectBuilder()
+                .add("a", "value")
+                .build();
+
+        JsonPatch patch = Json.createDiff(source, JsonValue.EMPTY_JSON_OBJECT);
+        assertNotNull(patch);
+
+        JsonArray operations = patch.toJsonArray();
+        assertEquals(1, operations.size());
+
+        containsOperation(operations, JsonPatch.Operation.REMOVE, "/a");
+    }
+
+    @Test
+    public void testRemoveDiffNestedObject() {
+
+        JsonObject source = Json.createObjectBuilder()
+                .add("a", "value")
+                .add("nested", Json.createObjectBuilder()
+                        .add("1", 1)
+                        .add("2", 2))
+                .build();
+
+        {
+            JsonPatch patch = Json.createDiff(source, JsonValue.EMPTY_JSON_OBJECT);
+            assertNotNull(patch);
+
+            JsonArray operations = patch.toJsonArray();
+            assertEquals(2, operations.size());
+
+            containsOperation(operations, JsonPatch.Operation.REMOVE, "/a");
+            containsOperation(operations, JsonPatch.Operation.REMOVE, "/nested");
+        }
+
+        {
+            JsonObject target = Json.createObjectBuilder()
+                    .add("a", "value")
+                    .add("nested", Json.createObjectBuilder()
+                            .add("1", 1))
+                    .build();
+
+            JsonPatch patch = Json.createDiff(source, target);
+            assertNotNull(patch);
+
+            JsonArray operations = patch.toJsonArray();
+            assertEquals(1, operations.size());
+
+            containsOperation(operations, JsonPatch.Operation.REMOVE, "/nested/2");
+        }
     }
 
     @Test
+    public void testDiffEqualObjects() {
+
+        JsonObject source = Json.createObjectBuilder()
+                .add("a", "value")
+                .build();
+
+        JsonObject target = Json.createObjectBuilder()
+                .add("a", "value")
+                .build();
+
+        JsonPatch patch = Json.createDiff(source, target);
+        assertNotNull(patch);
+        assertEquals(0, patch.toJsonArray().size());
+    }
+
+
+    //X TODO arrays...
+    //X TODO test add/remove JsonArray
+    //X TODO test add object to JsonArray
+    //X TODO test remove object to JsonArray
+
+
+
+    @Test
     @Ignore //X TODO reinhard take over ;)
     public void testComplexDiff() {
         // {"a":"xa","b":2,"c":{"d":"xd"},"e":[1,2,3]}
@@ -62,25 +184,35 @@ public class JsonPatchDiffTest {
         // removing b, adding d2, removing 2 from e, adding f
         JsonPatch jsonPatch = Json.createDiff(Json.createReader(new StringReader(jsonA)).readObject(),
                 Json.createReader(new StringReader(jsonB)).readObject());
-        Assert.assertNotNull(jsonPatch);
+        assertNotNull(jsonPatch);
         JsonArray patchOperations = jsonPatch.toJsonArray();
-        Assert.assertNotNull(patchOperations);
-        Assert.assertEquals(4, patchOperations.size());
-        containsOperation(patchOperations, JsonPatch.Operation.REMOVE, "/b", null);
-        containsOperation(patchOperations, JsonPatch.Operation.ADD, "/c/d2", "xd2");
-        containsOperation(patchOperations, JsonPatch.Operation.REMOVE, "/e/2", null);
-        containsOperation(patchOperations, JsonPatch.Operation.ADD, "/f", "xe");
+        assertNotNull(patchOperations);
+        assertEquals(4, patchOperations.size());
+        containsOperation(patchOperations, JsonPatch.Operation.REMOVE, "/b");
+        containsOperation(patchOperations, JsonPatch.Operation.ADD, "/c/d2", Json.createValue("xd2"));
+        containsOperation(patchOperations, JsonPatch.Operation.REMOVE, "/e/2");
+        containsOperation(patchOperations, JsonPatch.Operation.ADD, "/f", Json.createValue("xe"));
+    }
+
+    private void containsOperation(JsonArray patchOperations,
+                                   JsonPatch.Operation patchOperation,
+                                   String jsonPointer) {
+
+        containsOperation(patchOperations, patchOperation, jsonPointer, null);
     }
 
-    private void containsOperation(JsonArray patchOperations, JsonPatch.Operation patchOperation,
-                                   String jsonPointer, String value) {
+    private void containsOperation(JsonArray patchOperations,
+                                   JsonPatch.Operation patchOperation,
+                                   String jsonPointer,
+                                   JsonValue value) {
+
         for (JsonValue operation : patchOperations) {
             if (operation instanceof JsonObject &&
-                    patchOperation.operationName().equalsIgnoreCase(((JsonObject) operation).getString("op"))) {
-                Assert.assertEquals(jsonPointer, ((JsonObject) operation).getString("path"));
+                    patchOperation.operationName().equalsIgnoreCase(((JsonObject) operation).getString("op")) &&
+                    ((JsonObject) operation).getString("path").equals(jsonPointer)) {
 
                 if (value != null) {
-                    Assert.assertEquals(value, ((JsonObject) operation).getString("value"));
+                    assertEquals(value, ((JsonObject) operation).get("value"));
                 }
 
                 return;