@wizard9/json-patch-apply
Version:
A library for describing, calculating, and applying patches to Javascript Objects.
122 lines • 5.53 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const chai_1 = require("chai");
const pointer_1 = require("../src/pointer");
describe("pointer", () => {
describe("encode/decode", () => {
it("handles key without ~ or /", () => {
chai_1.expect(pointer_1.JsonPointer.encode("abc")).eql("abc");
chai_1.expect(pointer_1.JsonPointer.encode("123")).eql("123");
chai_1.expect(pointer_1.JsonPointer.decode("abc")).eql("abc");
chai_1.expect(pointer_1.JsonPointer.decode("123")).eql("123");
});
it("handles ~", () => {
chai_1.expect(pointer_1.JsonPointer.encode("~ab")).eql("~0ab");
chai_1.expect(pointer_1.JsonPointer.encode("a~b")).eql("a~0b");
chai_1.expect(pointer_1.JsonPointer.encode("ab~")).eql("ab~0");
chai_1.expect(pointer_1.JsonPointer.decode("~0ab")).eql("~ab");
chai_1.expect(pointer_1.JsonPointer.decode("a~0b")).eql("a~b");
chai_1.expect(pointer_1.JsonPointer.decode("ab~0")).eql("ab~");
});
it("handles /", () => {
chai_1.expect(pointer_1.JsonPointer.encode("/ab")).eql("~1ab");
chai_1.expect(pointer_1.JsonPointer.encode("a/b")).eql("a~1b");
chai_1.expect(pointer_1.JsonPointer.encode("ab/")).eql("ab~1");
chai_1.expect(pointer_1.JsonPointer.decode("~1ab")).eql("/ab");
chai_1.expect(pointer_1.JsonPointer.decode("a~1b")).eql("a/b");
chai_1.expect(pointer_1.JsonPointer.decode("ab~1")).eql("ab/");
});
it("can decode encoded to same thing", () => {
let chars = ["~", "/", "a", "b"];
let s = [""];
for (let i = 0; i < chars.length; i++) {
let c = chars[i];
let len = s.length;
for (let x = 0; x < len; x++) {
let sv = s.shift();
if (sv && sv.length == 0) {
s.push(c);
}
else {
s.push(c + sv);
s.push(sv + c);
}
}
}
s.forEach((sv) => {
let encoded = pointer_1.JsonPointer.encode(sv);
let decoded = pointer_1.JsonPointer.decode(encoded);
chai_1.expect(sv, "expected encode/decode of '" + sv + "' to work").eql(decoded);
});
});
});
describe("find", () => {
it("returns undefined when pointing at root", () => {
chai_1.expect(pointer_1.JsonPointer.findParent("abc", "")).not.be.undefined;
chai_1.expect(pointer_1.JsonPointer.findParent("abc", "/")).not.be.undefined;
});
it("fails with invalid path", () => {
try {
pointer_1.JsonPointer.findParent("abc", "a/");
throw new Error("missing error");
}
catch (e) {
chai_1.expect(e.message).eql("Invalid JSON Pointer syntax. Path should always begin with a /");
}
});
it("returns index for top level array", () => {
let source = [0];
let find = pointer_1.JsonPointer.findParent(source, "/0");
chai_1.expect(find).not.undefined;
if (find) {
chai_1.expect(find.key).eq("0");
chai_1.expect(find.parent).eq(source);
}
});
it("returns index for nested array", () => {
let source = { test: [0] };
let find = pointer_1.JsonPointer.findParent(source, "/test/0");
chai_1.expect(find).not.undefined;
if (find) {
chai_1.expect(find.key).eq("0");
chai_1.expect(find.parent).eq(source.test);
}
});
it("returns key for top level object", () => {
let source = { name: "Peter" };
let find = pointer_1.JsonPointer.findParent(source, "/name");
chai_1.expect(find).not.undefined;
if (find) {
chai_1.expect(find.key).eq("name");
chai_1.expect(find.parent).eq(source);
}
});
it("returns key for nested object", () => {
let source = { test: { name: "Peter" } };
let find = pointer_1.JsonPointer.findParent(source, "/test/name");
chai_1.expect(find).not.undefined;
if (find) {
chai_1.expect(find.key).eq("name");
chai_1.expect(find.parent).eq(source.test);
}
});
it("returns undefined when path does not exist", () => {
let source = { test: { name: "Peter" } };
let top = pointer_1.JsonPointer.findParent(source, "/missing");
let nested = pointer_1.JsonPointer.findParent(source, "/test/missing");
let missing = pointer_1.JsonPointer.findParent(source, "/missing/missing");
if (top && nested && !missing) {
chai_1.expect(top.parent).eq(source);
chai_1.expect(top.key).eq("missing");
chai_1.expect(nested.parent).eq(source.test);
chai_1.expect(nested.key).eq("missing");
}
else {
chai_1.expect(top).not.be.undefined;
chai_1.expect(nested).not.be.undefined;
}
chai_1.expect(missing).be.undefined;
});
});
});
//# sourceMappingURL=pointer.spec.js.map