mirror of
https://github.com/cupcakearmy/zod.git
synced 2024-05-28 18:34:47 +02:00
126 lines
3.7 KiB
TypeScript
126 lines
3.7 KiB
TypeScript
// @ts-ignore TS6133
|
|
import { expect, test } from "@jest/globals";
|
|
|
|
import { util } from "../helpers/util";
|
|
import * as z from "../index";
|
|
|
|
const fish = z.object({
|
|
name: z.string(),
|
|
age: z.number(),
|
|
nested: z.object({}),
|
|
});
|
|
|
|
test("pick type inference", () => {
|
|
const nameonlyFish = fish.pick({ name: true });
|
|
type nameonlyFish = z.infer<typeof nameonlyFish>;
|
|
util.assertEqual<nameonlyFish, { name: string }>(true);
|
|
});
|
|
|
|
test("pick parse - success", () => {
|
|
const nameonlyFish = fish.pick({ name: true });
|
|
nameonlyFish.parse({ name: "bob" });
|
|
|
|
// @ts-expect-error checking runtime picks `name` only.
|
|
const anotherNameonlyFish = fish.pick({ name: true, age: false });
|
|
anotherNameonlyFish.parse({ name: "bob" });
|
|
});
|
|
|
|
test("pick parse - fail", () => {
|
|
fish.pick({ name: true }).parse({ name: "12" } as any);
|
|
fish.pick({ name: true }).parse({ name: "bob", age: 12 } as any);
|
|
fish.pick({ age: true }).parse({ age: 12 } as any);
|
|
|
|
const nameonlyFish = fish.pick({ name: true }).strict();
|
|
const bad1 = () => nameonlyFish.parse({ name: 12 } as any);
|
|
const bad2 = () => nameonlyFish.parse({ name: "bob", age: 12 } as any);
|
|
const bad3 = () => nameonlyFish.parse({ age: 12 } as any);
|
|
|
|
// @ts-expect-error checking runtime picks `name` only.
|
|
const anotherNameonlyFish = fish.pick({ name: true, age: false }).strict();
|
|
const bad4 = () => anotherNameonlyFish.parse({ name: "bob", age: 12 } as any);
|
|
|
|
expect(bad1).toThrow();
|
|
expect(bad2).toThrow();
|
|
expect(bad3).toThrow();
|
|
expect(bad4).toThrow();
|
|
});
|
|
|
|
test("omit type inference", () => {
|
|
const nonameFish = fish.omit({ name: true });
|
|
type nonameFish = z.infer<typeof nonameFish>;
|
|
util.assertEqual<nonameFish, { age: number; nested: {} }>(true);
|
|
});
|
|
|
|
test("omit parse - success", () => {
|
|
const nonameFish = fish.omit({ name: true });
|
|
nonameFish.parse({ age: 12, nested: {} });
|
|
|
|
// @ts-expect-error checking runtime omits `name` only.
|
|
const anotherNonameFish = fish.omit({ name: true, age: false });
|
|
anotherNonameFish.parse({ age: 12, nested: {} });
|
|
});
|
|
|
|
test("omit parse - fail", () => {
|
|
const nonameFish = fish.omit({ name: true });
|
|
const bad1 = () => nonameFish.parse({ name: 12 } as any);
|
|
const bad2 = () => nonameFish.parse({ age: 12 } as any);
|
|
const bad3 = () => nonameFish.parse({} as any);
|
|
|
|
// @ts-expect-error checking runtime omits `name` only.
|
|
const anotherNonameFish = fish.omit({ name: true, age: false });
|
|
const bad4 = () => anotherNonameFish.parse({ nested: {} } as any);
|
|
|
|
expect(bad1).toThrow();
|
|
expect(bad2).toThrow();
|
|
expect(bad3).toThrow();
|
|
expect(bad4).toThrow();
|
|
});
|
|
|
|
test("nonstrict inference", () => {
|
|
const laxfish = fish.pick({ name: true }).catchall(z.any());
|
|
type laxfish = z.infer<typeof laxfish>;
|
|
util.assertEqual<laxfish, { name: string } & { [k: string]: any }>(true);
|
|
});
|
|
|
|
test("nonstrict parsing - pass", () => {
|
|
const laxfish = fish.passthrough().pick({ name: true });
|
|
laxfish.parse({ name: "asdf", whatever: "asdf" });
|
|
laxfish.parse({ name: "asdf", age: 12, nested: {} });
|
|
});
|
|
|
|
test("nonstrict parsing - fail", () => {
|
|
const laxfish = fish.passthrough().pick({ name: true });
|
|
const bad = () => laxfish.parse({ whatever: "asdf" } as any);
|
|
expect(bad).toThrow();
|
|
});
|
|
|
|
test("pick a nonexistent key", () => {
|
|
const schema = z.object({
|
|
a: z.string(),
|
|
b: z.number(),
|
|
});
|
|
|
|
const pickedSchema = schema.pick({
|
|
a: true,
|
|
// @ts-expect-error should not accept unexpected keys.
|
|
doesntExist: true,
|
|
});
|
|
|
|
pickedSchema.parse({
|
|
a: "value",
|
|
});
|
|
});
|
|
|
|
test("omit a nonexistent key", () => {
|
|
const schema = z.object({
|
|
a: z.string(),
|
|
b: z.number(),
|
|
});
|
|
|
|
schema.omit({
|
|
a: true,
|
|
// @ts-expect-error should not accept unexpected keys.
|
|
doesntExist: true,
|
|
});
|
|
});
|