import { describe, expect, it, vi } from "vitest";

vi.mock("node:fs/promises", () => ({
  mkdir: vi.fn(),
  appendFile: vi.fn(),
  readFile: vi.fn(),
}));

vi.mock("@/lib/email", () => ({
  sendLeadAlert: vi.fn(),
  sendProspectAck: vi.fn(),
  sendCallbackAlert: vi.fn(),
  sendNewsletterNotify: vi.fn(),
  getReceivers: vi.fn(() => []),
  checkSmtp: vi.fn(),
  countRecentMailFailures: vi.fn(),
}));

import { submitLead } from "./actions";

function leadForm(i: number) {
  const fd = new FormData();
  fd.set("name", "Test User");
  fd.set("company", `Company ${i}`);
  fd.set("email", `user${i}@example.com`);
  fd.set("phone", "+919818993537");
  fd.set("phoneCountry", "IN");
  fd.set("industry", "Manufacturing");
  fd.set("consent", "on");
  fd.set("website", "");
  return fd;
}

describe("lead rate limit (5 per minute, shared bucket)", () => {
  it("allows five submissions then blocks the sixth", async () => {
    const prev = { ok: false, message: "" };
    for (let i = 0; i < 5; i++) {
      const s = await submitLead(prev, leadForm(i));
      expect(s.ok).toBe(true);
    }
    const blocked = await submitLead(prev, leadForm(5));
    expect(blocked.ok).toBe(false);
    expect(blocked.message).toMatch(/Too many requests/);
  });
});
