import { getTheme, IThemeProps, setScheme, setTheme } from "../../lib/useTheme";

const props: IThemeProps = {
  label: "Classic",
  value: 0,
  mainColor: "#000000",
  accentColor: "#1e272e",
  backgroundColor: "#ffffff",
};

const location: Location = window.location;
const setup = () => {
  Object.defineProperty(window, "localStorage", {
    value: {
      getItem: jest.fn(() => JSON.stringify(props)),
      setItem: jest.fn(() => null),
    },
    writable: true,
  });

  // @ts-ignore
  delete window.location;

  Object.defineProperty(window, "location", {
    configurable: true,
    value: {
      ...window.location,
      reload: jest.fn(),
    },
  });
};

describe("theme.tsx", () => {
  it("Tests setScheme", () => {
    setup();

    let value = "dark";

    setScheme(value);
    expect(window.localStorage.setItem).toHaveBeenCalledTimes(1);
    expect(window.localStorage.setItem).toHaveBeenCalledWith("theme", value);
  });

  it("setTheme light test", () => {
    setup();

    setTheme("light", props);
    expect(window.localStorage.setItem).toHaveBeenCalledTimes(2);
    expect(window.localStorage.setItem).toHaveBeenCalledWith(
      "light-theme",
      JSON.stringify(props),
    );
    expect(window.location.reload).toHaveBeenCalledTimes(1);
  });

  it("setTheme dark test", () => {
    setup();

    setTheme("dark", props);
    expect(window.localStorage.setItem).toHaveBeenCalledTimes(2);
    expect(window.localStorage.setItem).toHaveBeenCalledWith(
      "dark-theme",
      JSON.stringify(props),
    );
    expect(window.location.reload).toHaveBeenCalledTimes(1);
  });

  it("Tests getTheme", () => {
    setup();

    let themeTest = getTheme();
    expect(themeTest).toEqual(props);
  });

  it("Tests getTheme with empty parameters", () => {
    localStorage.setItem("theme", "");
    expect(getTheme()).toEqual({});
  });
});
