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

import {
  buildExcelCompatibleCsv,
  csvDownloadResponse,
} from "../../../src/lib/csv";

describe("CSV exports", () => {
  it("builds an Excel-compatible semicolon-separated UTF-8 file", () => {
    const csv = buildExcelCompatibleCsv(
      ["nom", "commentaire", "vide"],
      [
        {
          nom: "DUPONT",
          commentaire: 'Texte; avec "guillemets"',
          vide: null,
        },
      ],
    );

    expect(csv.startsWith("\uFEFF")).toBe(true);
    expect(csv).toContain('"nom";"commentaire";"vide"\r\n');
    expect(csv).toContain('"DUPONT";"Texte; avec ""guillemets""";""');
  });

  it("neutralizes values that Excel could interpret as formulas", () => {
    const csv = buildExcelCompatibleCsv(["valeur"], [
      { valeur: "=HYPERLINK(\"https://example.test\")" },
      { valeur: "+1+1" },
    ]);

    expect(csv).toContain('"\'=HYPERLINK(""https://example.test"")"');
    expect(csv).toContain('"\'+1+1"');
  });

  it("returns download and no-cache headers", async () => {
    const response = csvDownloadResponse("export.csv", ["id"], [{ id: 1 }]);

    expect(response.status).toBe(200);
    expect(response.headers.get("content-type")).toBe(
      "text/csv; charset=utf-8",
    );
    expect(response.headers.get("content-disposition")).toBe(
      'attachment; filename="export.csv"',
    );
    expect(response.headers.get("cache-control")).toBe("no-store");
    expect(await response.text()).toContain('"id"\r\n"1"');
  });
});
