import { describe, it, expect } from 'vitest'
import { render, screen } from '@testing-library/react'
import MarkdownText from './MarkdownText'
describe('MarkdownText', () => {
it('FE-MDTEXT-001: a description written in markdown reads as formatted text, not as syntax (#2337)', () => {
render({'# Checkpoint Charlie\n\nThe **most famous** crossing.'})
expect(screen.getByRole('heading', { name: 'Checkpoint Charlie' })).toBeInTheDocument()
expect(screen.getByText('most famous').tagName).toBe('STRONG')
expect(screen.queryByText(/#\s*Checkpoint/)).toBeNull()
})
it('FE-MDTEXT-002: a gfm table is a table', () => {
render({'| Day | Stop |\n| --- | --- |\n| 1 | Gate |'})
expect(screen.getByRole('table')).toBeInTheDocument()
expect(screen.getByRole('columnheader', { name: 'Day' })).toBeInTheDocument()
})
it('FE-MDTEXT-003: a single newline stays a line break, the way the editors show it', () => {
const { container } = render({'Opening hours\n9–17'})
expect(container.querySelector('br')).not.toBeNull()
})
it('FE-MDTEXT-004: a link in a full view opens in its own tab', () => {
render({'[tickets](https://example.com/tickets)'})
const link = screen.getByRole('link', { name: 'tickets' })
expect(link).toHaveAttribute('target', '_blank')
expect(link.getAttribute('rel')).toContain('noopener')
})
it('FE-MDTEXT-005: a clamped row keeps the link text but drops the anchor, so the tap opens the row', () => {
render({'[tickets](https://example.com/tickets)'})
expect(screen.queryByRole('link')).toBeNull()
expect(screen.getByText('tickets')).toBeInTheDocument()
})
it('FE-MDTEXT-006: a clamped row is held to one line so a long description cannot swallow the list', () => {
const { container } = render({'# Berlin Wall Memorial\n\nA long second paragraph.'})
const wrapper = container.firstElementChild as HTMLElement
expect(wrapper.style.maxHeight).toBe('1.2em')
expect(wrapper.className).toContain('truncate')
expect(wrapper.className).toContain('text-m-muted')
})
it('FE-MDTEXT-007: a clamped row takes its direction from its own text, so a Latin address in Arabic is cut at its end', () => {
const { container } = render({'68 Fukakusa Yabunouchicho, Fushimi Ward, Kyoto'})
const wrapper = container.firstElementChild as HTMLElement
expect(wrapper).toHaveAttribute('dir', 'auto')
expect(wrapper).toHaveClass('truncate')
// No isolate inside: dir="auto" would not see the text through a .
expect(wrapper.querySelector('bdi')).toBeNull()
})
it('FE-MDTEXT-008: in a full view each paragraph runs in its own direction, inside its block', () => {
const text = ["Kyoto's kitchen: pickles and matcha everything.", 'Second paragraph?'].join('\n\n')
const { container } = render({text})
expect(container.firstElementChild).not.toHaveAttribute('dir')
const paragraphs = container.querySelectorAll('p')
expect(paragraphs).toHaveLength(2)
paragraphs.forEach(p => expect(p.firstElementChild?.tagName).toBe('BDI'))
expect(paragraphs[1].textContent).toBe('Second paragraph?')
})
})