import { beforeEach, describe, expect, it, vi } from "vitest";
import { POST } from "./route";

const mocks = vi.hoisted(() => ({
  createExternalSupabaseClient: vi.fn(),
  extractBearerToken: vi.fn(),
}));

vi.mock("@/lib/api-v1/auth", () => ({
  createExternalSupabaseClient: mocks.createExternalSupabaseClient,
  extractBearerToken: mocks.extractBearerToken,
}));

describe("POST /api/v1/auth/logout", () => {
  const setSession = vi.fn();
  const signOut = vi.fn();

  beforeEach(() => {
    vi.clearAllMocks();
    mocks.extractBearerToken.mockReturnValue("token-1");
    mocks.createExternalSupabaseClient.mockReturnValue({
      auth: {
        setSession,
        signOut,
      },
    });
  });

  it("encerra a sessao com access token e refresh token", async () => {
    signOut.mockResolvedValue({ error: null });

    const response = await POST(
      new Request("http://localhost/api/v1/auth/logout", {
        method: "POST",
        body: JSON.stringify({ refresh_token: "refresh-1" }),
      })
    );

    expect(setSession).toHaveBeenCalledWith({
      access_token: "token-1",
      refresh_token: "refresh-1",
    });
    expect(response.status).toBe(200);
    await expect(response.json()).resolves.toMatchObject({
      success: true,
      data: {
        logged_out: true,
      },
    });
  });
});
