feat(people): align people, users, and categories with active inventory records
This commit is contained in:
@@ -14,6 +14,9 @@ let updateUserUseCase: typeof import("@/use-cases/user.use-cases").updateUserUse
|
||||
let setUserActiveUseCase: typeof import("@/use-cases/user.use-cases").setUserActiveUseCase
|
||||
let resetUserPasswordUseCase: typeof import("@/use-cases/user.use-cases").resetUserPasswordUseCase
|
||||
let verifyPassword: typeof import("@/lib/security").verifyPassword
|
||||
let getUserById: typeof import("@/services/user.service").getUserById
|
||||
let getUsers: typeof import("@/services/user.service").getUsers
|
||||
let countActiveAdmins: typeof import("@/services/user.service").countActiveAdmins
|
||||
|
||||
beforeAll(async () => {
|
||||
await startIntegrationTestDatabase()
|
||||
@@ -21,6 +24,7 @@ beforeAll(async () => {
|
||||
const prismaModule = await import("@/lib/prisma")
|
||||
const userUseCases = await import("@/use-cases/user.use-cases")
|
||||
const security = await import("@/lib/security")
|
||||
const userService = await import("@/services/user.service")
|
||||
|
||||
prisma = prismaModule.prisma
|
||||
createUserUseCase = userUseCases.createUserUseCase
|
||||
@@ -28,6 +32,9 @@ beforeAll(async () => {
|
||||
setUserActiveUseCase = userUseCases.setUserActiveUseCase
|
||||
resetUserPasswordUseCase = userUseCases.resetUserPasswordUseCase
|
||||
verifyPassword = security.verifyPassword
|
||||
getUserById = userService.getUserById
|
||||
getUsers = userService.getUsers
|
||||
countActiveAdmins = userService.countActiveAdmins
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
@@ -88,12 +95,34 @@ describe("user use-cases", () => {
|
||||
errors: { email: ["Email already exists"] },
|
||||
})
|
||||
|
||||
await expect(prisma.user.count()).resolves.toBe(1)
|
||||
await expect(
|
||||
prisma.user.findUniqueOrThrow({
|
||||
expect(await prisma.user.count()).toBe(1)
|
||||
expect(
|
||||
await prisma.user.findUniqueOrThrow({
|
||||
where: { emailNormalized: normalizeEmail("existing@example.test") },
|
||||
}),
|
||||
).resolves.toMatchObject({ email: "existing@example.test" })
|
||||
).toMatchObject({ email: "existing@example.test" })
|
||||
})
|
||||
|
||||
it("excludes soft-deleted users from active queries", async () => {
|
||||
const activeUser = await createTestUser(prisma, {
|
||||
email: "active-user@example.test",
|
||||
role: "ADMIN",
|
||||
})
|
||||
const softDeletedUser = await createTestUser(prisma, {
|
||||
email: "deleted-user@example.test",
|
||||
role: "ADMIN",
|
||||
})
|
||||
|
||||
await prisma.user.update({
|
||||
where: { id: softDeletedUser.id },
|
||||
data: { deletedAt: new Date() },
|
||||
})
|
||||
|
||||
const users = await getUsers({ page: 1, pageSize: 10 })
|
||||
expect(users.data).toHaveLength(1)
|
||||
expect(users.data[0].id).toBe(activeUser.id)
|
||||
expect(await getUserById(softDeletedUser.id)).toBeNull()
|
||||
expect(await countActiveAdmins()).toBe(1)
|
||||
})
|
||||
|
||||
it("updates a user while preserving uniqueness constraints", async () => {
|
||||
@@ -118,9 +147,7 @@ describe("user use-cases", () => {
|
||||
}),
|
||||
).resolves.toEqual({ success: true })
|
||||
|
||||
await expect(
|
||||
prisma.user.findUniqueOrThrow({ where: { id: user.id } }),
|
||||
).resolves.toMatchObject({
|
||||
expect(await prisma.user.findUniqueOrThrow({ where: { id: user.id } })).toMatchObject({
|
||||
name: "Edited User",
|
||||
email: "edited@example.test",
|
||||
role: "MANAGER",
|
||||
@@ -141,9 +168,7 @@ describe("user use-cases", () => {
|
||||
errors: { email: ["Email already exists"] },
|
||||
})
|
||||
|
||||
await expect(
|
||||
prisma.user.findUniqueOrThrow({ where: { id: user.id } }),
|
||||
).resolves.toMatchObject({
|
||||
expect(await prisma.user.findUniqueOrThrow({ where: { id: user.id } })).toMatchObject({
|
||||
email: "edited@example.test",
|
||||
})
|
||||
})
|
||||
@@ -165,9 +190,10 @@ describe("user use-cases", () => {
|
||||
errors: { id: ["You cannot remove your own administrator access"] },
|
||||
})
|
||||
|
||||
await expect(
|
||||
prisma.user.findUniqueOrThrow({ where: { id: admin.id } }),
|
||||
).resolves.toMatchObject({ role: "ADMIN", status: "ACTIVE" })
|
||||
expect(await prisma.user.findUniqueOrThrow({ where: { id: admin.id } })).toMatchObject({
|
||||
role: "ADMIN",
|
||||
status: "ACTIVE",
|
||||
})
|
||||
})
|
||||
|
||||
it("protects the last active administrator but allows deactivation when another active admin exists", async () => {
|
||||
@@ -206,9 +232,9 @@ describe("user use-cases", () => {
|
||||
}),
|
||||
).resolves.toEqual({ success: true })
|
||||
|
||||
await expect(
|
||||
prisma.user.findUniqueOrThrow({ where: { id: firstAdmin.id } }),
|
||||
).resolves.toMatchObject({ status: "DISABLED" })
|
||||
expect(await prisma.user.findUniqueOrThrow({ where: { id: firstAdmin.id } })).toMatchObject({
|
||||
status: "DISABLED",
|
||||
})
|
||||
})
|
||||
|
||||
it("prevents self-deactivation", async () => {
|
||||
@@ -226,9 +252,9 @@ describe("user use-cases", () => {
|
||||
errors: { id: ["You cannot deactivate your own user"] },
|
||||
})
|
||||
|
||||
await expect(
|
||||
prisma.user.findUniqueOrThrow({ where: { id: admin.id } }),
|
||||
).resolves.toMatchObject({ status: "ACTIVE" })
|
||||
expect(await prisma.user.findUniqueOrThrow({ where: { id: admin.id } })).toMatchObject({
|
||||
status: "ACTIVE",
|
||||
})
|
||||
})
|
||||
|
||||
it("resets a user password and rejects missing users", async () => {
|
||||
|
||||
Reference in New Issue
Block a user