import { describe, it, expect } from 'vitest'
import { render, screen } from '@testing-library/react'
import { TopicList } from './topic-list'
import { mockTopics } from '@/mocks/data'
import type { Topic } from '@/lib/api/types'
const baseTopic: Topic = { ...mockTopics[0]! }
describe('TopicList', () => {
it('renders all topics', () => {
render()
const articles = screen.getAllByRole('article')
expect(articles).toHaveLength(mockTopics.length)
})
it('renders topic titles', () => {
render()
for (const topic of mockTopics) {
expect(screen.getByRole('link', { name: topic.title })).toBeInTheDocument()
}
})
it('renders empty state when no topics', () => {
render()
expect(screen.getByText(/no topics yet/i)).toBeInTheDocument()
})
it('renders with heading', () => {
render()
expect(screen.getByRole('heading', { name: 'Recent Topics' })).toBeInTheDocument()
})
it('should render "Pinned" heading when there are pinned topics', () => {
const topics: Topic[] = [
{
...baseTopic,
uri: 'at://did:plc:test/forum.barazo.topic.post/p1',
rkey: 'p1',
isPinned: true,
pinnedScope: 'category',
pinnedAt: '2026-03-01T00:00:00Z',
},
{
...baseTopic,
uri: 'at://did:plc:test/forum.barazo.topic.post/r1',
rkey: 'r1',
isPinned: false,
pinnedScope: null,
pinnedAt: null,
},
]
render()
expect(screen.getByText('Pinned')).toBeInTheDocument()
expect(screen.getByText('Topics')).toBeInTheDocument()
})
it('should not render section headings when no pinned topics', () => {
const topics: Topic[] = [
{
...baseTopic,
uri: 'at://did:plc:test/forum.barazo.topic.post/r1',
rkey: 'r1',
isPinned: false,
pinnedScope: null,
pinnedAt: null,
},
]
render()
expect(screen.queryByText('Pinned')).not.toBeInTheDocument()
expect(screen.queryByText('Topics')).not.toBeInTheDocument()
})
it('should render a separator between pinned and regular topics', () => {
const topics: Topic[] = [
{
...baseTopic,
uri: 'at://did:plc:test/forum.barazo.topic.post/p1',
rkey: 'p1',
isPinned: true,
pinnedScope: 'category',
pinnedAt: '2026-03-01T00:00:00Z',
},
{
...baseTopic,
uri: 'at://did:plc:test/forum.barazo.topic.post/r1',
rkey: 'r1',
isPinned: false,
pinnedScope: null,
pinnedAt: null,
},
]
render()
expect(screen.getByRole('separator')).toBeInTheDocument()
})
it('should render only pinned section when all topics are pinned', () => {
const topics: Topic[] = [
{
...baseTopic,
uri: 'at://did:plc:test/forum.barazo.topic.post/p1',
rkey: 'p1',
isPinned: true,
pinnedScope: 'category',
pinnedAt: '2026-03-01T00:00:00Z',
},
{
...baseTopic,
uri: 'at://did:plc:test/forum.barazo.topic.post/p2',
rkey: 'p2',
isPinned: true,
pinnedScope: 'forum',
pinnedAt: '2026-03-02T00:00:00Z',
},
]
render()
expect(screen.getByText('Pinned')).toBeInTheDocument()
// No regular topics section needed, but separator and "Topics" heading still render for consistency
const articles = screen.getAllByRole('article')
expect(articles).toHaveLength(2)
})
})