// @vitest-environment jsdom
import { cleanup, fireEvent, render, screen } from '@testing-library/react'
import { afterEach, describe, expect, it } from 'vitest'
import { JsonBlock, MessageText } from '@deepseek-ai/dsh-client-ui-primitives'
afterEach(cleanup)
describe('MessageText', () => {
it('renders the text verbatim', () => {
const { container } = render()
expect(container.textContent).toBe('line1\nline2')
})
})
describe('JsonBlock', () => {
it('collapsed by default; toggle reveals pretty-printed payload', () => {
render()
expect(screen.queryByText(/"a": 1/)).toBeNull()
fireEvent.click(screen.getByRole('button', { name: /args/ }))
expect(screen.getByText(/"a": 1/)).toBeDefined()
fireEvent.click(screen.getByRole('button', { name: /args/ }))
expect(screen.queryByText(/"a": 1/)).toBeNull()
})
it('defaultOpen renders the body immediately', () => {
const { container } = render()
expect(container.querySelector('pre')?.textContent).toContain('1')
})
it('stringifies undefined payloads via String()', () => {
const { container } = render()
expect(container.querySelector('pre')?.textContent).toBe('undefined')
})
it('falls back to String() for circular payloads', () => {
const circular: { self?: unknown } = {}
circular.self = circular
const { container } = render()
expect(container.querySelector('pre')?.textContent).toBe('[object Object]')
})
it('truncates beyond the size cap with a suffix note', () => {
const big = 'x'.repeat(30_000)
const { container } = render()
const body = container.querySelector('pre')!.textContent!
expect(body.length).toBeLessThan(30_000)
expect(body).toContain('截断')
})
})