zod
Version:
TypeScript-first schema declaration and validation library with static type inference
88 lines (78 loc) • 2.34 kB
text/typescript
// @ts-ignore TS6133
import { expect, test } from "vitest";
import * as z from "zod/v3";
import { util } from "../helpers/util.js";
test("nativeEnum test with consts", () => {
const Fruits: { Apple: "apple"; Banana: "banana" } = {
Apple: "apple",
Banana: "banana",
};
const fruitEnum = z.nativeEnum(Fruits);
type fruitEnum = z.infer<typeof fruitEnum>;
fruitEnum.parse("apple");
fruitEnum.parse("banana");
fruitEnum.parse(Fruits.Apple);
fruitEnum.parse(Fruits.Banana);
util.assertEqual<fruitEnum, "apple" | "banana">(true);
});
test("nativeEnum test with real enum", () => {
enum Fruits {
Apple = "apple",
Banana = "banana",
}
// @ts-ignore
const fruitEnum = z.nativeEnum(Fruits);
type fruitEnum = z.infer<typeof fruitEnum>;
fruitEnum.parse("apple");
fruitEnum.parse("banana");
fruitEnum.parse(Fruits.Apple);
fruitEnum.parse(Fruits.Banana);
util.assertIs<fruitEnum extends Fruits ? true : false>(true);
});
test("nativeEnum test with const with numeric keys", () => {
const FruitValues = {
Apple: 10,
Banana: 20,
// @ts-ignore
} as const;
const fruitEnum = z.nativeEnum(FruitValues);
type fruitEnum = z.infer<typeof fruitEnum>;
fruitEnum.parse(10);
fruitEnum.parse(20);
fruitEnum.parse(FruitValues.Apple);
fruitEnum.parse(FruitValues.Banana);
util.assertEqual<fruitEnum, 10 | 20>(true);
});
test("from enum", () => {
enum Fruits {
Cantaloupe = 0,
Apple = "apple",
Banana = "banana",
}
const FruitEnum = z.nativeEnum(Fruits as any);
type _FruitEnum = z.infer<typeof FruitEnum>;
FruitEnum.parse(Fruits.Cantaloupe);
FruitEnum.parse(Fruits.Apple);
FruitEnum.parse("apple");
FruitEnum.parse(0);
expect(() => FruitEnum.parse(1)).toThrow();
expect(() => FruitEnum.parse("Apple")).toThrow();
expect(() => FruitEnum.parse("Cantaloupe")).toThrow();
});
test("from const", () => {
const Greek = {
Alpha: "a",
Beta: "b",
Gamma: 3,
// @ts-ignore
} as const;
const GreekEnum = z.nativeEnum(Greek);
type _GreekEnum = z.infer<typeof GreekEnum>;
GreekEnum.parse("a");
GreekEnum.parse("b");
GreekEnum.parse(3);
expect(() => GreekEnum.parse("v")).toThrow();
expect(() => GreekEnum.parse("Alpha")).toThrow();
expect(() => GreekEnum.parse(2)).toThrow();
expect(GreekEnum.enum.Alpha).toEqual("a");
});