feat(i18n): localize admin users backbone
This commit is contained in:
@@ -0,0 +1,200 @@
|
||||
import { describe, expect, it } from "vitest"
|
||||
|
||||
import { dictionaries, getDictionary } from "@/i18n/dictionaries"
|
||||
|
||||
describe("admin users dictionary", () => {
|
||||
it("provides localized admin users copy for English", () => {
|
||||
const users = getDictionary("en").admin.users
|
||||
|
||||
expect(users.list).toEqual({
|
||||
title: "Users",
|
||||
empty: "No users found.",
|
||||
columns: {
|
||||
name: "Name",
|
||||
username: "Username",
|
||||
email: "Email",
|
||||
role: "Role",
|
||||
status: "Status",
|
||||
actions: "Actions",
|
||||
},
|
||||
actions: {
|
||||
edit: "Edit user",
|
||||
},
|
||||
})
|
||||
|
||||
expect(users.new).toEqual({ title: "New User" })
|
||||
expect(users.edit).toEqual({ title: "Edit User" })
|
||||
|
||||
expect(users.form).toEqual({
|
||||
nameLabel: "Name",
|
||||
namePlaceholder: "Full name",
|
||||
usernameLabel: "Username",
|
||||
usernamePlaceholder: "Username",
|
||||
emailLabel: "Email",
|
||||
emailPlaceholder: "user@example.com",
|
||||
passwordLabel: "Password",
|
||||
passwordPlaceholder: "Minimum 8 characters",
|
||||
roleLabel: "Role",
|
||||
activeLabel: "Active user",
|
||||
createSubmit: "Create User",
|
||||
updateSubmit: "Update User",
|
||||
})
|
||||
|
||||
expect(users.resetPassword).toEqual({
|
||||
title: "Reset password",
|
||||
passwordLabel: "New password",
|
||||
passwordPlaceholder: "Minimum 8 characters",
|
||||
submit: "Reset Password",
|
||||
})
|
||||
|
||||
expect(users.roles).toEqual({
|
||||
ADMIN: "Admin",
|
||||
MANAGER: "Manager",
|
||||
STAFF: "Staff",
|
||||
VIEWER: "Viewer",
|
||||
})
|
||||
|
||||
expect(users.status).toEqual({
|
||||
active: "Active",
|
||||
inactive: "Inactive",
|
||||
})
|
||||
|
||||
expect(users.actions).toEqual({
|
||||
createSuccess: "User created successfully",
|
||||
createFailure: "Failed to create user",
|
||||
updateSuccess: "User updated successfully",
|
||||
updateFailure: "Failed to update user",
|
||||
toggleStatusSuccess: "User status updated successfully",
|
||||
toggleStatusFailure: "Failed to update user status",
|
||||
resetPasswordSuccess: "Password reset successfully",
|
||||
resetPasswordFailure: "Failed to reset password",
|
||||
duplicateUsername: "Username already exists",
|
||||
duplicateEmail: "Email already exists",
|
||||
notFound: "User not found",
|
||||
lastActiveAdmin:
|
||||
"Cannot remove access from the last active administrator",
|
||||
selfAdminAccess: "You cannot remove your own administrator access",
|
||||
selfDeactivate: "You cannot deactivate your own user",
|
||||
})
|
||||
|
||||
expect(users.schema).toEqual({
|
||||
usernameRequired: "Username is required",
|
||||
nameRequired: "Name is required",
|
||||
emailInvalid: "Invalid email",
|
||||
passwordMinLength: "Password must be at least 8 characters",
|
||||
userIdRequired: "User id is required",
|
||||
})
|
||||
|
||||
expect(users.fallback).toEqual({
|
||||
unknownRole: "Unknown role",
|
||||
})
|
||||
})
|
||||
|
||||
it("provides localized admin users copy for Spanish", () => {
|
||||
const users = getDictionary("es").admin.users
|
||||
|
||||
expect(users.list).toEqual({
|
||||
title: "Usuarios",
|
||||
empty: "No se encontraron usuarios.",
|
||||
columns: {
|
||||
name: "Nombre",
|
||||
username: "Usuario",
|
||||
email: "Correo electrónico",
|
||||
role: "Rol",
|
||||
status: "Estado",
|
||||
actions: "Acciones",
|
||||
},
|
||||
actions: {
|
||||
edit: "Editar usuario",
|
||||
},
|
||||
})
|
||||
|
||||
expect(users.new).toEqual({ title: "Nuevo usuario" })
|
||||
expect(users.edit).toEqual({ title: "Editar usuario" })
|
||||
|
||||
expect(users.form).toEqual({
|
||||
nameLabel: "Nombre",
|
||||
namePlaceholder: "Nombre completo",
|
||||
usernameLabel: "Usuario",
|
||||
usernamePlaceholder: "Usuario",
|
||||
emailLabel: "Correo electrónico",
|
||||
emailPlaceholder: "usuario@ejemplo.com",
|
||||
passwordLabel: "Contraseña",
|
||||
passwordPlaceholder: "Mínimo 8 caracteres",
|
||||
roleLabel: "Rol",
|
||||
activeLabel: "Usuario activo",
|
||||
createSubmit: "Crear usuario",
|
||||
updateSubmit: "Actualizar usuario",
|
||||
})
|
||||
|
||||
expect(users.resetPassword).toEqual({
|
||||
title: "Restablecer contraseña",
|
||||
passwordLabel: "Nueva contraseña",
|
||||
passwordPlaceholder: "Mínimo 8 caracteres",
|
||||
submit: "Restablecer contraseña",
|
||||
})
|
||||
|
||||
expect(users.roles).toEqual({
|
||||
ADMIN: "Administrador",
|
||||
MANAGER: "Gerente",
|
||||
STAFF: "Personal",
|
||||
VIEWER: "Visor",
|
||||
})
|
||||
|
||||
expect(users.status).toEqual({
|
||||
active: "Activo",
|
||||
inactive: "Inactivo",
|
||||
})
|
||||
|
||||
expect(users.actions).toEqual({
|
||||
createSuccess: "Usuario creado correctamente",
|
||||
createFailure: "Error al crear el usuario",
|
||||
updateSuccess: "Usuario actualizado correctamente",
|
||||
updateFailure: "Error al actualizar el usuario",
|
||||
toggleStatusSuccess: "Estado del usuario actualizado correctamente",
|
||||
toggleStatusFailure: "Error al actualizar el estado del usuario",
|
||||
resetPasswordSuccess: "Contraseña restablecida correctamente",
|
||||
resetPasswordFailure: "Error al restablecer la contraseña",
|
||||
duplicateUsername: "El nombre de usuario ya existe",
|
||||
duplicateEmail: "El correo electrónico ya existe",
|
||||
notFound: "Usuario no encontrado",
|
||||
lastActiveAdmin:
|
||||
"No se puede eliminar el acceso del último administrador activo",
|
||||
selfAdminAccess: "No puedes eliminar tu propio acceso de administrador",
|
||||
selfDeactivate: "No puedes desactivar tu propio usuario",
|
||||
})
|
||||
|
||||
expect(users.schema).toEqual({
|
||||
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",
|
||||
})
|
||||
|
||||
expect(users.fallback).toEqual({
|
||||
unknownRole: "Rol desconocido",
|
||||
})
|
||||
})
|
||||
|
||||
it("maintains structural parity between English and Spanish admin.users", () => {
|
||||
const enKeys = extractKeyPaths(dictionaries.en.admin.users)
|
||||
const esKeys = extractKeyPaths(dictionaries.es.admin.users)
|
||||
|
||||
expect(esKeys).toEqual(enKeys)
|
||||
})
|
||||
})
|
||||
|
||||
function extractKeyPaths(value: unknown, prefix = ""): string[] {
|
||||
if (!isPlainObject(value)) return [prefix]
|
||||
|
||||
return Object.keys(value)
|
||||
.sort()
|
||||
.flatMap((key) =>
|
||||
extractKeyPaths(value[key], prefix ? `${prefix}.${key}` : key),
|
||||
)
|
||||
}
|
||||
|
||||
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
||||
return typeof value === "object" && value !== null && !Array.isArray(value)
|
||||
}
|
||||
Reference in New Issue
Block a user