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

describe("Context Keys Manager - getKey", () => {
  it("returns value if found by reference", async () => {
    // setup
    const key = "namespace.key";
    const value = "value";

    const mockedLogger = {
      warn: jest.fn(),
    };

    const mockedSessionStorage = {
      getItem: jest.fn(),
      setItem: jest.fn(),
      removeItem: jest.fn(),
    };

    const mockedLocalStorage = {
      getItem: jest.fn(),
      setItem: jest.fn(),
      removeItem: jest.fn(),
    };

    const mockedSecureStorage = {
      getItem: jest.fn(),
      setItem: jest.fn(),
      removeItem: jest.fn(),
    };

    const contextManager = new ContextKeysManager({
      logger: mockedLogger,
      sessionStorage: mockedSessionStorage,
      localStorage: mockedLocalStorage,
      secureStorage: mockedSecureStorage,
    });

    const getKeyByReference = jest
      .spyOn(contextManager, "getKeyByReference")
      .mockResolvedValueOnce(value);

    // run
    const result = await contextManager.getKey(key);

    // verify
    expect(result).toEqual(value);

    expect(mockedLogger.warn).not.toHaveBeenCalled();

    expect(getKeyByReference).toHaveBeenCalledWith("key", "namespace");

    expect(mockedSessionStorage.getItem).not.toHaveBeenCalled();
    expect(mockedLocalStorage.getItem).not.toHaveBeenCalled();
    expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
  });
});
