import { describe, expect, it } from "vitest";
import { isJobFinished, jobSchema } from "./jobs";

const JOB_ID = "01922b1c-0000-7000-8000-000000000003";

describe("jobSchema", () => {
  it("parse un job en cours avec sa progression", () => {
    const parsed = jobSchema.parse({
      id: JOB_ID,
      type: "import_csv",
      status: "running",
      progress: { batch: 3, rows_read: 1500, counters: { rows_inserted: 1490 } },
      report: null,
      error: null,
      created_at: "2026-08-31T10:00:00Z",
      started_at: "2026-08-31T10:00:01Z",
      finished_at: null,
    });
    expect(parsed.progress?.["rows_read"]).toBe(1500);
    expect(parsed.finished_at).toBeNull();
  });

  it("parse un job en échec", () => {
    const parsed = jobSchema.parse({
      id: JOB_ID,
      type: "import_csv",
      status: "failed",
      progress: null,
      report: null,
      error: "adaptateur inconnu",
      created_at: "2026-08-31T10:00:00Z",
      started_at: "2026-08-31T10:00:01Z",
      finished_at: "2026-08-31T10:00:02Z",
    });
    expect(parsed.error).toBe("adaptateur inconnu");
  });

  it("refuse une réponse sans statut", () => {
    expect(() => jobSchema.parse({ id: JOB_ID, type: "import_csv" })).toThrow();
  });
});

describe("isJobFinished", () => {
  it("arrête le polling sur les statuts terminaux", () => {
    expect(isJobFinished("done")).toBe(true);
    expect(isJobFinished("failed")).toBe(true);
  });

  it("continue tant que le job n'est pas terminé", () => {
    expect(isJobFinished("queued")).toBe(false);
    expect(isJobFinished("running")).toBe(false);
  });
});
