// packages/commerce-catalog-react/src/CatalogProvider.test.tsx
import { renderHook } from '@testing-library/react'
import type { ReactNode } from 'react'
import { describe, expect, it } from 'vitest'
import { CatalogProvider, useCatalogContext } from './CatalogProvider.js'
import { isCatalogProviderError } from './errors.js'
import type { CatalogClient } from './client.js'

const mockClient: CatalogClient = {
  getProductBySlug: async () => null,
  getProductById: async () => null,
  listProducts: async () => ({ items: [], total: 0, page: 1, pageSize: 20 }),
}

describe('CatalogProvider / useCatalogContext', () => {
  it('throws CatalogProviderError when used outside a provider', () => {
    expect(() => renderHook(() => useCatalogContext('useProductBySlug'))).toThrow()
    try {
      renderHook(() => useCatalogContext('useProductBySlug'))
    } catch (e) {
      expect(isCatalogProviderError(e)).toBe(true)
    }
  })
  it('provides the injected client inside the provider', () => {
    const wrapper = ({ children }: { children: ReactNode }) => (
      <CatalogProvider client={mockClient}>{children}</CatalogProvider>
    )
    const { result } = renderHook(() => useCatalogContext('useProductList'), { wrapper })
    expect(result.current.client).toBe(mockClient)
  })
})
