import { cleanup, render, screen } from '@testing-library/react'
import { afterEach, describe, expect, it, vi } from 'vitest'
import { CampaignHomeSearch } from '@/components/campaign/dashboard/CampaignHomeSearch'
import { HomeSearchProvider } from '@/components/campaign/dashboard/HomeSearchContext'
import { HomeSearchResultsProvider } from '@/components/campaign/dashboard/HomeSearchResultsContext'
import { HomeSearchResultsShell } from '@/components/campaign/dashboard/HomeSearchResultsShell'
import type { HomeSearchSuccessResponse } from '@/lib/campaignHomeSearchHits'
import { HOME_SEARCH_SUGGEST_EMPTY_MESSAGE } from '@/lib/campaignHomeSearchMessages'
const providerValue = {
query: { raw: 'ca', debounced: 'ca', isActive: true },
setRaw: vi.fn(),
clear: vi.fn(),
isDebouncing: false,
inputFocused: false,
setInputFocused: vi.fn(),
uiFocused: true,
}
const suggestFocusedProviderValue = {
...providerValue,
query: { raw: '', debounced: '', isActive: false },
}
const suggestSuccessEmpty: HomeSearchSuccessResponse = {
status: 'success',
resultKind: 'suggest',
municipalities: [],
territories: [],
advisors: [],
leaderships: [],
stateDeputies: [],
activities: [],
demands: [],
scopeMunicipalities: [],
}
const suggestSuccessWithHits: HomeSearchSuccessResponse = {
...suggestSuccessEmpty,
municipalities: [
{
kind: 'municipality',
slug: 'salvador',
name: 'Salvador',
region: 'Região Metropolitana',
priority: 'alta',
votePosition2022: null,
},
],
}
afterEach(() => {
cleanup()
})
describe('CampaignHomeSearch', () => {
afterEach(() => {
cleanup()
})
it('renders search input and results region', () => {
render(
Group stub
,
)
expect(screen.getByLabelText('Buscar na campanha')).toBeTruthy()
expect((screen.getByLabelText('Buscar na campanha') as HTMLInputElement).placeholder).toBe(
'Município, liderança, atividade…',
)
expect(screen.getByRole('region', { name: 'Resultados da busca' })).toBeTruthy()
expect(screen.getByText('Group stub')).toBeTruthy()
})
it('supports discreet peek without placeholder and hidden results', () => {
render(
Group stub
,
)
expect((screen.getByLabelText('Buscar na campanha') as HTMLInputElement).placeholder).toBe('')
const results = document.querySelector('[data-slot="home-search-results"]')
expect(results).toBeTruthy()
expect((results as HTMLElement).hidden).toBe(true)
})
})
describe('HomeSearchResultsShell', () => {
afterEach(() => {
cleanup()
})
it('shows skeleton rows while fetching without hits (B106)', () => {
render(
Group stub
,
)
expect(screen.getByTestId('home-search-suggest-skeleton')).toBeTruthy()
expect(screen.queryByText('Group stub')).toBeNull()
})
it('shows the honest empty message when suggest succeeds without hits (OPS29)', () => {
render(
Group stub
,
)
expect(screen.getByText(HOME_SEARCH_SUGGEST_EMPTY_MESSAGE)).toBeTruthy()
expect(screen.queryByText('Nenhum resultado.')).toBeNull()
})
it('does not render the suggest empty message when suggest has hits (OPS29)', () => {
render(
Group stub
,
)
expect(screen.queryByText(HOME_SEARCH_SUGGEST_EMPTY_MESSAGE)).toBeNull()
expect(screen.getByText('Group stub')).toBeTruthy()
})
it('keeps the suggest empty message out of the debounce window (OPS29)', () => {
render(
Group stub
,
)
expect(screen.getByTestId('home-search-suggest-skeleton')).toBeTruthy()
expect(screen.queryByText(HOME_SEARCH_SUGGEST_EMPTY_MESSAGE)).toBeNull()
})
it('keeps the search-mode empty message for an active query without hits (OPS29)', () => {
render(
Group stub
,
)
expect(screen.getByText('Nenhum resultado.')).toBeTruthy()
expect(screen.queryByText(HOME_SEARCH_SUGGEST_EMPTY_MESSAGE)).toBeNull()
})
})