UNPKG

json-schema-library

Version:

Customizable and hackable json-validator and json-schema utilities for traversal, data generation and validation

189 lines (158 loc) 6.29 kB
import { strict as assert } from "assert"; import { compileSchema } from "../compileSchema"; describe("keyword : patternProperties : get", () => { it("should step into patternProperties", () => { const node = compileSchema({ type: "object", patternProperties: { "[0-9][0-9]7": { type: "string", minLength: 1 } } }); const schema = node.getNodeChild("007")?.node?.schema; assert.deepEqual(schema, { type: "string", minLength: 1 }); }); it("should NOT step into patternProperties", () => { const node = compileSchema({ type: "object", patternProperties: { "[0-9][0-9]7": { type: "string", minLength: 1 } } }); const schema = node.getNodeChild("[0-9][0-9]7")?.node?.schema; assert.deepEqual(schema, undefined); }); }); describe("keyword : patternProperties : validate", () => { it("should return an error for matching pattern and failed validation", () => { const { errors } = compileSchema({ type: "object", patternProperties: { test: { type: "number" } } }).validate({ test: "invalid type" }); assert.equal(errors.length, 1); assert.equal(errors[0].code, "type-error"); }); it("should validate a correct matching pattern", () => { const { errors } = compileSchema({ type: "object", patternProperties: { test: { type: "number" } } }).validate({ test: 10 }); assert.equal(errors.length, 0); }); it("should return an error for matching regex pattern and failed validation", () => { const { errors } = compileSchema({ type: "object", patternProperties: { "^.est?": { type: "number" } } }).validate({ test: "invalid type" }); assert.equal(errors.length, 1); assert.equal(errors[0].code, "type-error"); }); it("should invalidate defined property", () => { const { errors } = compileSchema({ type: "object", properties: { test: { type: "string" } }, patternProperties: { "^.est?": { type: "number" } } }).validate({ test: "invalid type" }); assert.equal(errors.length, 1); assert.equal(errors[0].code, "type-error"); }); it("should return 'no-additional-properties-error' if additional properties are not allowed", () => { const { errors } = compileSchema({ type: "object", properties: { test: { type: "string" } }, patternProperties: { "^.est?$": { type: "number" } }, additionalProperties: false }).validate({ tester: "invalid property" }); assert.equal(errors.length, 1); assert.equal(errors[0].code, "no-additional-properties-error"); }); it("should return an error if one of the matching patterns does not validate", () => { const { errors } = compileSchema({ type: "object", patternProperties: { "^.est?$": { type: "number" }, "^.est$": { type: "string" } }, additionalProperties: false }).validate({ test: 10 }); assert.equal(errors.length, 1); assert.equal(errors[0].code, "type-error"); }); it("should return no error if additional properties are not allowed but valid in patterns", () => { const { errors } = compileSchema({ type: "object", patternProperties: { "^.est?$": { type: "number" } }, additionalProperties: false }).validate({ tes: 10 }); assert.equal(errors.length, 0); }); it("should return no error if additional properties validate value", () => { const { errors } = compileSchema({ type: "object", patternProperties: { "^.est?$": { type: "number" } }, additionalProperties: { type: "string" } }).validate({ anAddedProp: "valid" }); assert.equal(errors.length, 0); }); it("should return an AdditionalPropertiesError if additional properties do not validate", () => { const { errors } = compileSchema({ type: "object", patternProperties: { "^.est?$": { type: "number" } }, additionalProperties: { type: "string" } }).validate({ anAddedProp: 100 }); assert.equal(errors.length, 1); assert.equal(errors[0].code, "type-error"); }); }); describe("keyword : patternProperties : reduce", () => { it("should return schema of matching property", () => { const { node } = compileSchema({ properties: { label: { type: "string", maxLength: 99 } }, patternProperties: { "[0-9][0-9]7": { type: "string", minLength: 2 } } }).reduceNode({ "007": "match", title: "no match" }); assert.deepEqual(node.schema, { properties: { label: { type: "string", maxLength: 99 }, "007": { type: "string", minLength: 2 } } }); }); it("should merge schema with matching property schema", () => { const { node } = compileSchema({ properties: { "007": { type: "string", maxLength: 99 } }, patternProperties: { "[0-9][0-9]7": { type: "string", minLength: 2 } } }).reduceNode({ data: { "007": "match" } }); assert.deepEqual(node.schema, { properties: { "007": { type: "string", minLength: 2, maxLength: 99 } } }); }); it("should add patterns to properties per default", () => { const { node } = compileSchema({ properties: { "007": { type: "string", maxLength: 99 } }, patternProperties: { "[0-9][0-9]7": { type: "string", minLength: 2 } } }).reduceNode({}); assert.deepEqual(node.schema, { properties: { "007": { type: "string", minLength: 2, maxLength: 99 } } }); }); });