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

describe("Context Keys Manager - removeKeys", () => {
  it("returns Map with [true] if remove was success 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(true);

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

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

    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 [true, true] if remove was success for two keys", 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(true)
      .mockResolvedValueOnce(true);

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

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

    expect(result).toEqual(map);

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

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