import { api } from '@/utils/apiUtils'
import { fetchWebSocketTicket } from '@/websocket/api/fetchWebSocketTicket'

jest.mock('@/utils/apiUtils')

describe('fetchWebSocketTicket', () => {
  const mockTicket = {
    clientAddress: '127.0.0.1',
    value: 'test-ticket-123',
    generatedOn: '2025-01-12T10:00:00Z',
    validUntil: '2025-01-12T11:00:00Z',
    username: 'testuser'
  }

  beforeEach(() => {
    jest.clearAllMocks()
  })

  it('should fetch ticket successfully', async () => {
    ;(api.post as jest.Mock).mockResolvedValue({
      ok: true,
      json: async () => mockTicket
    })

    const ticket = await fetchWebSocketTicket()

    expect(api.post).toHaveBeenCalledWith('ws/ticket')
    expect(ticket).toEqual(mockTicket)
  })

  it('should throw error when response is not ok', async () => {
    ;(api.post as jest.Mock).mockResolvedValue({
      ok: false
    })

    await expect(fetchWebSocketTicket()).rejects.toThrow(
      'Failed to fetch WebSocket ticket'
    )
  })

  it('should throw error when network fails', async () => {
    ;(api.post as jest.Mock).mockRejectedValue(new Error('Network error'))

    await expect(fetchWebSocketTicket()).rejects.toThrow('Network error')
  })
})
