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

// ★★ルート本体は**静的 import** すること★★（`app/api/clean-logs/__tests__/route.test.ts` の冒頭コメントと同じ理由）
import { POST } from "@/app/api/auth/login/route";

/**
 * `POST /auth/login` — 本文がオブジェクトでない（指示書BB 表8 J1〜J3。A5・D19・D-182）。
 *
 * | # | 本文 | 期待 |
 * |---|---|---|
 * | J1 | `null` | 422・validation_failed・「JSONの形式が不正です」（旧: TypeError で標準でない500） |
 * | J2 | `[]` / `1` / `"x"` | 422（J1 と同じ。★数値・文字列のときの文言が「tokenを指定してください」から変わる — 承知のうえ★） |
 * | J3 | `{}` | 今どおり（422「tokenを指定してください」） |
 *
 * ★トークンの照合まで行かない入力だけを使う★（認証情報をテストに書かない）
 */

function postRaw(raw: string): Promise<Response> {
  return POST(new Request("http://localhost/api/auth/login", { method: "POST", body: raw }));
}

describe("POST /auth/login — 本文の形", () => {
  it.each(["null", "[]", "1", '"x"'])("★J1・J2: 本文 %s → 422「JSONの形式が不正です」★", async (raw) => {
    const res = await postRaw(raw);
    expect(res.status).toBe(422);
    expect(await res.json()).toEqual({
      error: { code: "validation_failed", message: "JSONの形式が不正です", details: null },
    });
  });

  it("J3: 本文 {} → 今どおり（422「tokenを指定してください」）", async () => {
    const res = await postRaw("{}");
    expect(res.status).toBe(422);
    expect(((await res.json()) as { error: { message: string } }).error.message).toBe("tokenを指定してください");
  });

  it("JSON として読めない本文は今どおり 422「JSONの形式が不正です」", async () => {
    const res = await postRaw("{");
    expect(res.status).toBe(422);
    expect(((await res.json()) as { error: { message: string } }).error.message).toBe("JSONの形式が不正です");
  });
});
