UNPKG

@wizard9/json-patch-apply

Version:

A library for describing, calculating, and applying patches to Javascript Objects.

311 lines 13.6 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const chai_1 = require("chai"); const common_1 = require("../src/common"); const apply_1 = require("../src/apply"); const _ = __importStar(require("lodash")); describe("apply", () => { let patch = new apply_1.PatchApply(); function apply(o, op, path, type, value) { let operation = { op: op, path: path, type: type }; if (value !== undefined) { operation.value = value; } return patch.apply(o, operation); } function verifyOp(o, op, path, type, value, expected) { let found = apply(o, op, path, type, value); chai_1.expect(expected).eql(JSON.stringify(o)); chai_1.expect(expected).eql(JSON.stringify(found)); } describe("apply to array", () => { describe("add", () => { it("can add array", () => { let o = []; verifyOp(o, "add", "/0", common_1.ValueType.array, [1, 2], "[[1,2]]"); }); it("can add an object", () => { let o = []; verifyOp(o, "add", "/0", common_1.ValueType.object, { a: "abc" }, "[{\"a\":\"abc\"}]"); }); it("can add a primitive", () => { let o = []; verifyOp(o, "add", "/0", common_1.ValueType.primitive, "abc", "[\"abc\"]"); o = []; verifyOp(o, "add", "/0", common_1.ValueType.primitive, 2, "[2]"); o = []; verifyOp(o, "add", "/0", common_1.ValueType.primitive, null, "[null]"); o = []; verifyOp(o, "add", "/0", common_1.ValueType.primitive, undefined, "[null]"); chai_1.expect(typeof o[0] === "undefined"); // stringify converts element of array as null, verify the value is actually undefined }); }); describe("remove", () => { it("can remove array", () => { let o = [[1, 2]]; verifyOp(o, "remove", "/0", common_1.ValueType.array, undefined, "[]"); }); it("can remove object", () => { let o = [{ a: "abc" }]; verifyOp(o, "remove", "/0", common_1.ValueType.object, undefined, "[]"); }); it("can remove a primitive", () => { let o = ["abc"]; verifyOp(o, "remove", "/0", common_1.ValueType.primitive, undefined, "[]"); o = [2]; verifyOp(o, "remove", "/0", common_1.ValueType.primitive, undefined, "[]"); o = [null]; verifyOp(o, "remove", "/0", common_1.ValueType.primitive, undefined, "[]"); o = [undefined]; verifyOp(o, "remove", "/0", common_1.ValueType.primitive, undefined, "[]"); }); }); describe("replace", () => { it("can replace array", () => { let o = [{ a: "abc" }]; verifyOp(o, "replace", "/0", common_1.ValueType.array, [1, 2], "[[1,2]]"); }); it("can replace object", () => { let o = [[1, 2]]; verifyOp(o, "replace", "/0", common_1.ValueType.object, { "a": "abc" }, "[{\"a\":\"abc\"}]"); }); it("can replace a primitive", () => { let o = [3]; verifyOp(o, "replace", "/0", common_1.ValueType.primitive, "abc", "[\"abc\"]"); o = ["abc"]; verifyOp(o, "replace", "/0", common_1.ValueType.primitive, 2, "[2]"); o = [undefined]; verifyOp(o, "replace", "/0", common_1.ValueType.primitive, null, "[null]"); o = [4]; verifyOp(o, "replace", "/0", common_1.ValueType.primitive, undefined, "[null]"); }); }); describe("move", () => { it("works", () => { let found = patch.apply([1, 2], { op: "move", path: "/1", from: "/0" }); chai_1.expect(_.isEqual([2, 1], found)); }); it("requires from", () => { try { patch.apply([1], { op: "move", path: "/0" }); throw new Error("missing error"); } catch (e) { chai_1.expect(e.message).eql("Cannot move without a from path"); } }); it("requires from path to exist", () => { try { patch.apply([1], { op: "move", path: "/0", from: "/1" }); throw new Error("missing error"); } catch (e) { chai_1.expect(e.message).eql("from path '/1' does not exist"); } }); }); describe("copy", () => { it("works", () => { let found = patch.apply([1, 2], { op: "copy", path: "/2", from: "/0" }); chai_1.expect(_.isEqual([1, 2, 1], found)); }); it("requires from", () => { try { patch.apply([1], { op: "copy", path: "/0", value: 9 }); throw new Error("missing error"); } catch (e) { chai_1.expect(e.message).eql("Cannot move without a from path"); } }); it("requires from path to exist", () => { try { patch.apply([1], { op: "copy", path: "/0", from: "/1" }); throw new Error("missing error"); } catch (e) { chai_1.expect(e.message).eql("from path '/1' does not exist"); } }); }); }); describe("apply to object", () => { describe("add", () => { it("can add array", () => { let o = {}; verifyOp(o, "add", "/a", common_1.ValueType.array, [1, 2], "{\"a\":[1,2]}"); }); it("can add an object", () => { let o = {}; verifyOp(o, "add", "/a", common_1.ValueType.object, { b: "abc" }, "{\"a\":{\"b\":\"abc\"}}"); }); it("can add a primitive", () => { let o = {}; verifyOp(o, "add", "/a", common_1.ValueType.primitive, "abc", "{\"a\":\"abc\"}"); o = {}; verifyOp(o, "add", "/a", common_1.ValueType.primitive, 2, "{\"a\":2}"); o = {}; verifyOp(o, "add", "/a", common_1.ValueType.primitive, null, "{\"a\":null}"); o = {}; verifyOp(o, "add", "/a", common_1.ValueType.primitive, undefined, "{}"); }); }); describe("remove", () => { it("can remove array", () => { let o = { a: [1, 2] }; verifyOp(o, "remove", "/a", common_1.ValueType.array, undefined, "{}"); }); it("can remove object", () => { let o = { a: { b: "abc" } }; verifyOp(o, "remove", "/a", common_1.ValueType.object, undefined, "{}"); }); it("can remove a primitive", () => { let o = { a: "abc" }; verifyOp(o, "remove", "/a", common_1.ValueType.primitive, undefined, "{}"); o = { a: 2 }; verifyOp(o, "remove", "/a", common_1.ValueType.primitive, undefined, "{}"); o = { a: null }; verifyOp(o, "remove", "/a", common_1.ValueType.primitive, undefined, "{}"); o = { a: undefined }; verifyOp(o, "remove", "/a", common_1.ValueType.primitive, undefined, "{}"); }); }); describe("replace", () => { it("can replace array", () => { let o = { a: "abc" }; verifyOp(o, "replace", "/a", common_1.ValueType.array, [1, 2], "{\"a\":[1,2]}"); }); it("can replace object", () => { let o = { a: [1, 2] }; verifyOp(o, "replace", "/a", common_1.ValueType.object, { "b": "abc" }, "{\"a\":{\"b\":\"abc\"}}"); }); it("can replace a primitive", () => { let o = { a: 3 }; verifyOp(o, "replace", "/a", common_1.ValueType.primitive, "abc", "{\"a\":\"abc\"}"); o = { a: "abc" }; verifyOp(o, "replace", "/a", common_1.ValueType.primitive, 2, "{\"a\":2}"); o = { a: undefined }; verifyOp(o, "replace", "/a", common_1.ValueType.primitive, null, "{\"a\":null}"); o = { a: 4 }; verifyOp(o, "replace", "/a", common_1.ValueType.primitive, undefined, "{}"); }); }); describe("move", () => { it("works", () => { let found = patch.apply({ abc: 9 }, { op: "move", path: "/xyz", from: "/abc" }); chai_1.expect(_.isEqual({ xyz: 9 }, found)); }); it("requires from", () => { try { patch.apply({ abc: 9 }, { op: "move", path: "/abc" }); throw new Error("missing error"); } catch (e) { chai_1.expect(e.message).eql("Cannot move without a from path"); } }); it("requires from path to exist", () => { try { patch.apply({ abc: 9 }, { op: "move", path: "/abc", from: "/xyz" }); throw new Error("missing error"); } catch (e) { chai_1.expect(e.message).eql("from path '/xyz' does not exist"); } }); it("requires from path to deeply exist", () => { try { patch.apply({ abc: 9 }, { op: "move", path: "/abc", from: "/x/y" }); throw new Error("missing error"); } catch (e) { chai_1.expect(e.message).eql("from path '/x/y' does not exist"); } }); }); describe("copy", () => { it("works", () => { let found = patch.apply({ abc: 9 }, { op: "copy", path: "/xyz", from: "/abc" }); chai_1.expect(_.isEqual({ abc: 9, xyz: 9 }, found)); }); it("requires from", () => { try { patch.apply({ abc: 9 }, { op: "copy", path: "/abc" }); throw new Error("missing error"); } catch (e) { chai_1.expect(e.message).eql("Cannot move without a from path"); } }); it("requires from path to exist", () => { try { patch.apply({ abc: 9 }, { op: "copy", path: "/abc", from: "/xyz" }); throw new Error("missing error"); } catch (e) { chai_1.expect(e.message).eql("from path '/xyz' does not exist"); } }); it("requires from path to deeply exist", () => { try { patch.apply({ abc: 9 }, { op: "copy", path: "/abc", from: "/x/y" }); throw new Error("missing error"); } catch (e) { chai_1.expect(e.message).eql("from path '/x/y' does not exist"); } }); }); }); describe("apply to self", () => { it("can remove", () => { let source = "abc"; let found = patch.apply(source, { op: "remove", path: "" }); chai_1.expect(found).be.undefined; }); it("can add", () => { let source = undefined; let found = patch.apply(source, { op: "add", path: "", value: "abc" }); chai_1.expect(found).eql("abc"); }); it("can replace", () => { let source = "abc"; let found = patch.apply(source, { op: "replace", path: "", value: "xyz" }); chai_1.expect(found).eql("xyz"); }); it("cannot use missing op", () => { let source = "abc"; try { patch.apply(source, { op: "missing", path: "", value: "xyz" }); throw new Error("Missing exception"); } catch (e) { chai_1.expect(e.message).eql("Unhandled condition: Patch {\"op\":\"missing\",\"path\":\"\",\"value\":\"xyz\"} cannot be applied to \"abc\""); } }); }); }); //# sourceMappingURL=apply.spec.js.map