Newer
Older
client_dwatch / lib / clean-logs / __tests__ / result-pending.test.ts
import { describe, expect, it } from "vitest";
import { isResultPending } from "@/lib/clean-logs/result-pending";
import { RESULT_WAIT_MINUTES } from "@/lib/config";

/**
 * ★結果待ち(D-173。ユーザー判断 2026-10-07)の期待値表★ — 表1(予定 02:00〜03:00、W=120)。
 * ★表は正。変えないこと★。
 */
const at = (hm: string) => new Date(`2026-10-07T${hm}:00+09:00`);
const START = at("02:00");
const END = at("03:00");

describe("isResultPending(表1。予定 02:00〜03:00、W=120)", () => {
  it.each([
    // [#, now, hasReport, endAt, 期待]
    ["P1", "04:00", true, END, false], // レポートあり
    ["P2", "01:59", false, END, false], // 未来の予定は対象外
    ["P3", "02:00", false, END, true], // 開始ちょうど(start > now ではない)
    ["P4", "02:30", false, END, true], // 清掃中
    ["P5", "04:59", false, END, true],
    ["P6", "05:00", false, END, false], // 終了+120分ちょうどで確定(now < end+W の境界)
    ["P7", "05:01", false, END, false],
    ["P8", "02:30", false, null, true], // endAt が null → start+120 で判定
    ["P9", "04:30", false, null, false], // 02:00+120=04:00 を過ぎた
  ] as const)("%s: now=%s report=%s", (_id, now, hasReport, endAt, expected) => {
    expect(
      isResultPending({ startAt: START, endAt, now: at(now), hasReport, waitMinutes: 120 }),
    ).toBe(expected);
  });

  it("waitMinutes 省略時は RESULT_WAIT_MINUTES(一旦120分)を使う", () => {
    expect(RESULT_WAIT_MINUTES).toBe(120);
    expect(isResultPending({ startAt: START, endAt: END, now: at("04:59"), hasReport: false })).toBe(true);
    expect(isResultPending({ startAt: START, endAt: END, now: at("05:00"), hasReport: false })).toBe(false);
  });

  it("waitMinutes を変えると境界も動く(設定で変えられる)", () => {
    expect(
      isResultPending({ startAt: START, endAt: END, now: at("03:29"), hasReport: false, waitMinutes: 30 }),
    ).toBe(true);
    expect(
      isResultPending({ startAt: START, endAt: END, now: at("03:30"), hasReport: false, waitMinutes: 30 }),
    ).toBe(false);
  });
});