test(cleanup): remove legacy admin users references

This commit is contained in:
2026-06-20 16:27:36 +02:00
parent d217edd4e5
commit 0d38626f3a
9 changed files with 14 additions and 168 deletions
+1 -1
View File
@@ -26,7 +26,7 @@ import {
import { localizePersonFieldErrors } from "./person.messages"
import { localizeUnifiedCreateFieldErrors } from "./user.messages"
const PERSON_USER_PATH = "/admin/users"
const PERSON_USER_PATH = "/people"
export async function createNewPerson(formData: CreatePersonFormType) {
const { dictionary } = await getI18n()
+1 -1
View File
@@ -23,7 +23,7 @@ import {
import { localizeUserFieldErrors } from "./user.messages"
const USERS_PATH = "/admin/users"
const USERS_PATH = "/people"
export async function createUserAction(formData: CreateUserFormType) {
const { dictionary } = await getI18n()
+5 -5
View File
@@ -26,7 +26,7 @@ test.describe("main app smoke", () => {
}) => {
await setEnglishLocaleCookie(page, baseURL)
await page.goto("/admin/users")
await page.goto("/people")
await expect(page).toHaveURL(/\/login/)
await expect(page.getByLabel("Username")).toBeVisible()
@@ -46,15 +46,15 @@ test.describe("main app smoke", () => {
).toBeVisible()
})
test("admin can open users and inventory pages", async ({
test("admin can open people and inventory pages", async ({
baseURL,
page,
}) => {
await signInAsAdmin(page, baseURL)
await page.getByRole("link", { name: "Users" }).click()
await expect(page).toHaveURL(/\/admin\/users/)
await expect(page.getByRole("heading", { name: "Users" })).toBeVisible()
await page.getByRole("link", { name: "People" }).click()
await expect(page).toHaveURL(/\/people/)
await expect(page.getByRole("heading", { name: "People" })).toBeVisible()
await expect(
page.getByRole("cell", { name: "admin@example.test" }),
).toBeVisible()
+2 -2
View File
@@ -125,7 +125,7 @@ test.describe("language switcher", () => {
await expect(
page.getByRole("link", { name: /Destinatarios/ }),
).toBeVisible()
await expect(page.getByRole("link", { name: /Usuarios/ })).toBeVisible()
await expect(page.getByRole("link", { name: /Personas/ })).toBeVisible()
await page.getByRole("button", { name: "Añadir" }).click()
await expect(page.getByRole("menuitem", { name: /Importar/ })).toBeVisible()
@@ -145,7 +145,7 @@ test.describe("language switcher", () => {
).toBeVisible()
await page.keyboard.press("Escape")
await page.goto("/admin/users")
await page.goto("/people")
await expect(page.getByPlaceholder("Buscar...")).toBeVisible()
await expect(page.getByRole("searchbox", { name: "Buscar" })).toBeVisible()
@@ -1,61 +0,0 @@
import { afterAll, beforeAll, beforeEach, describe, expect, it } from "vitest"
import type { PrismaClient } from "@/generated/prisma/client"
import { createTestPerson, createTestUser } from "../helpers/factories"
import {
resetIntegrationTestDatabase,
startIntegrationTestDatabase,
stopIntegrationTestDatabase,
} from "../helpers/test-db"
let prisma: PrismaClient
beforeAll(async () => {
await startIntegrationTestDatabase()
const prismaModule = await import("@/lib/prisma")
prisma = prismaModule.prisma
})
beforeEach(async () => {
await resetIntegrationTestDatabase(prisma)
})
afterAll(async () => {
await prisma?.$disconnect()
await stopIntegrationTestDatabase()
})
describe("/admin/users -> /people redirect routes", () => {
it("does not have a /admin/users list page (route is consolidated into /people)", async () => {
const fs = await import("node:fs/promises")
const path = await import("node:path")
// /admin/users/page.tsx must still exist (as a redirect stub) — verify it's just a redirect.
const adminUsersPage = path.join(
process.cwd(),
"src/app/(dashboard)/admin/users/page.tsx",
)
const contents = await fs.readFile(adminUsersPage, "utf-8")
expect(contents).toMatch(/redirect\s*\(\s*["']\/people["']\s*\)/)
})
it("resolves a userId back to its linked personId", async () => {
// Build a Person<->User link to verify the redirect can find the person by userId.
const user = await createTestUser(prisma, {
email: "linked@example.test",
})
const person = await createTestPerson(prisma, {
email: "linked@example.test",
})
await prisma.person.update({
where: { id: person.id },
data: { userId: user.id },
})
const found = await prisma.person.findFirst({
where: { userId: user.id },
select: { id: true },
})
expect(found?.id).toBe(person.id)
})
})
+4 -4
View File
@@ -109,7 +109,7 @@ describe("user actions localization", () => {
success: true,
message: es.admin.users.actions.createSuccess,
})
expect(mocks.revalidatePath).toHaveBeenCalledWith("/admin/users")
expect(mocks.revalidatePath).toHaveBeenCalledWith("/people")
})
})
@@ -181,7 +181,7 @@ describe("user actions localization", () => {
success: true,
message: es.admin.users.actions.updateSuccess,
})
expect(mocks.revalidatePath).toHaveBeenCalledWith("/admin/users")
expect(mocks.revalidatePath).toHaveBeenCalledWith("/people")
})
})
@@ -236,7 +236,7 @@ describe("user actions localization", () => {
success: true,
message: es.admin.users.actions.toggleStatusSuccess,
})
expect(mocks.revalidatePath).toHaveBeenCalledWith("/admin/users")
expect(mocks.revalidatePath).toHaveBeenCalledWith("/people")
})
})
@@ -290,7 +290,7 @@ describe("user actions localization", () => {
success: true,
message: es.admin.users.actions.resetPasswordSuccess,
})
expect(mocks.revalidatePath).toHaveBeenCalledWith("/admin/users")
expect(mocks.revalidatePath).toHaveBeenCalledWith("/people")
})
})
})
@@ -1,91 +0,0 @@
import { beforeEach, describe, expect, it, vi } from "vitest"
import { en } from "@/i18n/dictionaries/en"
import { es } from "@/i18n/dictionaries/es"
const mocks = vi.hoisted(() => ({
getI18n: vi.fn(),
getUsers: vi.fn(),
getUserProfileById: vi.fn(),
findFirst: vi.fn(),
redirect: vi.fn((url: string) => {
throw new Error(`REDIRECT:${url}`)
}),
}))
vi.mock("@/i18n/server", () => ({
getI18n: mocks.getI18n,
}))
vi.mock("@/services/user.service", () => ({
getUsers: mocks.getUsers,
getUserProfileById: mocks.getUserProfileById,
}))
vi.mock("@/lib/prisma", () => ({
prisma: {
person: {
findFirst: mocks.findFirst,
},
},
default: {
person: {
findFirst: mocks.findFirst,
},
},
}))
vi.mock("next/navigation", () => ({
redirect: mocks.redirect,
}))
describe("/admin/users routes redirect to /people", () => {
beforeEach(() => {
vi.clearAllMocks()
mocks.getI18n.mockResolvedValue({ dictionary: en, locale: "en" })
})
it("redirects /admin/users to /people", async () => {
const { default: UsersPage } = await import(
"@/app/(dashboard)/admin/users/page"
)
expect(() => UsersPage()).toThrow("REDIRECT:/people")
expect(mocks.getUsers).not.toHaveBeenCalled()
})
it("redirects /admin/users/[userId]/edit to /people/[personId]/edit when person is found", async () => {
mocks.findFirst.mockResolvedValue({ id: "person-99" })
const { default: EditUserPage } = await import(
"@/app/(dashboard)/admin/users/[userId]/edit/page"
)
await expect(
EditUserPage({ params: Promise.resolve({ userId: "user-1" }) }),
).rejects.toThrow("REDIRECT:/people/person-99/edit")
expect(mocks.getUserProfileById).not.toHaveBeenCalled()
})
it("redirects /admin/users/[userId]/edit to /people when person is not found", async () => {
mocks.findFirst.mockResolvedValue(null)
const { default: EditUserPage } = await import(
"@/app/(dashboard)/admin/users/[userId]/edit/page"
)
await expect(
EditUserPage({ params: Promise.resolve({ userId: "orphan-user" }) }),
).rejects.toThrow("REDIRECT:/people")
})
it("still honors Spanish locale when redirecting (does not require dictionary lookups)", async () => {
mocks.getI18n.mockResolvedValue({ dictionary: es, locale: "es" })
const { default: UsersPage } = await import(
"@/app/(dashboard)/admin/users/page"
)
expect(() => UsersPage()).toThrow("REDIRECT:/people")
})
})
+1 -1
View File
@@ -3,7 +3,7 @@ import { describe, expect, it } from "vitest"
import {
formatPersonDepartment,
formatUserRole,
} from "@/app/(dashboard)/admin/users/_components/user.copy"
} from "@/app/(dashboard)/people/_components/user.copy"
describe("user copy helpers", () => {
const roleCopy = {
@@ -73,8 +73,6 @@ describe("app sidebar (consolidated people management)", () => {
createElement(AppSidebar, { copy: en.layout.sidebar }),
)
// No /admin/users link must exist anywhere
expect(html).not.toContain("/admin/users")
expect(html).not.toContain(">Users<")
})