import { unregisterToCalendars } from "@/websocket/operations/unregisterToCalendars";

describe("unregisterToCalendars", () => {
  let mockSocket: any;

  beforeEach(() => {
    mockSocket = {
      readyState: WebSocket.OPEN,
      send: jest.fn(),
    };
    jest.clearAllMocks();
  });

  it("should send unregistration message with calendar URIs", () => {
    const calendarURIs = ["/calendars/cal1", "/calendars/cal2"];

    unregisterToCalendars(mockSocket, calendarURIs);

    expect(mockSocket.send).toHaveBeenCalledWith(
      JSON.stringify({
        unregister: calendarURIs,
      })
    );
  });

  it("should throw error if socket is not open", () => {
    mockSocket.readyState = WebSocket.CONNECTING;
    const calendarURIs = ["/calendars/cal1"];

    expect(() => unregisterToCalendars(mockSocket, calendarURIs)).toThrow(
      "Cannot unregister: WebSocket is not open"
    );
  });

  it("should handle empty calendar list", () => {
    unregisterToCalendars(mockSocket, []);

    expect(mockSocket.send).toHaveBeenCalledWith(
      JSON.stringify({
        unregister: [],
      })
    );
  });

  it("should log unregistration", () => {
    const consoleLogSpy = jest.spyOn(console, "log").mockImplementation();
    const calendarURIs = ["/calendars/cal1", "/calendars/cal2"];

    unregisterToCalendars(mockSocket, calendarURIs);

    expect(consoleLogSpy).toHaveBeenCalledWith(
      "Unregistered to calendars",
      calendarURIs
    );

    consoleLogSpy.mockRestore();
  });
});
