Files
stock-manager/tests/unit/schemas/user.schema.test.ts
T

160 lines
4.6 KiB
TypeScript

import { describe, expect, it } from "vitest"
import {
buildCreateUserSchema,
buildResetUserPasswordSchema,
buildSetUserActiveSchema,
buildUpdateUserSchema,
createUserSchema,
defaultUserSchemaCopy,
type UserSchemaCopy,
updateUserSchema,
} from "@/schemas/user.schema"
const esCopy: UserSchemaCopy = {
nameRequired: "El nombre es obligatorio",
emailInvalid: "Correo electrónico no válido",
passwordMinLength: "La contraseña debe tener al menos 8 caracteres",
userIdRequired: "El ID de usuario es obligatorio",
}
const validCreateData = {
name: "Admin User",
email: "admin@example.test",
password: "password1",
role: "ADMIN" as const,
isActive: true,
}
const validUpdateData = {
id: "user-id",
name: "Admin User",
email: "admin@example.test",
role: "ADMIN" as const,
isActive: true,
}
describe("user schema localization", () => {
it("buildCreateUserSchema with default copy produces same validation as createUserSchema", () => {
const result = buildCreateUserSchema(defaultUserSchemaCopy).safeParse({
name: "",
email: "bad",
password: "short",
role: "INVALID",
isActive: true,
})
expect(result.success).toBe(false)
if (!result.success) {
const errors = result.error.flatten().fieldErrors
expect(errors.name).toContain("Name is required")
expect(errors.email).toContain("Invalid email")
expect(errors.password).toContain(
"Password must be at least 8 characters",
)
// role error comes from z.enum, not our copy
expect(errors.role).toBeDefined()
}
})
it("buildCreateUserSchema with Spanish copy produces Spanish error messages", () => {
const result = buildCreateUserSchema(esCopy).safeParse({
name: "",
email: "bad",
password: "short",
role: "INVALID",
isActive: true,
})
expect(result.success).toBe(false)
if (!result.success) {
const errors = result.error.flatten().fieldErrors
expect(errors.name).toContain(esCopy.nameRequired)
expect(errors.email).toContain(esCopy.emailInvalid)
expect(errors.password).toContain(esCopy.passwordMinLength)
}
})
it("buildUpdateUserSchema with default copy produces same validation as updateUserSchema", () => {
const result = buildUpdateUserSchema(defaultUserSchemaCopy).safeParse({
id: "",
name: "",
email: "bad",
role: "INVALID",
isActive: true,
})
expect(result.success).toBe(false)
if (!result.success) {
const errors = result.error.flatten().fieldErrors
expect(errors.id).toContain("User id is required")
expect(errors.name).toContain("Name is required")
expect(errors.email).toContain("Invalid email")
}
})
it("buildUpdateUserSchema with Spanish copy produces Spanish error messages", () => {
const result = buildUpdateUserSchema(esCopy).safeParse({
id: "",
name: "",
email: "bad",
role: "INVALID",
isActive: true,
})
expect(result.success).toBe(false)
if (!result.success) {
const errors = result.error.flatten().fieldErrors
expect(errors.id).toContain(esCopy.userIdRequired)
expect(errors.name).toContain(esCopy.nameRequired)
expect(errors.email).toContain(esCopy.emailInvalid)
}
})
it("buildSetUserActiveSchema with default copy validates id requirement", () => {
const result = buildSetUserActiveSchema(defaultUserSchemaCopy).safeParse({
id: "",
isActive: true,
})
expect(result.success).toBe(false)
if (!result.success) {
expect(result.error.flatten().fieldErrors.id).toContain(
"User id is required",
)
}
})
it("buildResetUserPasswordSchema with default copy validates password and id", () => {
const result = buildResetUserPasswordSchema(
defaultUserSchemaCopy,
).safeParse({
id: "",
password: "short",
})
expect(result.success).toBe(false)
if (!result.success) {
const errors = result.error.flatten().fieldErrors
expect(errors.id).toContain("User id is required")
expect(errors.password).toContain(
"Password must be at least 8 characters",
)
}
})
it("default exports match builder with default copy for valid data", () => {
expect(createUserSchema.safeParse(validCreateData).success).toBe(true)
expect(
buildCreateUserSchema(defaultUserSchemaCopy).safeParse(validCreateData)
.success,
).toBe(true)
expect(updateUserSchema.safeParse(validUpdateData).success).toBe(true)
expect(
buildUpdateUserSchema(defaultUserSchemaCopy).safeParse(validUpdateData)
.success,
).toBe(true)
})
})