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 consoleInfoSpy = jest.spyOn(console, 'info').mockImplementation()
    const calendarURIs = ['/calendars/cal1', '/calendars/cal2']

    unregisterToCalendars(mockSocket, calendarURIs)

    expect(consoleInfoSpy).toHaveBeenCalledWith(
      'Unregistered to calendars',
      calendarURIs
    )

    consoleInfoSpy.mockRestore()
  })
})
