feat(i18n): localize recipients UI

This commit is contained in:
2026-06-14 18:33:57 +02:00
parent ea37fc8d70
commit c0ae7a034a
11 changed files with 665 additions and 34 deletions
@@ -0,0 +1,165 @@
import { createElement } from "react"
import { renderToStaticMarkup } from "react-dom/server"
import { beforeEach, describe, expect, it, vi } from "vitest"
import { es } from "@/i18n/dictionaries/es"
const mocks = vi.hoisted(() => ({
findAllPaginated: vi.fn(),
findById: vi.fn(),
findAllByRecipient: vi.fn(),
getI18n: vi.fn(),
}))
vi.mock("@/i18n/server", () => ({
getI18n: mocks.getI18n,
}))
vi.mock("@/services/recipient.service", () => ({
RecipientService: {
findAllPaginated: mocks.findAllPaginated,
findById: mocks.findById,
},
}))
vi.mock("@/services/assignment.service", () => ({
AssignmentService: {
findAllByRecipient: mocks.findAllByRecipient,
},
}))
vi.mock("@/components/common/pageheader", () => ({
default: ({ title, addLabel }: { title: string; addLabel?: string }) =>
createElement(
"header",
null,
[title, addLabel].filter(Boolean).join(" | "),
),
}))
vi.mock("@/components/common/pagination", () => ({
default: ({ totalPages }: { totalPages: number }) =>
createElement("nav", { "aria-label": "Pagination" }, totalPages),
}))
describe("recipient pages localization", () => {
beforeEach(() => {
vi.clearAllMocks()
mocks.getI18n.mockResolvedValue({ dictionary: es, locale: "es" })
})
it("renders the recipient list in Spanish while keeping stored department values display-only", async () => {
const { default: RecipientsPage } = await import(
"@/app/(dashboard)/recipients/page"
)
mocks.findAllPaginated.mockResolvedValue({
data: [
{
id: "recipient-1",
username: "ada",
firstName: "Ada",
lastName: "Lovelace",
email: "ada@example.test",
phone: "1234",
department: "ENGINEERING",
},
],
totalPages: 1,
})
const html = renderToStaticMarkup(
await RecipientsPage({ searchParams: Promise.resolve({}) }),
)
expect(html).toContain("Destinatarios")
expect(html).toContain("Agregar destinatario")
expect(html).toContain("Usuario")
expect(html).toContain("Nombre")
expect(html).toContain("Correo electrónico")
expect(html).toContain("Teléfono")
expect(html).toContain("Departamento")
expect(html).toContain("Acciones")
expect(html).toContain("Ada Lovelace")
expect(html).toContain("Ingeniería")
expect(html).toContain('aria-label="Ver destinatario"')
expect(html).toContain('aria-label="Editar destinatario"')
expect(html).not.toContain(">ENGINEERING<")
})
it("renders the localized recipient empty state when no recipients exist", async () => {
const { default: RecipientsPage } = await import(
"@/app/(dashboard)/recipients/page"
)
mocks.findAllPaginated.mockResolvedValue({
data: [],
totalPages: 0,
})
const html = renderToStaticMarkup(
await RecipientsPage({ searchParams: Promise.resolve({}) }),
)
expect(html).toContain("No se encontraron destinatarios.")
})
it("renders localized recipient-owned detail labels and keeps assignments copy unchanged", async () => {
const { default: RecipientInfoPage } = await import(
"@/app/(dashboard)/recipients/[recipientId]/page"
)
mocks.findById.mockResolvedValue({
id: "recipient-1",
username: "ada",
firstName: "Ada",
lastName: "Lovelace",
email: "ada@example.test",
phone: "1234",
department: "DRIVER",
})
mocks.findAllByRecipient.mockResolvedValue([
{
id: "assignment-1",
item: { name: "Laptop" },
asset: { serialNumber: "SN-001" },
quantity: 1,
},
])
const html = renderToStaticMarkup(
await RecipientInfoPage({
params: Promise.resolve({ recipientId: "recipient-1" }),
}),
)
expect(html).toContain("Usuario")
expect(html).toContain("Correo electrónico")
expect(html).toContain("Teléfono")
expect(html).toContain("Departamento")
expect(html).toContain("Chofer")
expect(html).toContain("ada")
expect(html).toContain("ada@example.test")
expect(html).toContain("Assignments")
expect(html).toContain("Laptop")
expect(html).not.toContain(">DRIVER<")
expect(html).not.toContain("Asignaciones")
})
it("renders a localized recipient detail not-found message", async () => {
const { default: RecipientInfoPage } = await import(
"@/app/(dashboard)/recipients/[recipientId]/page"
)
mocks.findById.mockResolvedValue(null)
mocks.findAllByRecipient.mockResolvedValue([])
const html = renderToStaticMarkup(
await RecipientInfoPage({
params: Promise.resolve({ recipientId: "missing-recipient" }),
}),
)
expect(html).toContain("Destinatario no encontrado")
})
})