171 lines
5.0 KiB
TypeScript
171 lines
5.0 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 = {
|
|
usernameRequired: "El usuario es obligatorio",
|
|
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 = {
|
|
username: "admin",
|
|
name: "Admin User",
|
|
email: "admin@example.test",
|
|
password: "password1",
|
|
role: "ADMIN" as const,
|
|
isActive: true,
|
|
}
|
|
|
|
const validUpdateData = {
|
|
id: "user-id",
|
|
username: "admin",
|
|
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({
|
|
username: "",
|
|
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.username).toContain("Username is required")
|
|
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({
|
|
username: "",
|
|
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.username).toContain(esCopy.usernameRequired)
|
|
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: "",
|
|
username: "",
|
|
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.username).toContain("Username 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: "",
|
|
username: "",
|
|
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.username).toContain(esCopy.usernameRequired)
|
|
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)
|
|
})
|
|
})
|