import { describe, it, expect, vi, beforeEach } from "vitest";
import { proxyToBackend } from "../src/proxy";

describe("proxyToBackend", () => {
  const MOCK_BASE_URL = "http://localhost:3000";
  const MOCK_API_KEY = "test-key";

  beforeEach(() => {
    vi.resetAllMocks();
  });

  it("should make a POST request with correct headers and body", async () => {
    const mockResponse = { success: true, data: "test" };
    globalThis.fetch = vi.fn().mockResolvedValue({
      ok: true,
      json: async () => mockResponse,
    });

    const payload = { test: 123 };
    const result = await proxyToBackend("/api/test", payload, MOCK_BASE_URL, MOCK_API_KEY);

    expect(globalThis.fetch).toHaveBeenCalledTimes(1);
    expect(globalThis.fetch).toHaveBeenCalledWith("http://localhost:3000/api/test", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Authorization: "Bearer test-key",
      },
      body: JSON.stringify(payload),
    });

    expect(result).toEqual(mockResponse);
  });

  it("should throw an error if API_BASE_URL is not provided", async () => {
    await expect(proxyToBackend("/api/test", {}, "", MOCK_API_KEY)).rejects.toThrow(
      "API_BASE_URL is not configured."
    );
  });

  it("should throw an error if response is not ok", async () => {
    globalThis.fetch = vi.fn().mockResolvedValue({
      ok: false,
      status: 500,
      text: async () => "Internal Server Error",
    });

    await expect(
      proxyToBackend("/api/test", {}, MOCK_BASE_URL, MOCK_API_KEY)
    ).rejects.toThrow("Backend error (500): Internal Server Error");
  });
});
