Newer
Older
client_dwatch / app / api / auth / login / __tests__ / route.test.ts
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の形式が不正です");
  });
});