mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-14 08:53:11 +00:00
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
54 lines
1.8 KiB
TypeScript
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()
|
|
})
|
|
})
|