import { render, renderHook } from '@testing-library/react'
import { describe, expect, it } from 'vitest'
import type { ReactNode } from 'react'
import { OrdersProvider, useOrdersContext } from './OrdersProvider.js'
import { isOrdersProviderError } from './errors.js'
import type { OrdersClient } from './client.js'

const client: OrdersClient = {
  getOrderById: async () => null,
  listOrders: async () => ({ items: [], nextCursor: null }),
}

describe('OrdersProvider', () => {
  it('provides the injected client to a consumer hook', () => {
    const wrapper = ({ children }: { children: ReactNode }) => (
      <OrdersProvider client={client}>{children}</OrdersProvider>
    )
    const { result } = renderHook(() => useOrdersContext('test'), { wrapper })
    expect(result.current.client).toBe(client)
  })

  it('throws OrdersProviderError when a hook is used outside the provider', () => {
    expect(isOrdersProviderError((() => { try { renderHook(() => useOrdersContext('useOrder')) } catch (e) { return e } })())).toBe(true)
  })

  it('renders children', () => {
    const { getByText } = render(<OrdersProvider client={client}><span>ok</span></OrdersProvider>)
    expect(getByText('ok')).toBeTruthy()
  })
})
