import { ContextKeysManager, NOTHING } from "../../..";
import { DEFAULT_NAMESPACE } from "../../../consts";

describe("Context Keys Manager - getKey", () => {
  it("returns value if not found in session/local storages, but found in secure-storage", async () => {
    // setup
    const key = "key";
    const value = "value";

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

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

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

    const mockedSecureStorage = {
      getItem: jest.fn().mockResolvedValueOnce(value),
      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(NOTHING);

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

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

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

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

    expect(mockedSessionStorage.getItem).toHaveBeenCalledWith(
      "key",
      DEFAULT_NAMESPACE
    );

    expect(mockedLocalStorage.getItem).toHaveBeenCalledWith(
      "key",
      DEFAULT_NAMESPACE
    );

    expect(mockedSecureStorage.getItem).toHaveBeenCalledWith(
      "key",
      DEFAULT_NAMESPACE
    );
  });
});
