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

describe("Context Keys Manager - removeKeys", () => {
  it("returns Map with [false] if remove was failed for one key", async () => {
    // setup
    const keys = ["namespace.key"];

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

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

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

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

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

    expect(result).toEqual(map);

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

    expect(removeKey).toHaveBeenCalledTimes(keys.length);
    expect(removeKey.mock.calls).toEqual([[keys[0]]]);
  });

  it("returns Map with [false, false] if remove was failed for one key", async () => {
    // setup
    const keys = ["namespace.key1", "namespace.key2"];

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

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

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

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

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

    expect(result).toEqual(map);

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

    expect(removeKey).toHaveBeenCalledTimes(keys.length);
    expect(removeKey.mock.calls).toEqual([[keys[0]], [keys[1]]]);
  });
});
