114 lines
3.3 KiB
TypeScript
114 lines
3.3 KiB
TypeScript
import { describe, expect, it } from "vitest"
|
|
|
|
import {
|
|
buildCreatePersonSchema,
|
|
buildUpdatePersonSchema,
|
|
} from "@/schemas/person.schema"
|
|
|
|
const schemaCopy = {
|
|
firstNameRequired: "El nombre es obligatorio",
|
|
lastNameRequired: "El apellido es obligatorio",
|
|
departmentRequired: "El departamento es obligatorio",
|
|
emailInvalid: "El correo electrónico no es válido",
|
|
idRequired: "El ID es obligatorio",
|
|
userIdInvalid: "El ID de usuario debe ser un UUID válido",
|
|
}
|
|
|
|
describe("person schema validation", () => {
|
|
it("uses localized required-field validation messages for create (no username)", () => {
|
|
const result = buildCreatePersonSchema(schemaCopy).safeParse({
|
|
firstName: "",
|
|
lastName: "",
|
|
department: "",
|
|
})
|
|
|
|
expect(result.success).toBe(false)
|
|
if (!result.success) {
|
|
const errors = result.error.flatten().fieldErrors
|
|
|
|
expect(errors.firstName).toContain(schemaCopy.firstNameRequired)
|
|
expect(errors.lastName).toContain(schemaCopy.lastNameRequired)
|
|
expect(errors.department).toContain(schemaCopy.departmentRequired)
|
|
}
|
|
})
|
|
|
|
it("uses a localized invalid email message for create", () => {
|
|
const result = buildCreatePersonSchema(schemaCopy).safeParse({
|
|
firstName: "Ada",
|
|
lastName: "Lovelace",
|
|
department: "ENGINEERING",
|
|
email: "not-an-email",
|
|
})
|
|
|
|
expect(result.success).toBe(false)
|
|
if (!result.success) {
|
|
expect(result.error.flatten().fieldErrors.email).toContain(
|
|
schemaCopy.emailInvalid,
|
|
)
|
|
}
|
|
})
|
|
|
|
it("uses a localized invalid userId message for create with non-UUID", () => {
|
|
const result = buildCreatePersonSchema(schemaCopy).safeParse({
|
|
firstName: "Ada",
|
|
lastName: "Lovelace",
|
|
department: "ENGINEERING",
|
|
userId: "not-a-uuid",
|
|
})
|
|
|
|
expect(result.success).toBe(false)
|
|
if (!result.success) {
|
|
expect(result.error.flatten().fieldErrors.userId).toContain(
|
|
schemaCopy.userIdInvalid,
|
|
)
|
|
}
|
|
})
|
|
|
|
it("uses localized update identifier validation messages", () => {
|
|
const result = buildUpdatePersonSchema(schemaCopy).safeParse({
|
|
id: "",
|
|
firstName: "Ada",
|
|
lastName: "Lovelace",
|
|
department: "ENGINEERING",
|
|
email: "ada@example.test",
|
|
})
|
|
|
|
expect(result.success).toBe(false)
|
|
if (!result.success) {
|
|
expect(result.error.flatten().fieldErrors.id).toContain(
|
|
schemaCopy.idRequired,
|
|
)
|
|
}
|
|
})
|
|
|
|
it("preserves canonical department values and accepts optional userId UUID", () => {
|
|
const result = buildCreatePersonSchema(schemaCopy).safeParse({
|
|
firstName: "Ada",
|
|
lastName: "Lovelace",
|
|
department: "ENGINEERING",
|
|
email: "",
|
|
userId: "550e8400-e29b-41d4-a716-446655440000",
|
|
})
|
|
|
|
expect(result.success).toBe(true)
|
|
if (result.success) {
|
|
expect(result.data.department).toBe("ENGINEERING")
|
|
expect(result.data.email).toBe("")
|
|
expect(result.data.userId).toBe("550e8400-e29b-41d4-a716-446655440000")
|
|
}
|
|
})
|
|
|
|
it("accepts create without username field (removed from schema)", () => {
|
|
const result = buildCreatePersonSchema(schemaCopy).safeParse({
|
|
firstName: "Ada",
|
|
lastName: "Lovelace",
|
|
department: "ENGINEERING",
|
|
})
|
|
|
|
expect(result.success).toBe(true)
|
|
if (result.success) {
|
|
expect("username" in result.data).toBe(false)
|
|
}
|
|
})
|
|
})
|