import { describe, it, expect, vi } from 'vitest'
import { render, screen } from '@testing-library/react'
import { axe } from 'vitest-axe'
import { TopicMetaFields } from './topic-meta-fields'
import type { CategoryTreeNode } from '@/lib/api/types'
const COMMUNITY_DID = 'did:plc:test'
const NOW = '2026-01-01T00:00:00.000Z'
const treeCategories: CategoryTreeNode[] = [
{
id: 'cat-1',
slug: 'general',
name: 'General',
description: null,
parentId: null,
sortOrder: 0,
communityDid: COMMUNITY_DID,
maturityRating: 'safe',
createdAt: NOW,
updatedAt: NOW,
children: [],
},
{
id: 'cat-2',
slug: 'dev',
name: 'Development',
description: null,
parentId: null,
sortOrder: 1,
communityDid: COMMUNITY_DID,
maturityRating: 'safe',
createdAt: NOW,
updatedAt: NOW,
children: [
{
id: 'cat-3',
slug: 'frontend',
name: 'Frontend',
description: null,
parentId: 'cat-2',
sortOrder: 0,
communityDid: COMMUNITY_DID,
maturityRating: 'safe',
createdAt: NOW,
updatedAt: NOW,
children: [],
},
],
},
]
describe('TopicMetaFields', () => {
const defaultProps = {
title: '',
category: '',
tagInput: '',
categories: treeCategories,
errors: {},
onTitleChange: vi.fn(),
onCategoryChange: vi.fn(),
onTagInputChange: vi.fn(),
}
it('renders category options with hierarchy indentation', () => {
render()
const select = screen.getByLabelText(/category/i) as HTMLSelectElement
const options = Array.from(select.options)
// First is placeholder
expect(options[0]).toHaveTextContent('Select a category')
// "General" at root
expect(options[1]).toHaveTextContent('General')
// "Development" at root
expect(options[2]).toHaveTextContent('Development')
// "Frontend" indented under Development (contains non-breaking spaces)
const frontendOption = options[3]
expect(frontendOption?.textContent).toContain('Frontend')
expect(frontendOption?.value).toBe('frontend')
})
it('passes axe accessibility check', async () => {
const { container } = render()
const results = await axe(container)
expect(results).toHaveNoViolations()
})
})