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

const checkAdminAuth = vi.fn();
const authCheckPath = vi.hoisted(() => new URL("../../lib/auth-check.ts", import.meta.url).pathname);
vi.mock(authCheckPath, () => ({ checkAdminAuth }));

const putObject = vi.fn().mockResolvedValue(undefined);
const initBucket = vi.fn().mockResolvedValue(undefined);
const getPublicUrl = vi.fn((fileName: string) => `http://localhost/${fileName}`);

vi.mock("@/lib/minio", () => ({
  minioClient: { putObject },
  bucketName: "bucket",
  initBucket,
  getPublicUrl,
}));

describe("Admin upload API", () => {
  beforeEach(async () => {
    await vi.resetModules();
    checkAdminAuth.mockResolvedValue(null);
    putObject.mockClear();
  });

  it("POST /api/admin/upload uploads file", async () => {
    const { POST } = await import("../../app/api/admin/upload/route");

    const file = {
      name: "test.png",
      type: "image/png",
      size: 3,
      arrayBuffer: async () => new Uint8Array([1, 2, 3]).buffer,
    } as File;

    const formData = {
      get: (key: string) => (key === "file" ? file : null),
    } as FormData;

    const request = {
      formData: async () => formData,
    } as Request;

    const res = await POST(request);

    const data = await res.json();
    expect(res.status).toBe(201);
    expect(data.url).toContain("uploads/");
  });
});
