From 598a24380770ad8dbdf7cea0a3ecca2aa7cfa5ea Mon Sep 17 00:00:00 2001 From: Jon Kilroy Date: Fri, 16 Aug 2019 12:46:51 -0500 Subject: [PATCH] Add patch extension to DSL (#921) --- .../testhelpers/jsonapi/JsonApiDSL.java | 21 +++++++++++ .../jsonapi/elements/PatchOperation.java | 23 ++++++++++++ .../jsonapi/elements/PatchOperationType.java | 5 +++ .../jsonapi/elements/PatchSet.java | 35 +++++++++++++++++++ .../testhelpers/jsonapi/JsonApiDSLTest.java | 33 ++++++++++++++++- 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/elements/PatchOperation.java create mode 100644 elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/elements/PatchOperationType.java create mode 100644 elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/elements/PatchSet.java diff --git a/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/JsonApiDSL.java b/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/JsonApiDSL.java index a2c3128929..c8c44d9e53 100644 --- a/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/JsonApiDSL.java +++ b/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/JsonApiDSL.java @@ -12,6 +12,9 @@ import com.yahoo.elide.contrib.testhelpers.jsonapi.elements.Document; import com.yahoo.elide.contrib.testhelpers.jsonapi.elements.Id; import com.yahoo.elide.contrib.testhelpers.jsonapi.elements.Include; +import com.yahoo.elide.contrib.testhelpers.jsonapi.elements.PatchOperation; +import com.yahoo.elide.contrib.testhelpers.jsonapi.elements.PatchOperationType; +import com.yahoo.elide.contrib.testhelpers.jsonapi.elements.PatchSet; import com.yahoo.elide.contrib.testhelpers.jsonapi.elements.Relation; import com.yahoo.elide.contrib.testhelpers.jsonapi.elements.Relationships; import com.yahoo.elide.contrib.testhelpers.jsonapi.elements.Resource; @@ -273,4 +276,22 @@ public static Relation relation(String field, boolean toOne) { public static ResourceLinkage linkage(Type type, Id id) { return new ResourceLinkage(id, type); } + + /** + * @param patchOperations the set of patch operation + * @return the patch set + */ + public static PatchSet patchSet(PatchOperation... patchOperations) { + return new PatchSet(patchOperations); + } + + /** + * @param operation the operation type + * @param path the operation path + * @param value the operation value + * @return + */ + public static PatchOperation patchOperation(PatchOperationType operation, String path, Resource value) { + return new PatchOperation(operation, path, value); + } } diff --git a/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/elements/PatchOperation.java b/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/elements/PatchOperation.java new file mode 100644 index 0000000000..6d61df38cc --- /dev/null +++ b/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/elements/PatchOperation.java @@ -0,0 +1,23 @@ +/* + * Copyright 2019, Yahoo Inc. + * Licensed under the Apache License, Version 2.0 + * See LICENSE file in project root for terms. + */ + +package com.yahoo.elide.contrib.testhelpers.jsonapi.elements; + +import java.util.LinkedHashMap; + +public class PatchOperation extends LinkedHashMap { + + /** + * @param operation the operation type + * @param path the operation path + * @param value the operation value + */ + public PatchOperation(PatchOperationType operation, String path, Resource value) { + this.put("op", operation.name()); + this.put("path", path); + this.put("value", value); + } +} diff --git a/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/elements/PatchOperationType.java b/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/elements/PatchOperationType.java new file mode 100644 index 0000000000..ca1b6afd03 --- /dev/null +++ b/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/elements/PatchOperationType.java @@ -0,0 +1,5 @@ +package com.yahoo.elide.contrib.testhelpers.jsonapi.elements; + +public enum PatchOperationType { + add, remove, replace +} diff --git a/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/elements/PatchSet.java b/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/elements/PatchSet.java new file mode 100644 index 0000000000..a7d7eb38cd --- /dev/null +++ b/elide-contrib/elide-test-helpers/src/main/java/com/yahoo/elide/contrib/testhelpers/jsonapi/elements/PatchSet.java @@ -0,0 +1,35 @@ +/* + * Copyright 2019, Yahoo Inc. + * Licensed under the Apache License, Version 2.0 + * See LICENSE file in project root for terms. + */ + +package com.yahoo.elide.contrib.testhelpers.jsonapi.elements; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.util.ArrayList; +import java.util.Arrays; + +public class PatchSet extends ArrayList { + + static private final Gson GSON_INSTANCE = new GsonBuilder() + .serializeNulls().create(); + + /** + * @param patchOperations the set of patch operations + */ + public PatchSet(PatchOperation... patchOperations) { + this.addAll(Arrays.asList(patchOperations)); + } + + /** + * To json string. + * + * @return the string + */ + public String toJSON() { + return GSON_INSTANCE.toJson(this); + } +} diff --git a/elide-contrib/elide-test-helpers/src/test/java/com/yahoo/elide/contrib/testhelpers/jsonapi/JsonApiDSLTest.java b/elide-contrib/elide-test-helpers/src/test/java/com/yahoo/elide/contrib/testhelpers/jsonapi/JsonApiDSLTest.java index 7a3e789292..58839ff12b 100644 --- a/elide-contrib/elide-test-helpers/src/test/java/com/yahoo/elide/contrib/testhelpers/jsonapi/JsonApiDSLTest.java +++ b/elide-contrib/elide-test-helpers/src/test/java/com/yahoo/elide/contrib/testhelpers/jsonapi/JsonApiDSLTest.java @@ -7,7 +7,8 @@ package com.yahoo.elide.contrib.testhelpers.jsonapi; import static com.yahoo.elide.contrib.testhelpers.jsonapi.JsonApiDSL.*; -import static com.yahoo.elide.contrib.testhelpers.jsonapi.elements.Relation.TO_ONE; +import static com.yahoo.elide.contrib.testhelpers.jsonapi.elements.PatchOperationType.*; +import static com.yahoo.elide.contrib.testhelpers.jsonapi.elements.Relation.*; import static org.testng.Assert.assertEquals; import org.testng.annotations.Test; @@ -280,4 +281,34 @@ public void verifyNoId() { assertEquals(actual, expected); } + + @Test + public void verifyPatchOperation() { + String expected = "[{\"op\":\"add\",\"path\":\"/parent\",\"value\":{\"type\":\"parent\",\"id\":\"1\",\"relationships\":{\"children\":{\"data\":[{\"type\":\"child\",\"id\":\"2\"}]},\"spouses\":{\"data\":[{\"type\":\"parent\",\"id\":\"3\"}]}}}},{\"op\":\"add\",\"path\":\"/parent/1/children\",\"value\":{\"type\":\"child\",\"id\":\"2\"}}]"; + + String actual = patchSet( + patchOperation(add, "/parent", + resource( + type("parent"), + id("1"), + relationships( + relation("children", + linkage(type("child"), id("2")) + ), + relation("spouses", + linkage(type("parent"), id("3")) + ) + ) + ) + ), + patchOperation(add, "/parent/1/children", + resource( + type("child"), + id("2") + ) + ) + ).toJSON(); + + assertEquals(actual, expected); + } }