import PubSub from "../../js/lib/pub_sub";

describe("PubSub", () => {
  test("subscribed callback is called on the specified topic", () => {
    const pubsub = new PubSub();
    const callback1 = jest.fn();
    const callback2 = jest.fn();

    pubsub.subscribe("topic1", callback1);
    pubsub.subscribe("topic2", callback2);
    pubsub.broadcast("topic1", { data: 1 });

    expect(callback1).toHaveBeenCalledWith({ data: 1 });
    expect(callback2).not.toHaveBeenCalled();
  });

  test("subscribe returns a function that unsubscribes", () => {
    const pubsub = new PubSub();
    const callback1 = jest.fn();

    const unsubscribe = pubsub.subscribe("topic1", callback1);
    unsubscribe();
    pubsub.broadcast("topic1", {});

    expect(callback1).not.toHaveBeenCalled();
  });

  test("unsubscribed callback is not called on the specified topic", () => {
    const pubsub = new PubSub();
    const callback1 = jest.fn();

    pubsub.subscribe("topic1", callback1);
    pubsub.unsubscribe("topic1", callback1);
    pubsub.broadcast("topic1", {});

    expect(callback1).not.toHaveBeenCalled();
  });
});
