feat(i18n): localize category action messages

This commit is contained in:
2026-06-12 23:21:08 +02:00
parent e9a07eb28e
commit 9f7d1b8ef8
11 changed files with 222 additions and 32 deletions
@@ -0,0 +1,45 @@
import { describe, expect, it } from "vitest"
import { localizeCategoryFieldErrors } from "@/actions/category.messages"
const actionCopy = {
createSuccess: "Categoría creada correctamente",
createFailure: "Error al crear la categoría",
updateSuccess: "Categoría actualizada correctamente",
updateFailure: "Error al actualizar la categoría",
deleteSuccess: "Categoría eliminada correctamente",
deleteFailure: "Error al eliminar la categoría",
duplicateName: "La categoría ya existe",
unchangedName: "El nombre de la categoría no cambió",
notFound: "Categoría no encontrada",
hasItems: "No se puede eliminar una categoría con artículos",
}
describe("category action message localization", () => {
it("localizes known category field errors", () => {
expect(
localizeCategoryFieldErrors(
{
name: [
"Category already exists",
"Category name is the same as the old one",
],
id: ["Category not found", "Category has items"],
},
actionCopy,
),
).toEqual({
name: [actionCopy.duplicateName, actionCopy.unchangedName],
id: [actionCopy.notFound, actionCopy.hasItems],
})
})
it("keeps unknown messages unchanged", () => {
expect(
localizeCategoryFieldErrors(
{ name: ["Unexpected category issue"] },
actionCopy,
),
).toEqual({ name: ["Unexpected category issue"] })
})
})
@@ -0,0 +1,38 @@
import { describe, expect, it } from "vitest"
import {
buildCreateCategorySchema,
buildUpdateCategorySchema,
} from "@/schemas/category.schema"
const schemaCopy = {
nameRequired: "El nombre es obligatorio y debe tener al menos 3 caracteres",
idRequired: "El ID es obligatorio",
}
describe("category schema localization", () => {
it("uses localized create validation messages", () => {
const result = buildCreateCategorySchema(schemaCopy).safeParse({ name: "" })
expect(result.success).toBe(false)
if (!result.success) {
expect(result.error.flatten().fieldErrors.name).toContain(
schemaCopy.nameRequired,
)
}
})
it("uses localized update identifier validation messages", () => {
const result = buildUpdateCategorySchema(schemaCopy).safeParse({
id: "",
name: "Hardware",
})
expect(result.success).toBe(false)
if (!result.success) {
expect(result.error.flatten().fieldErrors.id).toContain(
schemaCopy.idRequired,
)
}
})
})