blob: 63c906f1dff3d5af3a9831402c3889045d1e5f58 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.johnzon.core;
import org.junit.Assert;
import org.junit.Test;
import jakarta.json.Json;
import jakarta.json.JsonArray;
import jakarta.json.JsonArrayBuilder;
import jakarta.json.JsonException;
import jakarta.json.JsonObject;
import jakarta.json.JsonPatch;
import jakarta.json.JsonStructure;
import jakarta.json.JsonValue;
import jakarta.json.spi.JsonProvider;
import java.io.StringReader;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
public class JsonPatchTest {
private static final JsonProvider PROVIDER = JsonProvider.provider();
@Test
public void testAddObjectMember() {
JsonObject object = Json.createReader(new StringReader("{ \"foo\": \"bar\" }"))
.readObject();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.ADD,
"/baz",
null, // no from
new JsonStringImpl("qux")));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertEquals("bar", patched.getString("foo"));
assertEquals("qux", patched.getString("baz"));
assertEquals("{\"foo\":\"bar\",\"baz\":\"qux\"}", toJsonString(patched));
}
/**
* {@linkplain} https://issues.apache.org/jira/browse/JOHNZON-172
*/
@Test
public void testAddToRootContainingEmptyJsonObject() {
JsonObject object = Json.createObjectBuilder()
.add("request", Json.createObjectBuilder()
.add("test", JsonValue.EMPTY_JSON_OBJECT))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.ADD,
"/name",
null,
new JsonStringImpl("aName")));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
JsonObject requestJson = patched.getJsonObject("request");
assertNotNull(requestJson);
assertEquals(JsonValue.EMPTY_JSON_OBJECT, requestJson.getJsonObject("test"));
assertEquals("aName", patched.getString("name"));
}
@Test
public void testAddArrayElementWithIndex() {
JsonObject object = Json.createObjectBuilder()
.add("foo", Json.createArrayBuilder()
.add("bar")
.add("baz"))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.ADD,
"/foo/1",
null, // no from
new JsonStringImpl("qux")));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
JsonArray array = patched.getJsonArray("foo");
assertNotNull(array);
assertEquals("bar", array.getString(0));
assertEquals("qux", array.getString(1));
assertEquals("baz", array.getString(2));
assertEquals("{\"foo\":[\"bar\",\"qux\",\"baz\"]}", toJsonString(patched));
}
@Test
public void testAddArrayElementAppend() {
JsonObject object = Json.createObjectBuilder()
.add("foo", Json.createArrayBuilder()
.add("bar")
.add("baz"))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.ADD,
"/foo/-",
null, // no from
new JsonStringImpl("qux")));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
JsonArray array = patched.getJsonArray("foo");
assertNotNull(array);
assertEquals("bar", array.getString(0));
assertEquals("baz", array.getString(1));
assertEquals("qux", array.getString(2));
assertEquals("{\"foo\":[\"bar\",\"baz\",\"qux\"]}", toJsonString(patched));
}
@Test
public void testAddArrayElementPlainArray() {
JsonArray array = Json.createArrayBuilder()
.add("bar")
.add("baz")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.ADD,
"/-",
null, // no from
new JsonStringImpl("qux")));
JsonArray patched = patch.apply(array);
assertNotNull(patched);
assertNotSame(array, patched);
assertEquals("bar", patched.getString(0));
assertEquals("baz", patched.getString(1));
assertEquals("qux", patched.getString(2));
assertEquals("[\"bar\",\"baz\",\"qux\"]", toJsonString(patched));
}
@Test(expected = JsonException.class)
public void testAddNonexistentTarget() {
JsonObject object = Json.createObjectBuilder()
.add("foo", "bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.ADD,
"/baz/bat",
null, // no from
new JsonStringImpl("qux")));
patch.apply(object);
}
@Test(expected = JsonException.class)
public void testAddArrayIndexOutOfBounds() {
JsonArray array = Json.createArrayBuilder()
.add("bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.ADD,
"/5",
null,
new JsonStringImpl("baz")));
patch.apply(array);
}
@Test
public void testRemoveObjectMember() {
JsonObject object = Json.createObjectBuilder()
.add("baz", "qux")
.add("foo", "bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REMOVE,
"/baz",
null,
null));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertEquals("bar", patched.getString("foo"));
assertFalse("patched JsonObject must no contain \"baz\"", patched.containsKey("baz"));
assertEquals("{\"foo\":\"bar\"}", toJsonString(patched));
}
@Test
public void testRemoveArrayElement() {
JsonObject object = Json.createObjectBuilder()
.add("foo", Json.createArrayBuilder()
.add("bar")
.add("qux")
.add("baz"))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REMOVE,
"/foo/1",
null,
null));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
JsonArray array = patched.getJsonArray("foo");
assertNotNull(array);
assertEquals(2, array.size());
assertEquals("bar", array.getString(0));
assertEquals("baz", array.getString(1));
assertEquals("{\"foo\":[\"bar\",\"baz\"]}", toJsonString(patched));
}
@Test
public void testRemoveArrayElementPlainArray() {
JsonArray array = Json.createArrayBuilder()
.add("bar")
.add("qux")
.add("baz")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REMOVE,
"/1",
null,
null));
JsonArray patched = patch.apply(array);
assertNotNull(patched);
assertEquals(2, patched.size());
assertEquals("bar", patched.getString(0));
assertEquals("baz", patched.getString(1));
assertEquals("[\"bar\",\"baz\"]", toJsonString(patched));
}
@Test(expected = JsonException.class)
public void testRemoveObjectElementNonexistentTarget() {
JsonObject object = Json.createObjectBuilder()
.add("foo", "bar")
.add("baz", "qux")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REMOVE,
"/nomatch",
null,
null));
patch.apply(object);
}
@Test(expected = JsonException.class)
public void testRemoveArrayElementIndexOutOfBounds() {
JsonArray array = Json.createArrayBuilder()
.add("bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REMOVE,
"/5",
null,
null));
patch.apply(array);
}
@Test
public void testReplacingObjectMember() {
JsonObject object = Json.createObjectBuilder()
.add("baz", "qux")
.add("foo", "bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
"/baz",
null,
new JsonStringImpl("boo")));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertNotSame(object, patched);
assertEquals("boo", patched.getString("baz"));
assertEquals("bar", patched.getString("foo"));
assertEquals("{\"foo\":\"bar\",\"baz\":\"boo\"}", toJsonString(patched));
}
@Test
public void testReplacingArrayElement() {
JsonObject object = Json.createObjectBuilder()
.add("foo", Json.createArrayBuilder()
.add("bar")
.add("qux"))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
"/foo/1",
null,
new JsonStringImpl("boo")));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertNotSame(object, patched);
JsonArray array = patched.getJsonArray("foo");
assertNotNull(array);
assertNotSame(object.getJsonArray("foo"), array);
assertEquals(2, array.size());
assertEquals("bar", array.getString(0));
assertEquals("boo", array.getString(1));
assertEquals("{\"foo\":[\"bar\",\"boo\"]}", toJsonString(patched));
}
@Test
public void testReplacingArrayElementPlainArray() {
JsonArray array = Json.createArrayBuilder()
.add("bar")
.add("qux")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
"/0",
null,
new JsonStringImpl("boo")));
JsonArray patched = patch.apply(array);
assertNotNull(patched);
assertNotSame(array, patched);
assertEquals(2, patched.size());
assertEquals("boo", patched.getString(0));
assertEquals("qux", patched.getString(1));
assertEquals("[\"boo\",\"qux\"]", toJsonString(patched));
}
@Test(expected = JsonException.class)
public void testReplacingObjectMemberNonexistingTarget() {
JsonObject object = Json.createObjectBuilder()
.add("foo", "bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
"/nomatch",
null,
new JsonStringImpl("notneeded")));
patch.apply(object);
}
@Test(expected = JsonException.class)
public void testReplacingArrayElementIndexOutOfBounds() {
JsonArray array = Json.createArrayBuilder()
.add("foo")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
"/1",
null,
new JsonStringImpl("notneeded")));
patch.apply(array);
}
@Test
public void testMovingObjectMember() {
JsonObject object = Json.createObjectBuilder()
.add("foo", Json.createObjectBuilder()
.add("bar", "baz")
.add("waldo", "fred"))
.add("qux", Json.createObjectBuilder()
.add("corge", "grault"))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.MOVE,
"/qux/thud",
"/foo/waldo",
null));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertNotSame(object, patched);
JsonObject foo = patched.getJsonObject("foo");
assertNotNull(foo);
assertEquals("baz", foo.getString("bar"));
assertFalse("JsonObject with key 'foo' must not contain 'waldo'", foo.containsKey("waldo"));
JsonObject qux = patched.getJsonObject("qux");
assertNotNull(qux);
assertEquals("grault", qux.getString("corge"));
assertEquals("fred", qux.getString("thud"));
assertEquals("{\"foo\":{\"bar\":\"baz\"},\"qux\":{\"corge\":\"grault\",\"thud\":\"fred\"}}", toJsonString(patched));
}
@Test
public void testMovingArrayElement() {
JsonObject object = Json.createObjectBuilder()
.add("foo", Json.createArrayBuilder()
.add("all")
.add("grass")
.add("cows")
.add("eat"))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.MOVE,
"/foo/3",
"/foo/1",
null));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertNotSame(object, patched);
JsonArray array = patched.getJsonArray("foo");
assertNotNull(array);
assertEquals("all", array.getString(0));
assertEquals("cows", array.getString(1));
assertEquals("eat", array.getString(2));
assertEquals("grass", array.getString(3));
assertEquals("{\"foo\":[\"all\",\"cows\",\"eat\",\"grass\"]}", toJsonString(patched));
}
@Test
public void testMovingArrayElementPlainArray() {
JsonArray array = Json.createArrayBuilder()
.add("two")
.add("three")
.add("four")
.add("one")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.MOVE,
"/0",
"/3",
null));
JsonArray patched = patch.apply(array);
assertNotNull(patched);
assertNotSame(array, patched);
assertEquals("one", patched.getString(0));
assertEquals("two", patched.getString(1));
assertEquals("three", patched.getString(2));
assertEquals("four", patched.getString(3));
}
@Test
public void testMovingArrayElementToObjectMember() {
JsonObject object = Json.createObjectBuilder()
.add("foo", Json.createArrayBuilder()
.add("one")
.add("two")
.add("dog"))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.MOVE,
"/bar",
"/foo/2",
null));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertEquals(2, patched.size());
JsonArray array = patched.getJsonArray("foo");
assertEquals(2, array.size());
assertEquals("one", array.getString(0));
assertEquals("two", array.getString(1));
assertEquals("dog", patched.getString("bar"));
assertEquals("{\"foo\":[\"one\",\"two\"],\"bar\":\"dog\"}", toJsonString(patched));
}
@Test(expected = JsonException.class)
public void testMovingObjectMemberNonexistingFrom() {
JsonObject object = Json.createObjectBuilder()
.add("foo", "bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.MOVE,
"/baz",
"/nomatch",
null));
patch.apply(object);
}
@Test(expected = JsonException.class)
public void testMovingObjectMemberNonexistingTarget() {
JsonObject object = Json.createObjectBuilder()
.add("foo", "bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.MOVE,
"/nomatch/child",
"/foo",
null));
patch.apply(object);
}
@Test(expected = JsonException.class)
public void testMovingObjectMemberMoveToSubFrom() {
JsonObject object = Json.createObjectBuilder()
.add("object", Json.createObjectBuilder()
.add("key", "value"))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.MOVE,
"/object/key",
"/object",
null));
patch.apply(object);
}
@Test
public void testCopyObjectMember() {
JsonObject object = Json.createObjectBuilder()
.add("foo", "bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.COPY,
"/baz",
"/foo",
null));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertEquals(2, patched.size());
assertEquals("bar", patched.getString("foo"));
assertEquals("bar", patched.getString("baz"));
assertEquals("{\"foo\":\"bar\",\"baz\":\"bar\"}", toJsonString(patched));
}
@Test
public void testCopyArrayMember() {
JsonObject object = Json.createObjectBuilder()
.add("foo", Json.createArrayBuilder()
.add("bar")
.add("baz"))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.COPY,
"/foo/-",
"/foo/0",
null));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
JsonArray array = patched.getJsonArray("foo");
assertEquals(3, array.size());
assertEquals("bar", array.getString(0));
assertEquals("baz", array.getString(1));
assertEquals("bar", array.getString(2));
assertEquals("{\"foo\":[\"bar\",\"baz\",\"bar\"]}", toJsonString(patched));
}
@Test
public void testCopyArrayMemberPlainArray() {
JsonArray array = Json.createArrayBuilder()
.add("foo")
.add("bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.COPY,
"/0",
"/1",
null));
JsonArray patched = patch.apply(array);
assertNotNull(patched);
assertNotSame(array, patched);
assertEquals(3, patched.size());
assertEquals("bar", patched.getString(0));
assertEquals("foo", patched.getString(1));
assertEquals("bar", patched.getString(2));
assertEquals("[\"bar\",\"foo\",\"bar\"]", toJsonString(patched));
}
@Test
public void testCopyObjectMemberToObjectMember() {
JsonObject object = Json.createObjectBuilder()
.add("name", "Hugo")
.add("partner", Json.createObjectBuilder()
.add("name", "Leia")
.add("partner", JsonValue.EMPTY_JSON_OBJECT))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.COPY,
"/partner/partner/name",
"/name",
null));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertNotSame(object, patched);
assertEquals("Hugo", patched.getString("name"));
JsonObject partner = patched.getJsonObject("partner");
assertEquals("Leia", partner.getString("name"));
JsonObject parent = partner.getJsonObject("partner");
assertEquals(patched.getString("name"), parent.getString("name"));
assertEquals("{\"name\":\"Hugo\",\"partner\":{\"name\":\"Leia\",\"partner\":{\"name\":\"Hugo\"}}}", toJsonString(patched));
}
@Test(expected = JsonException.class)
public void testCopyObjectMemberFromNonexistentTarget() {
JsonObject object = Json.createObjectBuilder()
.add("foo", "bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.COPY,
"/notneeded",
"/nomatch",
null));
patch.apply(object);
}
@Test(expected = JsonException.class)
public void testCopyObjectMemberToNonexistingTarget() {
JsonObject object = Json.createObjectBuilder()
.add("foo", "bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.COPY,
"/path/nomatch",
"/foo",
null));
patch.apply(object);
}
@Test(expected = JsonException.class)
public void testCopyArrayMemberFromIndexOutOfBounds() {
JsonArray array = Json.createArrayBuilder()
.add("foo")
.add("bar")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.COPY,
"/-",
"/2",
null));
patch.apply(array);
}
@Test(expected = JsonException.class)
public void testCopyArrayMemberToIndexOutOfBounds() {
JsonArray array = Json.createArrayBuilder()
.add("foo")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.COPY,
"/2",
"/-",
null));
patch.apply(array);
}
@Test
public void testTestingObjectMemberValueSuccess() {
JsonObject object = Json.createObjectBuilder()
.add("foo", "qux")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.TEST,
"/foo",
null,
new JsonStringImpl("qux")));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertSame(object, patched);
}
@Test(expected = JsonException.class)
public void testTestingObjectMemberValueFailed() {
JsonObject object = Json.createObjectBuilder()
.add("foo", "qux")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.TEST,
"/foo",
null,
Json.createArrayBuilder().build()));
patch.apply(object);
}
@Test
public void testTestingArrayAsObjectMemberSuccess() {
JsonObject object = Json.createObjectBuilder()
.add("name", "Thor")
.add("parents", Json.createArrayBuilder()
.add("Odin")
.add("Forjgyn"))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.TEST,
"/parents",
null,
Json.createArrayBuilder() // yessss, we really want to create a new JsonArray ;)
.add("Odin")
.add("Forjgyn")
.build()));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertSame(object, patched);
}
@Test(expected = JsonException.class)
public void testTestingArrayAsObjectMemberFailed() {
JsonObject object = Json.createObjectBuilder()
.add("magic", "array")
.add("numbers", Json.createArrayBuilder()
.add(1)
.add(2))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.TEST,
"/numbers",
null,
Json.createArrayBuilder() // different ordering
.add(2)
.add(1)
.build()));
patch.apply(object);
}
@Test
public void testTestingArrayElementSuccess() {
JsonObject object = Json.createObjectBuilder()
.add("foo", Json.createArrayBuilder()
.add("bar")
.add("baz"))
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.TEST,
"/foo/1",
null,
new JsonStringImpl("baz")));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertSame(object, patched);
}
@Test
public void testTestingArrayElementPlainArraySuccess() {
JsonArray array = Json.createArrayBuilder()
.add("foo")
.add("bar")
.add("qux")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.TEST,
"/2",
null,
new JsonStringImpl("qux")));
JsonArray patched = patch.apply(array);
assertNotNull(patched);
assertSame(array, patched);
}
@Test(expected = JsonException.class)
public void testTestingArrayElementPlainArrayFailed() {
JsonArray array = Json.createArrayBuilder()
.add(1)
.add("2")
.add("qux")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.TEST,
"/0",
null,
new JsonStringImpl("bar")));
patch.apply(array);
}
@Test(expected = JsonException.class)
public void testTestingObjectMemeberNonexistentTarget() {
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.TEST,
"/nomatch",
null,
JsonValue.EMPTY_JSON_OBJECT));
patch.apply(JsonValue.EMPTY_JSON_OBJECT);
}
@Test(expected = JsonException.class)
public void testTestingArrayElementIndexOutOfBounds() {
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.TEST,
"/3",
null,
JsonValue.EMPTY_JSON_OBJECT));
patch.apply(JsonValue.EMPTY_JSON_ARRAY);
}
@Test
public void testAddObjectMemberAlreadyExists() {
JsonObject object = Json.createObjectBuilder()
.add("foo", "bar")
.add("baz", "qux")
.build();
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.ADD,
"/foo",
null,
new JsonStringImpl("abcd")));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertNotSame(object, patched);
assertEquals("abcd", patched.getString("foo"));
assertEquals("qux", patched.getString("baz"));
assertEquals("{\"foo\":\"abcd\",\"baz\":\"qux\"}", toJsonString(patched));
}
@Test
public void testAddArrayElementToEmptyArray() {
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.ADD,
"/-",
null,
new JsonStringImpl("foo")));
JsonArray patched = patch.apply(JsonValue.EMPTY_JSON_ARRAY);
assertNotNull(patched);
assertEquals(1, patched.size());
assertEquals("foo", patched.getString(0));
}
@Test
public void testPatchWithMoreOperations() {
JsonObject object = Json.createObjectBuilder()
.add("family", Json.createObjectBuilder()
.add("children", JsonValue.EMPTY_JSON_ARRAY))
.build();
// i know this can be done with PatchBuilder but
// currently it's not implemented and its fun ;)
JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.ADD,
"/family/father",
null,
Json.createObjectBuilder()
.add("name", "Gaio Modry Effect")
.build()),
new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.ADD,
"/family/mother",
null,
Json.createObjectBuilder()
.add("name", "Cassius vom Hause Clarabella")
.build()),
new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.MOVE,
"/family/children/0",
"/family/mother",
null),
new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.ADD,
"/family/mother",
null,
Json.createObjectBuilder()
.add("name", "Aimee vom Hause Clarabella")
.build()),
new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.COPY,
"/pedigree",
"/family",
null),
new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REMOVE,
"/family",
null,
null));
JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertNotSame(object, patched);
JsonObject pedigree = patched.getJsonObject("pedigree");
assertEquals("Gaio Modry Effect", pedigree.getJsonObject("father").getString("name"));
assertEquals("Aimee vom Hause Clarabella", pedigree.getJsonObject("mother").getString("name"));
assertEquals("Cassius vom Hause Clarabella", pedigree.getJsonArray("children").getJsonObject(0).getString("name"));
assertEquals("{\"pedigree\":{" +
"\"children\":[" +
"{\"name\":\"Cassius vom Hause Clarabella\"}]," +
"\"mother\":{\"name\":\"Aimee vom Hause Clarabella\"}," +
"\"father\":{\"name\":\"Gaio Modry Effect\"}}}", toJsonString(patched));
}
@Test
public void testCreatePatch() {
JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
arrayBuilder.add(Json.createObjectBuilder()
.add("op", JsonPatch.Operation.ADD.operationName())
.add("path", "/add")
.add("value", "someValue").build());
arrayBuilder.add(Json.createObjectBuilder()
.add("op", JsonPatch.Operation.TEST.operationName())
.add("path", "/test/someObject")
.add("value", "someValue").build());
JsonArray initialPatchData = arrayBuilder.build();
JsonPatch patch = Json.createPatch(initialPatchData);
String jsonToPatch = "{\"add\":{\"a\":\"b\"},\"test\":{\"someObject\":\"someValue\"}}";
JsonObject jsonObjectToPatch = Json.createReader(new StringReader(jsonToPatch)).readObject();
JsonObject patchedJsonObject = patch.apply(jsonObjectToPatch);
Assert.assertNotNull(patchedJsonObject);
}
@Test
public void testReplacingObjectAttribute() {
final JsonObject object = Json.createObjectBuilder()
.add("foo", Json.createObjectBuilder()
.add("baz", Json.createValue("1")))
.add("bar", Json.createObjectBuilder()
.add("baz", Json.createValue("2")))
.build();
final JsonPatchImpl patch = new JsonPatchImpl(
PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
"/bar/baz",
null,
Json.createValue("3")));
final JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertNotSame(object, patched);
{
final JsonObject o = patched.getJsonObject("foo");
assertNotNull(o);
assertEquals(Json.createValue("1"), o.getJsonString("baz"));
}
{
final JsonObject o = patched.getJsonObject("bar");
assertNotNull(o);
assertEquals(Json.createValue("3"), o.getJsonString("baz"));
assertEquals("{\"foo\":{\"baz\":\"1\"},\"bar\":{\"baz\":\"3\"}}", toJsonString(patched));
}
}
@Test
public void testReplacingArrayElementAttribute() {
final JsonObject object = Json.createObjectBuilder()
.add("foo", Json.createArrayBuilder()
.add(Json.createObjectBuilder().add("bar", Json.createValue("1")))
.add(Json.createObjectBuilder().add("bar", Json.createValue("2"))))
.build();
final JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
"/foo/1/bar",
null,
Json.createValue("3")));
final JsonObject patched = patch.apply(object);
assertNotNull(patched);
assertNotSame(object, patched);
final JsonArray array = patched.getJsonArray("foo");
assertNotNull(array);
assertNotSame(object.getJsonArray("foo"), array);
assertEquals(2, array.size());
assertEquals(Json.createValue("3"), array.getJsonObject(1).getJsonString("bar"));
assertEquals(Json.createValue("1"), array.getJsonObject(0).getJsonString("bar"));
assertEquals("{\"foo\":[{\"bar\":\"1\"},{\"bar\":\"3\"}]}", toJsonString(patched));
}
private static String toJsonString(final JsonStructure value) {
return value.toString();
}
}