import { describe, it, expect } from "vitest";
import { RecordingAnalytics } from "./recording-analytics";

describe("RecordingAnalytics", () => {
  it("track() pushes to tracked[]", () => {
    const analytics = new RecordingAnalytics();
    analytics.track("button_clicked", { page: "home" });
    expect(analytics.tracked).toHaveLength(1);
    expect(analytics.tracked[0]!.event).toBe("button_clicked");
    expect(analytics.tracked[0]!.attributes).toEqual({ page: "home" });
  });

  it("identify() pushes to identified[]", () => {
    const analytics = new RecordingAnalytics();
    analytics.identify({ id: "user_1" }, { plan: "pro" });
    expect(analytics.identified).toHaveLength(1);
    expect(analytics.identified[0]!.user).toEqual({ id: "user_1" });
    expect(analytics.identified[0]!.attributes).toEqual({ plan: "pro" });
  });

  it("pageView() pushes to pageViewed[]", () => {
    const analytics = new RecordingAnalytics();
    analytics.pageView("/home", { referrer: "google" });
    expect(analytics.pageViewed).toHaveLength(1);
    expect(analytics.pageViewed[0]!.path).toBe("/home");
    expect(analytics.pageViewed[0]!.attributes).toEqual({ referrer: "google" });
  });

  it("flush() drains all arrays and resolves", async () => {
    const analytics = new RecordingAnalytics();
    analytics.track("event_1");
    analytics.identify({ id: "user_1" });
    analytics.pageView("/about");
    await analytics.flush();
    expect(analytics.tracked).toEqual([]);
    expect(analytics.identified).toEqual([]);
    expect(analytics.pageViewed).toEqual([]);
  });

  it("methods accept calls without attributes", () => {
    const analytics = new RecordingAnalytics();
    analytics.track("no_attrs");
    analytics.identify({ id: "user_2" });
    analytics.pageView("/contact");
    expect(analytics.tracked[0]!.attributes).toBeUndefined();
    expect(analytics.identified[0]!.attributes).toBeUndefined();
    expect(analytics.pageViewed[0]!.attributes).toBeUndefined();
  });
});
