UNPKG

zod

Version:

TypeScript-first schema declaration and validation library with static type inference

441 lines (359 loc) • 12.2 kB
// @ts-ignore TS6133 import { expect, test } from "vitest"; import * as z from "zod/v3"; import { util } from "../helpers/util.js"; import { Mocker } from "./Mocker.js"; const literalStringSchema = z.literal("asdf"); const literalNumberSchema = z.literal(12); const literalBooleanSchema = z.literal(true); const literalBigIntSchema = z.literal(BigInt(42)); const MySymbol = Symbol("stuff"); const literalSymbolSchema = z.literal(MySymbol); const stringSchema = z.string(); const numberSchema = z.number(); const bigintSchema = z.bigint(); const booleanSchema = z.boolean(); const dateSchema = z.date(); const symbolSchema = z.symbol(); const nullSchema = z.null(); const undefinedSchema = z.undefined(); const stringSchemaOptional = z.string().optional(); const stringSchemaNullable = z.string().nullable(); const numberSchemaOptional = z.number().optional(); const numberSchemaNullable = z.number().nullable(); const bigintSchemaOptional = z.bigint().optional(); const bigintSchemaNullable = z.bigint().nullable(); const booleanSchemaOptional = z.boolean().optional(); const booleanSchemaNullable = z.boolean().nullable(); const dateSchemaOptional = z.date().optional(); const dateSchemaNullable = z.date().nullable(); const symbolSchemaOptional = z.symbol().optional(); const symbolSchemaNullable = z.symbol().nullable(); const val = new Mocker(); test("literal string correct", () => { expect(literalStringSchema.parse("asdf")).toBe("asdf"); }); test("literal string incorrect", () => { const f = () => literalStringSchema.parse("not_asdf"); expect(f).toThrow(); }); test("literal string number", () => { const f = () => literalStringSchema.parse(123); expect(f).toThrow(); }); test("literal string boolean", () => { const f = () => literalStringSchema.parse(true); expect(f).toThrow(); }); test("literal string boolean", () => { const f = () => literalStringSchema.parse(true); expect(f).toThrow(); }); test("literal string object", () => { const f = () => literalStringSchema.parse({}); expect(f).toThrow(); }); test("literal number correct", () => { expect(literalNumberSchema.parse(12)).toBe(12); }); test("literal number incorrect", () => { const f = () => literalNumberSchema.parse(13); expect(f).toThrow(); }); test("literal number number", () => { const f = () => literalNumberSchema.parse(val.string); expect(f).toThrow(); }); test("literal number boolean", () => { const f = () => literalNumberSchema.parse(val.boolean); expect(f).toThrow(); }); test("literal number object", () => { const f = () => literalStringSchema.parse({}); expect(f).toThrow(); }); test("literal boolean correct", () => { expect(literalBooleanSchema.parse(true)).toBe(true); }); test("literal boolean incorrect", () => { const f = () => literalBooleanSchema.parse(false); expect(f).toThrow(); }); test("literal boolean number", () => { const f = () => literalBooleanSchema.parse("asdf"); expect(f).toThrow(); }); test("literal boolean boolean", () => { const f = () => literalBooleanSchema.parse(123); expect(f).toThrow(); }); test("literal boolean object", () => { const f = () => literalBooleanSchema.parse({}); expect(f).toThrow(); }); test("literal bigint correct", () => { expect(literalBigIntSchema.parse(BigInt(42))).toBe(BigInt(42)); }); test("literal bigint incorrect", () => { const f = () => literalBigIntSchema.parse(BigInt(43)); expect(f).toThrow(); }); test("literal bigint number", () => { const f = () => literalBigIntSchema.parse("asdf"); expect(f).toThrow(); }); test("literal bigint boolean", () => { const f = () => literalBigIntSchema.parse(123); expect(f).toThrow(); }); test("literal bigint object", () => { const f = () => literalBigIntSchema.parse({}); expect(f).toThrow(); }); test("literal symbol", () => { util.assertEqual<z.infer<typeof literalSymbolSchema>, typeof MySymbol>(true); literalSymbolSchema.parse(MySymbol); expect(() => literalSymbolSchema.parse(Symbol("asdf"))).toThrow(); }); test("parse stringSchema string", () => { stringSchema.parse(val.string); }); test("parse stringSchema number", () => { const f = () => stringSchema.parse(val.number); expect(f).toThrow(); }); test("parse stringSchema boolean", () => { const f = () => stringSchema.parse(val.boolean); expect(f).toThrow(); }); test("parse stringSchema undefined", () => { const f = () => stringSchema.parse(val.undefined); expect(f).toThrow(); }); test("parse stringSchema null", () => { const f = () => stringSchema.parse(val.null); expect(f).toThrow(); }); test("parse numberSchema string", () => { const f = () => numberSchema.parse(val.string); expect(f).toThrow(); }); test("parse numberSchema number", () => { numberSchema.parse(val.number); }); test("parse numberSchema bigint", () => { const f = () => numberSchema.parse(val.bigint); expect(f).toThrow(); }); test("parse numberSchema boolean", () => { const f = () => numberSchema.parse(val.boolean); expect(f).toThrow(); }); test("parse numberSchema undefined", () => { const f = () => numberSchema.parse(val.undefined); expect(f).toThrow(); }); test("parse numberSchema null", () => { const f = () => numberSchema.parse(val.null); expect(f).toThrow(); }); test("parse bigintSchema string", () => { const f = () => bigintSchema.parse(val.string); expect(f).toThrow(); }); test("parse bigintSchema number", () => { const f = () => bigintSchema.parse(val.number); expect(f).toThrow(); }); test("parse bigintSchema bigint", () => { bigintSchema.parse(val.bigint); }); test("parse bigintSchema boolean", () => { const f = () => bigintSchema.parse(val.boolean); expect(f).toThrow(); }); test("parse bigintSchema undefined", () => { const f = () => bigintSchema.parse(val.undefined); expect(f).toThrow(); }); test("parse bigintSchema null", () => { const f = () => bigintSchema.parse(val.null); expect(f).toThrow(); }); test("parse booleanSchema string", () => { const f = () => booleanSchema.parse(val.string); expect(f).toThrow(); }); test("parse booleanSchema number", () => { const f = () => booleanSchema.parse(val.number); expect(f).toThrow(); }); test("parse booleanSchema boolean", () => { booleanSchema.parse(val.boolean); }); test("parse booleanSchema undefined", () => { const f = () => booleanSchema.parse(val.undefined); expect(f).toThrow(); }); test("parse booleanSchema null", () => { const f = () => booleanSchema.parse(val.null); expect(f).toThrow(); }); // ============== test("parse dateSchema string", () => { const f = () => dateSchema.parse(val.string); expect(f).toThrow(); }); test("parse dateSchema number", () => { const f = () => dateSchema.parse(val.number); expect(f).toThrow(); }); test("parse dateSchema boolean", () => { const f = () => dateSchema.parse(val.boolean); expect(f).toThrow(); }); test("parse dateSchema date", () => { dateSchema.parse(val.date); }); test("parse dateSchema undefined", () => { const f = () => dateSchema.parse(val.undefined); expect(f).toThrow(); }); test("parse dateSchema null", () => { const f = () => dateSchema.parse(val.null); expect(f).toThrow(); }); test("parse dateSchema invalid date", async () => { try { await dateSchema.parseAsync(new Date("invalid")); } catch (err) { expect((err as z.ZodError).issues[0].code).toEqual(z.ZodIssueCode.invalid_date); } }); // ============== test("parse symbolSchema string", () => { const f = () => symbolSchema.parse(val.string); expect(f).toThrow(); }); test("parse symbolSchema number", () => { const f = () => symbolSchema.parse(val.number); expect(f).toThrow(); }); test("parse symbolSchema boolean", () => { const f = () => symbolSchema.parse(val.boolean); expect(f).toThrow(); }); test("parse symbolSchema date", () => { const f = () => symbolSchema.parse(val.date); expect(f).toThrow(); }); test("parse symbolSchema symbol", () => { symbolSchema.parse(val.symbol); }); test("parse symbolSchema undefined", () => { const f = () => symbolSchema.parse(val.undefined); expect(f).toThrow(); }); test("parse symbolSchema null", () => { const f = () => symbolSchema.parse(val.null); expect(f).toThrow(); }); // ============== test("parse undefinedSchema string", () => { const f = () => undefinedSchema.parse(val.string); expect(f).toThrow(); }); test("parse undefinedSchema number", () => { const f = () => undefinedSchema.parse(val.number); expect(f).toThrow(); }); test("parse undefinedSchema boolean", () => { const f = () => undefinedSchema.parse(val.boolean); expect(f).toThrow(); }); test("parse undefinedSchema undefined", () => { undefinedSchema.parse(val.undefined); }); test("parse undefinedSchema null", () => { const f = () => undefinedSchema.parse(val.null); expect(f).toThrow(); }); test("parse nullSchema string", () => { const f = () => nullSchema.parse(val.string); expect(f).toThrow(); }); test("parse nullSchema number", () => { const f = () => nullSchema.parse(val.number); expect(f).toThrow(); }); test("parse nullSchema boolean", () => { const f = () => nullSchema.parse(val.boolean); expect(f).toThrow(); }); test("parse nullSchema undefined", () => { const f = () => nullSchema.parse(val.undefined); expect(f).toThrow(); }); test("parse nullSchema null", () => { nullSchema.parse(val.null); }); test("primitive inference", () => { util.assertEqual<z.TypeOf<typeof literalStringSchema>, "asdf">(true); util.assertEqual<z.TypeOf<typeof literalNumberSchema>, 12>(true); util.assertEqual<z.TypeOf<typeof literalBooleanSchema>, true>(true); util.assertEqual<z.TypeOf<typeof literalBigIntSchema>, bigint>(true); util.assertEqual<z.TypeOf<typeof stringSchema>, string>(true); util.assertEqual<z.TypeOf<typeof numberSchema>, number>(true); util.assertEqual<z.TypeOf<typeof bigintSchema>, bigint>(true); util.assertEqual<z.TypeOf<typeof booleanSchema>, boolean>(true); util.assertEqual<z.TypeOf<typeof dateSchema>, Date>(true); util.assertEqual<z.TypeOf<typeof symbolSchema>, symbol>(true); util.assertEqual<z.TypeOf<typeof nullSchema>, null>(true); util.assertEqual<z.TypeOf<typeof undefinedSchema>, undefined>(true); util.assertEqual<z.TypeOf<typeof stringSchemaOptional>, string | undefined>(true); util.assertEqual<z.TypeOf<typeof stringSchemaNullable>, string | null>(true); util.assertEqual<z.TypeOf<typeof numberSchemaOptional>, number | undefined>(true); util.assertEqual<z.TypeOf<typeof numberSchemaNullable>, number | null>(true); util.assertEqual<z.TypeOf<typeof bigintSchemaOptional>, bigint | undefined>(true); util.assertEqual<z.TypeOf<typeof bigintSchemaNullable>, bigint | null>(true); util.assertEqual<z.TypeOf<typeof booleanSchemaOptional>, boolean | undefined>(true); util.assertEqual<z.TypeOf<typeof booleanSchemaNullable>, boolean | null>(true); util.assertEqual<z.TypeOf<typeof dateSchemaOptional>, Date | undefined>(true); util.assertEqual<z.TypeOf<typeof dateSchemaNullable>, Date | null>(true); util.assertEqual<z.TypeOf<typeof symbolSchemaOptional>, symbol | undefined>(true); util.assertEqual<z.TypeOf<typeof symbolSchemaNullable>, symbol | null>(true); // [ // literalStringSchemaTest, // literalNumberSchemaTest, // literalBooleanSchemaTest, // literalBigIntSchemaTest, // stringSchemaTest, // numberSchemaTest, // bigintSchemaTest, // booleanSchemaTest, // dateSchemaTest, // symbolSchemaTest, // nullSchemaTest, // undefinedSchemaTest, // stringSchemaOptionalTest, // stringSchemaNullableTest, // numberSchemaOptionalTest, // numberSchemaNullableTest, // bigintSchemaOptionalTest, // bigintSchemaNullableTest, // booleanSchemaOptionalTest, // booleanSchemaNullableTest, // dateSchemaOptionalTest, // dateSchemaNullableTest, // symbolSchemaOptionalTest, // symbolSchemaNullableTest, // ]; }); test("get literal value", () => { expect(literalStringSchema.value).toEqual("asdf"); }); test("optional convenience method", () => { z.ostring().parse(undefined); z.onumber().parse(undefined); z.oboolean().parse(undefined); });