@wizard9/json-patch-apply
Version:
A library for describing, calculating, and applying patches to Javascript Objects.
311 lines • 13.6 kB
JavaScript
;
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