json-schema-library
Version:
Customizable and hackable json-validator and json-schema utilities for traversal, data generation and validation
176 lines (147 loc) • 6.24 kB
text/typescript
import { strict as assert } from "assert";
import { compileSchema } from "../compileSchema";
describe("keyword : additionalProperties : get", () => {
it("should step into additionalProperties", () => {
const node = compileSchema({
type: "object",
additionalProperties: { type: "string", minLength: 1 }
});
const schema = node.getNodeChild("header", { header: "huhu" })?.node?.schema;
assert.deepEqual(schema, { type: "string", minLength: 1 });
});
it("should NOT step into additionalProperties if false", () => {
const node = compileSchema({
type: "object",
additionalProperties: false
});
const schema = node.getNodeChild("header", { header: "huhu" })?.node?.schema;
assert.deepEqual(schema, undefined);
});
it("should return undefined if additionalProperties is true", () => {
const node = compileSchema({
type: "object",
additionalProperties: true
});
const schema = node.getNodeChild("header", { header: "huhu" })?.node?.schema;
assert.deepEqual(schema, undefined);
});
it("should apply additionalProperties from allOf", () => {
const node = compileSchema({
type: "object",
allOf: [{ additionalProperties: true }]
});
const schema = node.getNodeChild("header", { header: "huhu" })?.node?.schema;
assert.deepEqual(schema, undefined);
});
it("should override additionalProperties from allOf", () => {
const node = compileSchema({
type: "object",
additionalProperties: { type: "number" },
allOf: [{ additionalProperties: { type: "boolean" } }]
});
const schema = node.getNodeChild("header")?.node?.schema;
assert.deepEqual(schema, { type: "boolean" });
});
});
describe("keyword : additionalProperties : validate", () => {
it("should return no-additional-properties-error if no schema is given for an additional property", () => {
const { errors } = compileSchema({ type: "object", additionalProperties: false }).validate({ a: 1 });
assert.deepEqual(errors.length, 1);
});
it("should return error for property not in properties schema", () => {
const { errors } = compileSchema({
$schema: "https://json-schema.org/draft/2019-09/schema",
properties: { foo: { $ref: "#" } },
additionalProperties: false
}).validate({ bar: false });
assert.deepEqual(errors.length, 1);
});
it("should return all no-additional-properties-error", () => {
const { errors } = compileSchema({
type: "object",
patternProperties: {
dummy: false
},
additionalProperties: false
}).validate({
a: 1,
b: 2
});
assert.deepEqual(errors.length, 2);
assert.deepEqual(errors[0].code, "no-additional-properties-error");
assert.deepEqual(errors[1].code, "no-additional-properties-error");
});
it("should be valid if 'additionalProperties' is 'true'", () => {
const { errors } = compileSchema({ type: "object", additionalProperties: true }).validate({ a: 1 });
assert.deepEqual(errors.length, 0);
});
it("should be valid if value matches 'additionalProperties' schema", () => {
const { errors } = compileSchema({
type: "object",
properties: { b: { type: "string" } },
additionalProperties: { type: "number" }
}).validate({ a: 1 });
assert.deepEqual(errors.length, 0);
});
it("should only validate existing definition in 'properties'", () => {
const { errors } = compileSchema({
type: "object",
properties: { b: { type: "string" } },
additionalProperties: { type: "number" }
}).validate({ b: "i am valid" });
assert.deepEqual(errors.length, 0);
});
it("should return error if value does not match 'additionalProperties' schema", () => {
const { errors } = compileSchema({
type: "object",
properties: { b: { type: "string" } },
additionalProperties: { type: "string" }
}).validate({ a: 1 });
assert.deepEqual(errors.length, 1);
assert.deepEqual(errors[0].type, "error");
});
it("should be valid if value matches 'additionalProperties' oneOf schema", () => {
const { errors } = compileSchema({
type: "object",
properties: { b: { type: "string" } },
additionalProperties: {
oneOf: [{ type: "number" }]
}
}).validate({ a: 1 });
assert.deepEqual(errors.length, 0);
});
it("should be invalid if value does not match 'additionalProperties' in oneOf schema", () => {
const { errors } = compileSchema({
type: "object",
properties: { b: { type: "string" } },
additionalProperties: {
oneOf: [{ type: "string" }]
}
}).validate({ a: 1 });
assert.deepEqual(errors.length, 1);
});
it("should be ignore properties that are matched by patternProperties", () => {
const { errors } = compileSchema({
type: "object",
properties: { b: { type: "string" } },
patternProperties: {
"^.$": { type: "number" }
},
additionalProperties: {
oneOf: [{ type: "string" }]
}
}).validate({ a: 1 });
assert.deepEqual(errors.length, 0);
});
it("should be invalid if value does match multiple 'additionalProperties' in oneOf schema", () => {
const { errors } = compileSchema({
type: "object",
properties: { b: { type: "string" } },
additionalProperties: {
oneOf: [{ type: "string" }, { type: "string" }]
}
}).validate({ a: "a string" });
assert.deepEqual(errors.length, 1);
// assert.deepEqual(errors[0].code, "additional-properties-error");
});
});