teqo-backup/tests/unit/contentPieceHomeFilterRow.unit.spec.tsx
Francisco Solla 862da74fbe feat(S42): seção da Central compartilha a peça e abre /conteudos já filtrada
A seção S39 era só vitrine: quem via a peça do seu território tinha de ir
até o catálogo para compartilhar ou recortar. O card agora abre a MESMA
folha do S27 (mensagem de voto por tipo, contador C213, sem sair da home) e
as tags com faceta honesta — mais a fileira Tipo | Cidade | Região — levam
a /conteudos já filtrada pelo construtor canônico; nada filtra a amostra
local e as tags sem faceta (Mais recente, origem) continuam estáticas.

As facetas da fileira são derivadas no server (contentPieceCatalogFacets,
mesmo vocabulário do catálogo) e o lean ContentPieceHomeItem ganha só
sourceUrl, com a folha S27 estreitada ao que lê; classes novas são
home-scoped — CONTENT_PIECE_TAG e /conteudos ficam intactos. Sem migration,
Consent ou analytics novos.

Closes #1391
2026-09-30 01:09:07 -03:00

54 lines
1.8 KiB
TypeScript

import { fireEvent, render, screen, within } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import { ContentPieceHomeFilterRow } from '@/components/conteudos/ContentPieceHomeFilterRow'
vi.mock('next/link', () => ({
default: ({ children, href, ...props }: { children: React.ReactNode; href: string }) => (
<a href={href} {...props}>
{children}
</a>
),
}))
const facets = {
tipo: [
{ value: 'video', label: 'Vídeo' },
{ value: 'foto', label: 'Foto' },
],
cidade: [{ value: 'salvador', label: 'Salvador' }],
regiao: [],
}
describe('ContentPieceHomeFilterRow', () => {
it('renders only the facets with options and links each option to the canonical filtered URL', () => {
render(<ContentPieceHomeFilterRow facets={facets} />)
expect(screen.getByText('Tipo')).toBeDefined()
expect(screen.getByText('Cidade')).toBeDefined()
// A facet no published piece carries never renders — no empty menu.
expect(screen.queryByText('Região')).toBeNull()
const tipo = screen.getByText('Tipo').closest('details') as HTMLElement
fireEvent.click(within(tipo).getByText('Tipo'))
expect(within(tipo).getByRole('link', { name: 'Vídeo' }).getAttribute('href')).toBe(
'/conteudos?tipo=video',
)
const cidade = screen.getByText('Cidade').closest('details') as HTMLElement
fireEvent.click(within(cidade).getByText('Cidade'))
expect(
within(cidade)
.getByRole('link', { name: /Salvador/ })
.getAttribute('href'),
).toBe('/conteudos?cidade=salvador')
})
it('renders nothing without any option', () => {
const { container } = render(
<ContentPieceHomeFilterRow facets={{ tipo: [], cidade: [], regiao: [] }} />,
)
expect(container.firstChild).toBeNull()
})
})