import { ContextKeysManager } from "../..";
import { StorageLevel } from "../../consts";

describe("Context Keys Manager - setKeys", () => {
  it("returns [false] if not saved one key", async () => {
    // setup
    const keys = [
      {
        key: "namespace.key",
        value: "value",
        storageLevel: StorageLevel.default,
      },
    ];

    const contextManager = new ContextKeysManager({});

    const setKey = jest
      .spyOn(contextManager, "setKey")
      .mockResolvedValueOnce(false);

    // run
    const result = await contextManager.setKeys(keys);

    // verify
    const map = new Map();
    map.set(keys[0].key, false);

    expect(result).toEqual(map);

    expect(setKey).toHaveBeenCalledTimes(keys.length);

    expect(setKey.mock.calls).toEqual([
      [
        {
          key: "namespace.key",
          value: "value",
          storageLevel: StorageLevel.default,
        },
      ],
    ]);
  });

  it("returns [false, false] if not saved two keys", async () => {
    // setup
    const keys = [
      {
        key: "namespace.key1",
        value: "value1",
        storageLevel: StorageLevel.default,
      },
      {
        key: "namespace.key2",
        value: "value2",
        storageLevel: StorageLevel.secure,
      },
    ];

    const contextManager = new ContextKeysManager({});

    const setKey = jest
      .spyOn(contextManager, "setKey")
      .mockResolvedValueOnce(false)
      .mockResolvedValueOnce(false);

    // run
    const result = await contextManager.setKeys(keys);

    // verify
    const map = new Map();
    map.set(keys[0].key, false);
    map.set(keys[1].key, false);

    expect(result).toEqual(map);

    expect(setKey).toHaveBeenCalledTimes(keys.length);

    expect(setKey.mock.calls).toEqual([
      [
        {
          key: "namespace.key1",
          value: "value1",
          storageLevel: StorageLevel.default,
        },
      ],
      [
        {
          key: "namespace.key2",
          value: "value2",
          storageLevel: StorageLevel.secure,
        },
      ],
    ]);
  });
});
