const { LiveImageManager } = require("../LiveImageManager");

describe("LiveImageManager", () => {
  it("should subscribe to LiveImageManager events", () => {
    const sampleListener = {
      id: "1",
      listener: {},
    };

    LiveImageManager.instance.addListener(sampleListener);

    expect(LiveImageManager.instance.listeners["1"]).toEqual(
      sampleListener.listener
    );
  });

  it("should unsubscribe from LiveImageManager events with unsubscribe callback", () => {
    const sampleListener = {
      id: "1",
      listener: {},
    };

    const unsubscribe = LiveImageManager.instance.addListener(sampleListener);

    expect(LiveImageManager.instance.listeners["1"]).toEqual(
      sampleListener.listener
    );

    unsubscribe();

    expect(LiveImageManager.instance.listeners["1"]).not.toBeDefined();
  });

  it("should unsubscribe from LiveImageManager events with removeListener", () => {
    const sampleListener = {
      id: "1",
      listener: {},
    };

    LiveImageManager.instance.addListener(sampleListener);

    expect(LiveImageManager.instance.listeners["1"]).toEqual(
      sampleListener.listener
    );

    LiveImageManager.instance.removeListener("1");

    expect(LiveImageManager.instance.listeners["1"]).not.toBeDefined();
  });

  it("should invoke subscription on LiveImageManager events with invokeListenersUpdate", () => {
    const mockOnEnd1 = jest.fn();
    const mockOnEnd2 = jest.fn();

    LiveImageManager.instance.addListener({
      id: "1",
      listener: {
        onEnd: mockOnEnd1,
      },
    });

    LiveImageManager.instance.addListener({
      id: "2",
      listener: {
        onEnd: mockOnEnd2,
      },
    });

    const eventBody = {
      playerId: "000",
    };

    LiveImageManager.instance.invokeListenersUpdate({
      callbackName: "onEnd",
      event: eventBody,
    });

    expect(mockOnEnd1).toHaveBeenCalledWith(eventBody);
    expect(mockOnEnd2).toHaveBeenCalledWith(eventBody);
  });
});
