refactor: consolidate admin/users management under /people

This commit is contained in:
2026-06-17 09:32:26 +02:00
parent 4f370eee70
commit d6b42d78e7
31 changed files with 1928 additions and 855 deletions
@@ -0,0 +1,91 @@
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")
})
})