// @vitest-environment happy-dom
//
// IconPickerField — the `icon` form widget: lucide search grid (icon mode) and
// delegation to UploadField (image mode). UploadField is stubbed so the image
// mode asserts delegation without needing an ApiProvider.
import { afterEach, describe, expect, it, vi } from 'vitest'
import { cleanup, render, screen, fireEvent } from '@testing-library/react'
vi.mock('../upload-field', () => ({
UploadField: ({ field, value }: any) => (
),
}))
import { IconPickerField, looksLikeImageValue } from '../icon-picker-field'
import type { ActionFieldDef } from '../types'
afterEach(cleanup)
const field: ActionFieldDef = { key: 'icon', label: 'Ícono', type: 'text', widget: 'icon' }
describe('IconPickerField', () => {
// The icon mode is a combobox: the list lives in a popover that opens on
// click. Open it, then search, then pick.
const openPopover = () =>
fireEvent.click(screen.getByRole('combobox'))
it('abre el popover, busca "credit" y al click emite onChange con el nombre', () => {
const onChange = vi.fn()
render()
openPopover()
fireEvent.change(screen.getByLabelText('Buscar ícono'), { target: { value: 'credit' } })
const option = screen.getByRole('option', { name: 'CreditCard' })
fireEvent.click(option)
expect(onChange).toHaveBeenCalledWith('CreditCard')
})
it('el trigger muestra el ícono y nombre seleccionado', () => {
render( {}} />)
// The combobox trigger shows the selected name even before opening.
expect(screen.getByRole('combobox').textContent).toContain('CreditCard')
})
it('pagina: arranca con a lo sumo 60 opciones visibles', () => {
render( {}} />)
openPopover()
expect(screen.getAllByRole('option').length).toBeLessThanOrEqual(60)
})
it('modo imagen delega a UploadField con los mismos props', () => {
render( {}} />)
fireEvent.click(screen.getByRole('tab', { name: 'Imagen' }))
const stub = screen.getByTestId('upload-field')
expect(stub.getAttribute('data-field-key')).toBe('icon')
})
it('arranca en modo Imagen cuando el valor parece path/URL', () => {
render( {}} />)
expect(screen.getByTestId('upload-field').getAttribute('data-value')).toBe('/uploads/logo.png')
})
})
describe('looksLikeImageValue', () => {
it('distingue paths/URLs de nombres lucide', () => {
expect(looksLikeImageValue('/uploads/a.png')).toBe(true)
expect(looksLikeImageValue('logo.png')).toBe(true)
expect(looksLikeImageValue('https://x/y')).toBe(true)
expect(looksLikeImageValue('CreditCard')).toBe(false)
expect(looksLikeImageValue('credit-card')).toBe(false)
expect(looksLikeImageValue('')).toBe(false)
})
})