import "dotenv/config";
import { describe, it, expect, vi } from "vitest";
import { promises as fs } from "fs";
import path from "path";

const BASE_URL = "http://localhost";

// /api/video 업로드 TDD
// - POST /api/video 로 FormData(file) 를 전송하면 업로드 파일이 uploads 디렉터리에 저장되고
//   id / servedUrl(`/api/video/:id`) 을 반환해야 한다.

// Prisma 엔진이 실제로 로드되지 않도록 PrismaClient 를 목 처리한다.
vi.mock("@prisma/client", () => {
  class PrismaClient {
    project = {
      upsert: async () => ({ id: "project-mock" }),
    };

    asset = {
      create: async () => ({ id: "asset-mock" }),
    };
  }

  return { PrismaClient };
});

describe("/api/video 업로드", () => {
  it("POST /api/video 는 업로드된 비디오 파일을 저장하고 id/servedUrl 을 반환해야 한다", async () => {
    const { POST: handleUpload } = await import("@/app/api/video/route");

    const formData = new FormData();
    const blob = new Blob(["dummy-video"], { type: "video/mp4" });
    // FormData 에서는 File/Blob 모두 허용되므로, Blob 을 그대로 사용한다.
    formData.append("file", blob as any);

    const res = await handleUpload(
      new Request(`${BASE_URL}/api/video`, {
        method: "POST",
        body: formData,
      }),
    );

    expect(res.status).toBe(201);
    const json = (await res.json()) as { id: string; servedUrl?: string | null };
    expect(json.id).toBeTruthy();
    expect(json.servedUrl).toBe(`/api/video/${json.id}`);

    const filePath = path.join(process.cwd(), "uploads", json.id);
    const stat = await fs.stat(filePath);
    expect(stat.isFile()).toBe(true);
  });
});
