import { ContextKeysManager, REFERENCE_NAMESPACE } from "../..";
import { buildNamespaceKey } from "../../utils";
import { StorageLevel } from "../../consts";

describe("Context Keys Manager - setReferenceForKey", () => {
  it("returns false if save failed", async () => {
    // setup
    const key = "key";
    const namespace = "namespace";
    const storageLevel = StorageLevel.default;
    const error = Error("oops");

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

    const mockedReferenceStorage = {
      getItem: jest.fn(),
      setItem: jest.fn().mockRejectedValueOnce(error),
      removeItem: jest.fn(),
    };

    const contextManager = new ContextKeysManager({
      logger: mockedLogger,
      referenceStorage: mockedReferenceStorage,
    });

    // run
    const result = await contextManager.setReferenceForKey(
      key,
      namespace,
      storageLevel
    );

    // verify
    expect(result).toBe(false);

    expect(mockedLogger.warn).toHaveBeenCalledWith({
      message: error.message,
      data: { key, namespace, storageLevel },
    });

    expect(mockedReferenceStorage.setItem).toHaveBeenCalledWith(
      buildNamespaceKey(key, namespace),
      storageLevel,
      REFERENCE_NAMESPACE
    );
  });

  it("returns false if save success but result is not true", async () => {
    // setup
    const key = "key";
    const namespace = "namespace";
    const storageLevel = StorageLevel.default;

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

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

    const contextManager = new ContextKeysManager({
      logger: mockedLogger,
      referenceStorage: mockedReferenceStorage,
    });

    // run
    const result = await contextManager.setReferenceForKey(
      key,
      namespace,
      storageLevel
    );

    // verify
    expect(result).toBe(false);

    expect(mockedLogger.warn).toHaveBeenCalledWith({
      message:
        "While saving reference - reference storage return non expected value: true",
      data: { key, namespace, storageLevel },
    });

    expect(mockedReferenceStorage.setItem).toHaveBeenCalledWith(
      buildNamespaceKey(key, namespace),
      storageLevel,
      REFERENCE_NAMESPACE
    );
  });
});
