import * as utils from "..";

describe("Context Keys Manager Utils - keyIsValid", () => {
  describe("invalid key", () => {
    it("returns false if it doesn't have a key prop", () => {
      const key = {
        namespace: "namespace",
      };

      expect(utils.keyIsValid(key)).toBe(false);
    });

    it("returns false if it doesn't have an namespace prop", () => {
      const key = {
        key: "key",
      };

      expect(utils.keyIsValid(key)).toBe(false);
    });

    it("returns false if the key prop is empty", () => {
      const key = {
        namespace: "namespace",
        key: "",
      };

      expect(utils.keyIsValid(key)).toBe(false);
    });

    it("returns false if the namespace prop is empty", () => {
      const key = {
        namespace: "",
        key: "key",
      };

      expect(utils.keyIsValid(key)).toBe(false);
    });

    it("returns false if the key prop is undefined", () => {
      const key = {
        namespace: "namespace",
        key: undefined,
      };

      expect(utils.keyIsValid(key)).toBe(false);
    });

    it("returns false if the namespace prop is undefined", () => {
      const key = {
        namespace: undefined,
        key: "key",
      };

      expect(utils.keyIsValid(key)).toBe(false);
    });

    it("returns false if the input is a string", () => {
      const key = "key";

      expect(utils.keyIsValid(key)).toBe(false);
    });

    it("returns false if key is an array", () => {
      const key = ["namespace", "key"];

      expect(utils.keyIsValid(key)).toBe(false);
    });

    it("returns false if key is undefined", () => {
      const key = undefined;

      expect(utils.keyIsValid(key)).toBe(false);
    });

    it("returns false if key is empty object", () => {
      const key = {};

      expect(utils.keyIsValid(key)).toBe(false);
    });
  });

  describe("valid key", () => {
    it("returns true for valid key", () => {
      const key = {
        namespace: "namespace",
        key: "key",
      };

      expect(utils.keyIsValid(key)).toBe(true);
    });
  });
});
