Newer
Older
client_dwatch / lib / db / __tests__ / error-report-visibility.test.ts
/**
 * `isVisibleErrorRow()` / `ERROR_ROW_VISIBLE_WHERE` の期待値表(指示書AX 表5 の可視性の列。U8・D12)
 *
 * ★表5 は指示書AX で U8 から導き、監督が確認したもの(§11 Q9。2026-10-19)★
 *
 * | 施設の deleted_at | 清掃エリアの deleted_at | 見えるか | 表5 |
 * |---|---|---|---|
 * | NULL | NULL | 見える | V1・V4・V9 |
 * | 過去の日時 | NULL | 見えない | V2・V5 |
 * | NULL | 過去の日時 | 見えない | V3・V6 |
 * | 過去の日時 | 過去の日時 | 見えない | V7 |
 * | ★未来の日時★ | NULL | ★見えない★(NULL か否かだけで決める。D12) | — |
 *
 * ★日時は `+09:00` 付きの ISO 文字列から `toDbJst(new Date(...))` で DB の壁時計値を作る★
 */
import { describe, expect, it } from "vitest";
import { ERROR_ROW_VISIBLE_WHERE, isVisibleErrorRow } from "@/lib/db/error-report-mapping";
import { toDbJst } from "@/lib/format/date";

const DELETED = toDbJst(new Date("2026-10-01T10:00:00+09:00"));
const FUTURE = toDbJst(new Date("2099-01-01T00:00:00+09:00"));

describe("isVisibleErrorRow(表5。指示書AX U8・D12)", () => {
  it.each([
    ["V1・V4・V9: 施設・清掃エリアとも生きている", null, null, true],
    ["V2・V5: 施設だけ削除済み", DELETED, null, false],
    ["V3・V6: 清掃エリアだけ削除済み", null, DELETED, false],
    ["V7: 施設・清掃エリアとも削除済み", DELETED, DELETED, false],
    ["★未来の日時でも削除済み(NULL か否かだけ)★", FUTURE, null, false],
  ] as const)("%s → %s", (_label, facilityDeleted, sectionDeleted, expected) => {
    expect(
      isVisibleErrorRow({
        facility: { deleted_at: facilityDeleted },
        section: { deleted_at: sectionDeleted },
      })
    ).toBe(expected);
  });
});

describe("ERROR_ROW_VISIBLE_WHERE(SQL 側の写し)", () => {
  it("施設・清掃エリアの deleted_at が NULL", () => {
    expect(ERROR_ROW_VISIBLE_WHERE).toEqual({
      facility: { deleted_at: null },
      section: { deleted_at: null },
    });
  });
});