diff --git a/src/constants/validationSchemas.ts b/src/constants/validationSchemas.ts index 1617f8f0..7d78e1a2 100644 --- a/src/constants/validationSchemas.ts +++ b/src/constants/validationSchemas.ts @@ -17,3 +17,15 @@ export const positiveNumberSchema = (fieldName: string) => { message: errorMessages.positiveNumber(fieldName), }); }; + +export const specificLengthStringSchema = ( + fieldName: string, + min: number, + max: number, +) => { + return z + .string() + .max(max, { message: errorMessages.maxLength(fieldName, max) }) + .trim() + .min(min, { message: errorMessages.minLength(fieldName, min) }); +}; diff --git a/tests/unit/validation/validationSchemas.test.ts b/tests/unit/validation/validationSchemas.test.ts new file mode 100644 index 00000000..0edab025 --- /dev/null +++ b/tests/unit/validation/validationSchemas.test.ts @@ -0,0 +1,63 @@ +import { errorMessages } from "@/constants/errorMessages"; +import { specificLengthStringSchema } from "@/constants/validationSchemas"; +import { describe, expect, test } from "vitest"; +import { SafeParseError } from "zod"; + +describe("specificLengthStringSchema", () => { + const fieldName = "field"; + const minLength = 1; + const maxLength = 500; + const schema = specificLengthStringSchema(fieldName, minLength, maxLength); + + type ValidationError = SafeParseError; + + test("rejects empty string", () => { + const validationResult = schema.safeParse("") as ValidationError; + expect(validationResult.error.errors[0].message).toBe( + errorMessages.minLength(fieldName, minLength), + ); + expect(validationResult.error.errors[0].path).toStrictEqual([]); + }); + + test("rejects string with only spaces", () => { + const validationResult = schema.safeParse(" ") as ValidationError; + expect(validationResult.error.errors[0].message).toBe( + errorMessages.minLength(fieldName, minLength), + ); + expect(validationResult.error.errors[0].path).toStrictEqual([]); + }); + + test("rejects string shorter than min length", () => { + const validationResult = schema.safeParse( + "a".repeat(minLength - 1), + ) as ValidationError; + expect(validationResult.error.errors[0].message).toBe( + errorMessages.minLength(fieldName, minLength), + ); + expect(validationResult.error.errors[0].path).toStrictEqual([]); + }); + + test("rejects string longer than max length", () => { + const validationResult = schema.safeParse( + "a".repeat(maxLength + 1), + ) as ValidationError; + expect(validationResult.error.errors[0].message).toBe( + errorMessages.maxLength(fieldName, maxLength), + ); + expect(validationResult.error.errors[0].path).toStrictEqual([]); + }); + + test("accepts string with length equal to min length", () => { + const validationResult = schema.safeParse( + "a".repeat(minLength), + ) as ValidationError; + expect(validationResult.success).toBe(true); + }); + + test("accepts string with length equal to max length", () => { + const validationResult = schema.safeParse( + "a".repeat(maxLength), + ) as ValidationError; + expect(validationResult.success).toBe(true); + }); +});