const { targetShouldOpenExternally } = require("../utils");

const mockedOpenUrl = jest.fn();

jest.mock("react-native", () => {
  const RN = jest.requireActual("react-native");

  RN.Linking = {
    openUrl: mockedOpenUrl,
  };

  return RN;
});

const riversWithoutWebview = {
  river2: {
    type: "general_content",
  },
};

const riversWithWebview = {
  ...riversWithoutWebview,
  river2: {
    type: "webview_screen_qb",
  },
};

const targetScreen = {
  screenType: "cotent_screen",
};

const targetScreenLink = {
  screenType: "link",
};

describe("targetShouldOpenExternally", () => {
  describe("when entry has the external_url type", () => {
    it("returns true", () => {
      const entry = {
        type: { value: "external_url" },
        link: { href: "https://www.google.com" },
      };

      expect(targetShouldOpenExternally(entry)).toBe(true);
    });
  });

  describe("when entry has a url with open_external_url flag", () => {
    it("returns true", () => {
      const entry = {
        link: { href: "https://www.google.com?open_external_url=true" },
      };

      expect(targetShouldOpenExternally(entry)).toBe(true);
    });
  });

  describe("when entry has open_external_url flag in extensions", () => {
    it("returns true when extension is boolean true", () => {
      const entry = {
        link: { href: "https://www.google.com" },
        extensions: { open_external_url: true },
      };

      expect(targetShouldOpenExternally(entry)).toBe(true);
    });

    it("returns true when extension is the string true", () => {
      const entry = {
        link: { href: "https://www.google.com" },
        extensions: { open_external_url: "true" },
      };

      expect(targetShouldOpenExternally(entry)).toBe(true);
    });
  });

  describe("when screen type is link", () => {
    it("returns true when no webview is present in rivers", () => {
      const entry = { type: { value: "internal_link" } };

      expect(
        targetShouldOpenExternally(
          entry,
          targetScreenLink,
          riversWithoutWebview
        )
      ).toBe(true);
    });
  });

  describe("otherwise", () => {
    it("returns false", () => {
      const entry1 = { type: { value: "internal_link" } };

      expect(
        targetShouldOpenExternally(entry1, targetScreenLink, riversWithWebview)
      ).toBe(false);

      const entry2 = {
        type: { value: "internal_link" },
        link: { href: "https://www.google.com" },
      };

      expect(
        targetShouldOpenExternally(entry2, targetScreenLink, riversWithWebview)
      ).toBe(false);

      expect(
        targetShouldOpenExternally(entry2, targetScreen, riversWithWebview)
      ).toBe(false);

      expect(
        targetShouldOpenExternally(entry2, targetScreen, riversWithoutWebview)
      ).toBe(false);
    });
  });
});
