test(cleanup): remove legacy admin users references
This commit is contained in:
@@ -26,7 +26,7 @@ import {
|
|||||||
import { localizePersonFieldErrors } from "./person.messages"
|
import { localizePersonFieldErrors } from "./person.messages"
|
||||||
import { localizeUnifiedCreateFieldErrors } from "./user.messages"
|
import { localizeUnifiedCreateFieldErrors } from "./user.messages"
|
||||||
|
|
||||||
const PERSON_USER_PATH = "/admin/users"
|
const PERSON_USER_PATH = "/people"
|
||||||
|
|
||||||
export async function createNewPerson(formData: CreatePersonFormType) {
|
export async function createNewPerson(formData: CreatePersonFormType) {
|
||||||
const { dictionary } = await getI18n()
|
const { dictionary } = await getI18n()
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import {
|
|||||||
|
|
||||||
import { localizeUserFieldErrors } from "./user.messages"
|
import { localizeUserFieldErrors } from "./user.messages"
|
||||||
|
|
||||||
const USERS_PATH = "/admin/users"
|
const USERS_PATH = "/people"
|
||||||
|
|
||||||
export async function createUserAction(formData: CreateUserFormType) {
|
export async function createUserAction(formData: CreateUserFormType) {
|
||||||
const { dictionary } = await getI18n()
|
const { dictionary } = await getI18n()
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ test.describe("main app smoke", () => {
|
|||||||
}) => {
|
}) => {
|
||||||
await setEnglishLocaleCookie(page, baseURL)
|
await setEnglishLocaleCookie(page, baseURL)
|
||||||
|
|
||||||
await page.goto("/admin/users")
|
await page.goto("/people")
|
||||||
|
|
||||||
await expect(page).toHaveURL(/\/login/)
|
await expect(page).toHaveURL(/\/login/)
|
||||||
await expect(page.getByLabel("Username")).toBeVisible()
|
await expect(page.getByLabel("Username")).toBeVisible()
|
||||||
@@ -46,15 +46,15 @@ test.describe("main app smoke", () => {
|
|||||||
).toBeVisible()
|
).toBeVisible()
|
||||||
})
|
})
|
||||||
|
|
||||||
test("admin can open users and inventory pages", async ({
|
test("admin can open people and inventory pages", async ({
|
||||||
baseURL,
|
baseURL,
|
||||||
page,
|
page,
|
||||||
}) => {
|
}) => {
|
||||||
await signInAsAdmin(page, baseURL)
|
await signInAsAdmin(page, baseURL)
|
||||||
|
|
||||||
await page.getByRole("link", { name: "Users" }).click()
|
await page.getByRole("link", { name: "People" }).click()
|
||||||
await expect(page).toHaveURL(/\/admin\/users/)
|
await expect(page).toHaveURL(/\/people/)
|
||||||
await expect(page.getByRole("heading", { name: "Users" })).toBeVisible()
|
await expect(page.getByRole("heading", { name: "People" })).toBeVisible()
|
||||||
await expect(
|
await expect(
|
||||||
page.getByRole("cell", { name: "admin@example.test" }),
|
page.getByRole("cell", { name: "admin@example.test" }),
|
||||||
).toBeVisible()
|
).toBeVisible()
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ test.describe("language switcher", () => {
|
|||||||
await expect(
|
await expect(
|
||||||
page.getByRole("link", { name: /Destinatarios/ }),
|
page.getByRole("link", { name: /Destinatarios/ }),
|
||||||
).toBeVisible()
|
).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 page.getByRole("button", { name: "Añadir" }).click()
|
||||||
await expect(page.getByRole("menuitem", { name: /Importar/ })).toBeVisible()
|
await expect(page.getByRole("menuitem", { name: /Importar/ })).toBeVisible()
|
||||||
@@ -145,7 +145,7 @@ test.describe("language switcher", () => {
|
|||||||
).toBeVisible()
|
).toBeVisible()
|
||||||
await page.keyboard.press("Escape")
|
await page.keyboard.press("Escape")
|
||||||
|
|
||||||
await page.goto("/admin/users")
|
await page.goto("/people")
|
||||||
await expect(page.getByPlaceholder("Buscar...")).toBeVisible()
|
await expect(page.getByPlaceholder("Buscar...")).toBeVisible()
|
||||||
await expect(page.getByRole("searchbox", { name: "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)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@@ -109,7 +109,7 @@ describe("user actions localization", () => {
|
|||||||
success: true,
|
success: true,
|
||||||
message: es.admin.users.actions.createSuccess,
|
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,
|
success: true,
|
||||||
message: es.admin.users.actions.updateSuccess,
|
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,
|
success: true,
|
||||||
message: es.admin.users.actions.toggleStatusSuccess,
|
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,
|
success: true,
|
||||||
message: es.admin.users.actions.resetPasswordSuccess,
|
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")
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@@ -3,7 +3,7 @@ import { describe, expect, it } from "vitest"
|
|||||||
import {
|
import {
|
||||||
formatPersonDepartment,
|
formatPersonDepartment,
|
||||||
formatUserRole,
|
formatUserRole,
|
||||||
} from "@/app/(dashboard)/admin/users/_components/user.copy"
|
} from "@/app/(dashboard)/people/_components/user.copy"
|
||||||
|
|
||||||
describe("user copy helpers", () => {
|
describe("user copy helpers", () => {
|
||||||
const roleCopy = {
|
const roleCopy = {
|
||||||
|
|||||||
@@ -73,8 +73,6 @@ describe("app sidebar (consolidated people management)", () => {
|
|||||||
createElement(AppSidebar, { copy: en.layout.sidebar }),
|
createElement(AppSidebar, { copy: en.layout.sidebar }),
|
||||||
)
|
)
|
||||||
|
|
||||||
// No /admin/users link must exist anywhere
|
|
||||||
expect(html).not.toContain("/admin/users")
|
|
||||||
expect(html).not.toContain(">Users<")
|
expect(html).not.toContain(">Users<")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user