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

const { requirePermissionMock, listActiveSignatairesMock } = vi.hoisted(() => ({
  requirePermissionMock: vi.fn(),
  listActiveSignatairesMock: vi.fn(),
}));

vi.mock("@/lib/authorization", () => ({
  requirePermission: requirePermissionMock,
}));

vi.mock("@/services/impressions.service", () => ({
  listActiveSignataires: listActiveSignatairesMock,
}));

import { GET } from "@/app/api/impressions/signataires/route";

describe("Unit — /api/impressions/signataires", () => {
  beforeEach(() => {
    vi.resetAllMocks();
    requirePermissionMock.mockResolvedValue({ ok: true, access: {} });
  });

  it("requires impressions read permission", async () => {
    const forbidden = Response.json({ message: "Forbidden" }, { status: 403 });
    requirePermissionMock.mockResolvedValue({ ok: false, response: forbidden });

    const response = await GET(
      new Request("http://localhost/api/impressions/signataires"),
    );

    expect(response.status).toBe(403);
    expect(listActiveSignatairesMock).not.toHaveBeenCalled();
  });

  it("returns active signataires", async () => {
    listActiveSignatairesMock.mockResolvedValue([
      { id: 1, prenomnom: "Béatrice LAFRANCE", fonction: "Directrice" },
    ]);

    const response = await GET(
      new Request("http://localhost/api/impressions/signataires"),
    );

    expect(response.status).toBe(200);
    await expect(response.json()).resolves.toMatchObject({
      items: [{ id: 1, prenomnom: "Béatrice LAFRANCE" }],
    });
  });
});
