import { beforeEach, describe, expect, it, vi } from "vitest"; const createFn = vi.hoisted(() => vi.fn()); const sendMailFn = vi.hoisted(() => vi.fn().mockResolvedValue(true)); vi.mock("@/lib/prisma", () => ({ prisma: { alertLogs: { create: createFn } }, })); vi.mock("@/lib/services/email", () => ({ sendMail: sendMailFn, })); vi.mock("@/env", () => ({ env: { DISCORD_WEBHOOK_URL: "", ALERT_EMAIL: "", HOTEL_NAME: "TestHotel", APP_URL: "http://localhost:3000", NODE_ENV: "test", }, })); import { sendAlert } from "./alert"; beforeEach(() => { createFn.mockReset(); sendMailFn.mockReset(); createFn.mockResolvedValue({ id: 1 }); }); describe("sendAlert", () => { it("persists an alert log entry", async () => { await sendAlert({ type: "test", severity: "warning", message: "test alert", }); expect(createFn).toHaveBeenCalledWith({ data: expect.objectContaining({ type: "test", severity: "warning", message: "test alert", isRead: false, }), }); }); it("returns logged=true when DB write succeeds", async () => { const result = await sendAlert({ type: "test", severity: "info", message: "ok", }); expect(result.logged).toBe(true); }); it("does not call sendMail when ALERT_EMAIL is unset", async () => { await sendAlert({ type: "test", severity: "error", message: "m" }); expect(sendMailFn).not.toHaveBeenCalled(); }); });