import { describe, it, expect, beforeEach } from "vitest";
import { pushFormSubmit } from "./dataLayer";

describe("pushFormSubmit", () => {
  beforeEach(() => {
    // Repart d'un dataLayer vierge avant chaque test.
    delete (window as { dataLayer?: unknown }).dataLayer;
    window.history.pushState({}, "", "/diagnostic");
  });

  it("initialise window.dataLayer si absent (init défensif)", () => {
    expect(window.dataLayer).toBeUndefined();
    pushFormSubmit("form_diagnostic_submit", "diagnostic");
    expect(Array.isArray(window.dataLayer)).toBe(true);
  });

  it("pousse exactement event + form_name + form_location (pathname courant)", () => {
    pushFormSubmit("form_diagnostic_submit", "diagnostic");
    expect(window.dataLayer).toEqual([
      {
        event: "form_diagnostic_submit",
        form_name: "diagnostic",
        form_location: "/diagnostic",
      },
    ]);
  });

  it("ne pousse aucune donnée personnelle (uniquement les 3 clés attendues)", () => {
    window.history.pushState({}, "", "/contact");
    pushFormSubmit("form_contact_submit", "contact");
    const last = window.dataLayer!.at(-1)!;
    expect(Object.keys(last).sort()).toEqual(["event", "form_location", "form_name"]);
  });

  it("ajoute à la file existante sans l'écraser", () => {
    window.dataLayer = [{ event: "gtm.js" }];
    pushFormSubmit("form_guide_submit", "guide");
    expect(window.dataLayer).toHaveLength(2);
    expect(window.dataLayer[0]).toEqual({ event: "gtm.js" });
    expect(window.dataLayer[1]).toMatchObject({ event: "form_guide_submit", form_name: "guide" });
  });

  it("un appel = un seul event (pas de doublon)", () => {
    pushFormSubmit("form_applicateur_submit", "applicateur");
    expect(window.dataLayer).toHaveLength(1);
  });
});
