import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
import { isMobileViewport, MOBILE_BREAKPOINT } from "../isMobile";

describe("MOBILE_BREAKPOINT", () => {
  it("é 768", () => {
    expect(MOBILE_BREAKPOINT).toBe(768);
  });
});

describe("isMobileViewport", () => {
  afterEach(() => {
    vi.restoreAllMocks();
  });

  describe("breakpoint padrão (768px)", () => {
    it("retorna true quando width é menor que 768", () => {
      vi.stubGlobal("innerWidth", 375);
      expect(isMobileViewport()).toBe(true);
    });

    it("retorna true na resolução exatamente 767px", () => {
      vi.stubGlobal("innerWidth", 767);
      expect(isMobileViewport()).toBe(true);
    });

    it("retorna false quando width é exatamente 768", () => {
      vi.stubGlobal("innerWidth", 768);
      expect(isMobileViewport()).toBe(false);
    });

    it("retorna false em resolução desktop comum", () => {
      vi.stubGlobal("innerWidth", 1440);
      expect(isMobileViewport()).toBe(false);
    });
  });

  describe("breakpoint customizado", () => {
    it("retorna true quando width é menor que o breakpoint fornecido", () => {
      vi.stubGlobal("innerWidth", 639);
      expect(isMobileViewport(640)).toBe(true);
    });

    it("retorna false quando width é igual ao breakpoint fornecido", () => {
      vi.stubGlobal("innerWidth", 640);
      expect(isMobileViewport(640)).toBe(false);
    });

    it("retorna false quando width é maior que o breakpoint fornecido", () => {
      vi.stubGlobal("innerWidth", 1024);
      expect(isMobileViewport(640)).toBe(false);
    });
  });

  describe("consistência com MOBILE_BREAKPOINT", () => {
    it("isMobileViewport() usa MOBILE_BREAKPOINT como padrão", () => {
      vi.stubGlobal("innerWidth", MOBILE_BREAKPOINT - 1);
      expect(isMobileViewport()).toBe(true);

      vi.stubGlobal("innerWidth", MOBILE_BREAKPOINT);
      expect(isMobileViewport()).toBe(false);
    });
  });
});
