test: align remaining action tests with Drizzle mocks

EOF

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
SimoandCursor committed 2026-08-01 13:17:35 +02:00
1 parent ed9c23c702
commit 096f55b394
4 files changed
+156 -112

No files matched your search

+31 -34
View File
@@ -1,39 +1,38 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
const {
mockFindFirst,
mockUpsert,
mockFindUnique,
mockUpdate,
mockDelete,
mockSendMail,
mockRedirect,
} = vi.hoisted(() => ({
mockFindFirst: vi.fn(),
mockUpsert: vi.fn(),
mockFindUnique: vi.fn(),
mockUpdate: vi.fn(),
mockDelete: vi.fn(),
mockSendMail: vi.fn(),
mockRedirect: vi.fn(),
}));
const { selectLimit, insertOnDup, mockSendMail, mockRedirect } = vi.hoisted(
() => ({
selectLimit: vi.fn(),
insertOnDup: vi.fn().mockResolvedValue({}),
mockSendMail: vi.fn(),
mockRedirect: vi.fn(),
}),
);
vi.mock("next/navigation", () => ({
redirect: (...args: unknown[]) => {
redirect: (...args) => {
mockRedirect(...args);
throw new Error("redirect");
},
}));
vi.mock("@/lib/prisma", () => ({
prisma: {
user: { findFirst: mockFindFirst, update: mockUpdate },
passwordReset: {
upsert: mockUpsert,
findUnique: mockFindUnique,
delete: mockDelete,
},
vi.mock("@/lib/db", () => ({
db: {
select: vi.fn(() => ({
from: vi.fn(() => ({
where: vi.fn(() => ({
limit: selectLimit,
})),
})),
})),
insert: vi.fn(() => ({
values: vi.fn(() => ({
onDuplicateKeyUpdate: insertOnDup,
})),
})),
},
User: { id: "id", mail: "mail" },
PasswordReset: { email: "email", token: "token", createdAt: "createdAt" },
}));
vi.mock("@/lib/services/email", () => ({
@@ -62,22 +61,20 @@ import { requestReset } from "./password-reset";
beforeEach(() => {
vi.clearAllMocks();
insertOnDup.mockResolvedValue({});
});
describe("requestReset", () => {
it("sends a reset email when the user exists", async () => {
mockFindFirst.mockResolvedValue({ id: 1 });
mockUpsert.mockResolvedValue({});
selectLimit.mockResolvedValue([{ id: 1 }]);
const fd = new FormData();
fd.set("email", "[email protected]");
await expect(requestReset(fd)).rejects.toThrow("redirect");
expect(mockFindFirst).toHaveBeenCalledWith(
expect.objectContaining({ where: { mail: "[email protected]" } }),
);
expect(mockUpsert).toHaveBeenCalled();
expect(selectLimit).toHaveBeenCalled();
expect(insertOnDup).toHaveBeenCalled();
expect(mockSendMail).toHaveBeenCalledWith(
"[email protected]",
expect.stringContaining("password reset"),
@@ -86,7 +83,7 @@ describe("requestReset", () => {
});
it("does not send email when user is not found", async () => {
mockFindFirst.mockResolvedValue(null);
selectLimit.mockResolvedValue([]);
const fd = new FormData();
fd.set("email", "[email protected]");
@@ -100,6 +97,6 @@ describe("requestReset", () => {
fd.set("email", "not-an-email");
await expect(requestReset(fd)).rejects.toThrow("redirect");
expect(mockFindFirst).not.toHaveBeenCalled();
expect(selectLimit).not.toHaveBeenCalled();
});
});