import { describe, expect, it, vi } from "vitest";
import { render, renderHook } from "@testing-library/react";
import { RecordingAnalytics } from "@repo/core-testing";
import {
  AnalyticsContextError,
  AnalyticsProvider,
  useAnalytics,
} from "@/react/index";

function Tracker() {
  const analytics = useAnalytics();
  analytics.track("test.event");
  return null;
}

describe("AnalyticsProvider", () => {
  it("makes analytics available through context and track flows through", () => {
    const recording = new RecordingAnalytics();

    render(
      <AnalyticsProvider value={recording}>
        <Tracker />
      </AnalyticsProvider>,
    );

    expect(recording.tracked).toContainEqual({ event: "test.event" });
  });
});

describe("useAnalytics", () => {
  it("throws AnalyticsContextError when called outside a provider", () => {
    const spy = vi.spyOn(console, "error").mockImplementation(() => {});
    try {
      expect(() => renderHook(() => useAnalytics())).toThrow(
        AnalyticsContextError,
      );
    } finally {
      spy.mockRestore();
    }
  });
});
