valia
Version:
A runtime data validator in TypeScript with advanced type inference, built-in validation functions, and seamless integration for server and client environments.
306 lines (265 loc) • 11.9 kB
JavaScript
import { describe, it, before } from "node:test";
import assert from "node:assert";
import { Schema } from "../../../dist/index.js";
describe("\nschema / formats / Struct", () => {
const xSymbol = Symbol("x");
const ySymbol = Symbol("y");
describe("Default", () => {
let struct_prop_0, struct_prop_1, struct_prop_2, struct_prop_symbol;
before(() => {
struct_prop_0 = new Schema({
type: "struct",
struct: {}
});
struct_prop_1 = new Schema({
type: "struct",
struct: {
foo: { type: "string" }
}
});
struct_prop_2 = new Schema({
type: "struct",
struct: {
foo: { type: "string" },
bar: { type: "string" }
}
});
struct_prop_symbol = new Schema({
type: "struct",
struct: {
foo: { type: "string" },
[xSymbol]: { type: "string" }
}
});
});
it("should invalidate incorrect values", () => {
assert.strictEqual(struct_prop_0.validate(0), false);
assert.strictEqual(struct_prop_0.validate([]), false);
assert.strictEqual(struct_prop_0.validate({ x: "x" }), false);
assert.strictEqual(struct_prop_1.validate(0), false);
assert.strictEqual(struct_prop_1.validate({}), false);
assert.strictEqual(struct_prop_1.validate({ foo: 0 }), false);
assert.strictEqual(struct_prop_2.validate(0), false);
assert.strictEqual(struct_prop_2.validate({}), false);
assert.strictEqual(struct_prop_2.validate({ foo: 0 }), false);
assert.strictEqual(struct_prop_2.validate({ foo: "x" }), false);
assert.strictEqual(struct_prop_2.validate({ foo: "x", bar: 0 }), false);
assert.strictEqual(struct_prop_symbol.validate(0), false);
assert.strictEqual(struct_prop_symbol.validate({}), false);
assert.strictEqual(struct_prop_symbol.validate({ foo: 0 }), false);
assert.strictEqual(struct_prop_symbol.validate({ foo: "x" }), false);
assert.strictEqual(struct_prop_symbol.validate({ foo: "x", [ySymbol]: "x" }), false);
});
it("should validate correct values", () => {
assert.strictEqual(struct_prop_0.validate({}), true);
assert.strictEqual(struct_prop_1.validate({ foo: "x" }), true);
assert.strictEqual(struct_prop_2.validate({ foo: "x", bar: "x" }), true);
assert.strictEqual(struct_prop_symbol.validate({ foo: "x", [xSymbol]: "x" }), true);
});
});
describe("Default (Shorthand Struct)", () => {
let struct_shorthand;
before(() => {
struct_shorthand = new Schema({
type: "struct",
struct: {
foo: {
foo: { type: "string" },
[xSymbol]: { type: "string" }
}
}
});
});
it("should invalidate incorrect values", () => {
assert.strictEqual(struct_shorthand.validate(0), false);
assert.strictEqual(struct_shorthand.validate([]), false);
assert.strictEqual(struct_shorthand.validate({}), false);
assert.strictEqual(struct_shorthand.validate({ foo: "x" }), false);
assert.strictEqual(struct_shorthand.validate({ foo: { foo: "x" } }), false);
assert.strictEqual(struct_shorthand.validate({ y: { foo: "x", [xSymbol]: "x" } }), false);
assert.strictEqual(struct_shorthand.validate({ foo: { y: "x", [xSymbol]: "x" } }), false);
assert.strictEqual(struct_shorthand.validate({ foo: { foo: "x", [ySymbol]: "x" } }), false);
});
it("should validate correct values", () => {
assert.strictEqual(struct_shorthand.validate({ foo: { foo: "x", [xSymbol]: "x" } }), true);
});
it("should return the correct rejection", () => {
assert.deepStrictEqual(struct_shorthand.evaluate({
foo: {
foo: "x",
[xSymbol]: 0
}
}), {
reject: {
code: "TYPE.STRING.NOT_SATISFIED",
type: "string",
path: {
explicit: ['struct', 'foo', 'struct', xSymbol],
implicit: ['&', 'foo', '&', xSymbol]
},
label: undefined,
message: undefined
}
});
});
});
describe("'optional' parameter (Boolean value)", () => {
let struct_optional_true, struct_optional_false;
before(() => {
struct_optional_true = new Schema({
type: "struct",
optional: true,
struct: {
foo: { type: "string" },
bar: { type: "string" },
[xSymbol]: { type: "string" }
}
});
struct_optional_false = new Schema({
type: "struct",
optional: false,
struct: {
foo: { type: "string" },
bar: { type: "string" },
[xSymbol]: { type: "string" }
}
});
});
it("should invalidate incorrect values", () => {
assert.strictEqual(struct_optional_true.validate(0), false);
assert.strictEqual(struct_optional_true.validate([]), false);
assert.strictEqual(struct_optional_true.validate({ foo: 0 }), false);
assert.strictEqual(struct_optional_true.validate({ y: "x", bar: "x", [xSymbol]: "x" }), false);
assert.strictEqual(struct_optional_true.validate({ foo: "x", y: "x", [xSymbol]: "x" }), false);
assert.strictEqual(struct_optional_true.validate({ foo: "x", bar: "x", [ySymbol]: "x" }), false);
assert.strictEqual(struct_optional_false.validate(0), false);
assert.strictEqual(struct_optional_false.validate([]), false);
assert.strictEqual(struct_optional_false.validate({}), false);
assert.strictEqual(struct_optional_false.validate({ foo: "x" }), false);
assert.strictEqual(struct_optional_false.validate({ foo: "x", bar: "x" }), false);
assert.strictEqual(struct_optional_false.validate({ foo: "x", [xSymbol]: "x" }), false);
});
it("should validate correct values", () => {
assert.strictEqual(struct_optional_true.validate({}), true);
assert.strictEqual(struct_optional_true.validate({ foo: "x" }), true);
assert.strictEqual(struct_optional_true.validate({ foo: "x", bar: "x" }), true);
assert.strictEqual(struct_optional_true.validate({ foo: "x", [xSymbol]: "x" }), true);
assert.strictEqual(struct_optional_true.validate({ foo: "x", bar: "x", [xSymbol]: "x" }), true);
assert.strictEqual(struct_optional_false.validate({ foo: "x", bar: "x", [xSymbol]: "x" }), true);
});
});
describe("'optional' parameter (Array value)", () => {
let struct_optional_array;
before(() => {
struct_optional_array = new Schema({
type: "struct",
optional: ["bar", xSymbol],
struct: {
foo: { type: "string" },
bar: { type: "string" },
[xSymbol]: { type: "string" }
}
});
});
it("should invalidate incorrect values", () => {
assert.strictEqual(struct_optional_array.validate(0), false);
assert.strictEqual(struct_optional_array.validate([]), false);
assert.strictEqual(struct_optional_array.validate({}), false);
assert.strictEqual(struct_optional_array.validate({ foo: 0 }), false);
assert.strictEqual(struct_optional_array.validate({ bar: "x" }), false);
assert.strictEqual(struct_optional_array.validate({ [xSymbol]: "x" }), false);
assert.strictEqual(struct_optional_array.validate({ bar: "x", [xSymbol]: "x" }), false);
assert.strictEqual(struct_optional_array.validate({ y: "x", bar: "x", [xSymbol]: "x" }), false);
assert.strictEqual(struct_optional_array.validate({ foo: "x", y: "x", [xSymbol]: "x" }), false);
assert.strictEqual(struct_optional_array.validate({ foo: "x", bar: "x", [ySymbol]: "x" }), false);
});
it("should validate correct values", () => {
assert.strictEqual(struct_optional_array.validate({ foo: "x" }), true);
assert.strictEqual(struct_optional_array.validate({ foo: "x", bar: "x" }), true);
assert.strictEqual(struct_optional_array.validate({ foo: "x", [xSymbol]: "x" }), true);
assert.strictEqual(struct_optional_array.validate({ foo: "x", bar: "x", [xSymbol]: "x" }), true);
});
});
describe("'additional' parameter (Boolean value)", () => {
let struct_additional_true, struct_additional_false;
before(() => {
struct_additional_true = new Schema({
type: "struct",
additional: true,
struct: {
foo: { type: "string" },
bar: { type: "string" },
[xSymbol]: { type: "string" }
}
});
struct_additional_false = new Schema({
type: "struct",
additional: false,
struct: {
foo: { type: "string" },
bar: { type: "string" },
[xSymbol]: { type: "string" }
}
});
});
it("should invalidate incorrect values", () => {
assert.strictEqual(struct_additional_true.validate(0), false);
assert.strictEqual(struct_additional_true.validate([]), false);
assert.strictEqual(struct_additional_true.validate({}), false);
assert.strictEqual(struct_additional_true.validate({ foo: 0 }), false);
assert.strictEqual(struct_additional_true.validate({ y: "x", bar: "x", [xSymbol]: "x" }), false);
assert.strictEqual(struct_additional_true.validate({ foo: "x", y: "x", [xSymbol]: "x" }), false);
assert.strictEqual(struct_additional_true.validate({ foo: "x", bar: "x", [ySymbol]: "x" }), false);
assert.strictEqual(struct_additional_false.validate(0), false);
assert.strictEqual(struct_additional_false.validate([]), false);
assert.strictEqual(struct_additional_false.validate({}), false);
assert.strictEqual(struct_additional_false.validate({ foo: "x" }), false);
assert.strictEqual(struct_additional_false.validate({ foo: "x", bar: "x" }), false);
assert.strictEqual(struct_additional_false.validate({ foo: "x", [xSymbol]: "x" }), false);
assert.strictEqual(struct_additional_false.validate({ foo: "x", bar: "x", [xSymbol]: "x", y: "x" }), false);
assert.strictEqual(struct_additional_false.validate({ foo: "x", bar: "x", [xSymbol]: "x", [ySymbol]: "x" }), false);
});
it("should validate correct values", () => {
assert.strictEqual(struct_additional_true.validate({ foo: "x", bar: "x", [xSymbol]: "x" }), true);
assert.strictEqual(struct_additional_true.validate({ foo: "x", bar: "x", [xSymbol]: "x", y: "x" }), true);
assert.strictEqual(struct_additional_true.validate({ foo: "x", bar: "x", [xSymbol]: "x", [ySymbol]: "x" }), true);
assert.strictEqual(struct_additional_true.validate({ foo: "x", bar: "x", [xSymbol]: "x", y: "x", [ySymbol]: "x" }), true);
assert.strictEqual(struct_additional_false.validate({ foo: "x", bar: "x", [xSymbol]: "x" }), true);
});
});
describe("'additional' parameter (Record value)", () => {
let struct_additional_record;
before(() => {
struct_additional_record = new Schema({
type: "struct",
additional: {
type: "record",
key: { type: "string" },
value: { type: "string" }
},
struct: {
foo: { type: "string" },
bar: { type: "string" },
[xSymbol]: { type: "string" }
}
});
});
it("should invalidate incorrect values", () => {
assert.strictEqual(struct_additional_record.validate(0), false);
assert.strictEqual(struct_additional_record.validate([]), false);
assert.strictEqual(struct_additional_record.validate({}), false);
assert.strictEqual(struct_additional_record.validate({ foo: 0 }), false);
assert.strictEqual(struct_additional_record.validate({ y: "x", bar: "x", [xSymbol]: "x" }), false);
assert.strictEqual(struct_additional_record.validate({ foo: "x", y: "x", [xSymbol]: "x" }), false);
assert.strictEqual(struct_additional_record.validate({ foo: "x", bar: "x", [ySymbol]: "x" }), false);
assert.strictEqual(struct_additional_record.validate({ foo: "x", bar: "x", [xSymbol]: "x", y: 0 }), false);
assert.strictEqual(struct_additional_record.validate({ foo: "x", bar: "x", [xSymbol]: "x", [ySymbol]: 0 }), false);
assert.strictEqual(struct_additional_record.validate({ foo: "x", bar: "x", [xSymbol]: "x", [ySymbol]: "x" }), false);
});
it("should validate correct values", () => {
assert.strictEqual(struct_additional_record.validate({ foo: "x", bar: "x", [xSymbol]: "x" }), true);
assert.strictEqual(struct_additional_record.validate({ foo: "x", bar: "x", [xSymbol]: "x", y: "x" }), true);
assert.strictEqual(struct_additional_record.validate({ foo: "x", bar: "x", [xSymbol]: "x", y: "x", z: "x" }), true);
});
});
});