import { fireEvent, render, screen, waitFor } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { describe, expect, it, vi } from 'vitest'
import { ApiRequestTester } from '../../src/renderer/src/features/api-center/components/ApiRequestTester'
import { ReaderSkillOverview } from '../../src/renderer/src/features/api-center/components/ReaderSkillOverview'
import type { ApiEndpoint } from '../../src/renderer/src/features/api-center/model/types'
const requestEndpoint: ApiEndpoint = {
id: 'report',
method: 'POST',
path: '/v1/report',
name: '测试接口',
description: '测试统一表单控件',
parameters: [
{
key: 'talker',
label: '会话标识',
required: true,
placeholder: '群昵称'
}
],
body: true
}
describe('API Center unified controls', () => {
it('uses the unified menu for Reader Skill actions and restores trigger focus', async () => {
const user = userEvent.setup()
const onOpenFolder = vi.fn()
const onOpenGithub = vi.fn()
render(
)
const trigger = screen.getByRole('button', { name: '更多' })
await user.click(trigger)
await user.click(screen.getByRole('menuitem', { name: '打开本地文件夹' }))
expect(onOpenFolder).toHaveBeenCalledOnce()
await user.click(trigger)
expect(screen.getByRole('menuitem', { name: '查看 GitHub 最新版本' })).toBeVisible()
await user.keyboard('{Escape}')
expect(screen.queryByRole('menu')).not.toBeInTheDocument()
await waitFor(() => expect(trigger).toHaveFocus())
expect(onOpenGithub).not.toHaveBeenCalled()
})
it('exposes the Agent target as a real single-select control', async () => {
const user = userEvent.setup()
const onTargetChange = vi.fn()
render(
)
expect(screen.getByRole('radio', { name: 'Codex' })).toBeChecked()
await user.click(screen.getByRole('radio', { name: 'Claude Code' }))
expect(onTargetChange).toHaveBeenCalledWith('claude-code')
})
it('preserves request editing and action callbacks with unified form controls', async () => {
const user = userEvent.setup()
const onParams = vi.fn()
const onBody = vi.fn()
const onClear = vi.fn()
const onCopyCurl = vi.fn(async () => undefined)
const onSend = vi.fn()
render(
)
fireEvent.change(screen.getByPlaceholderText('群昵称'), {
target: { value: '产品群' }
})
expect(onParams).toHaveBeenLastCalledWith({ talker: '产品群' })
fireEvent.change(screen.getByLabelText('JSON 请求体'), {
target: { value: '{"range":"today"}' }
})
expect(onBody).toHaveBeenLastCalledWith('{"range":"today"}')
await user.click(screen.getByRole('button', { name: '清空' }))
await user.click(screen.getByRole('button', { name: '复制 curl' }))
await user.click(screen.getByRole('button', { name: '发送请求' }))
expect(onClear).toHaveBeenCalledOnce()
expect(onCopyCurl).toHaveBeenCalledOnce()
expect(onSend).toHaveBeenCalledOnce()
})
it('keeps the send action disabled and exposes loading state accessibly', () => {
const { rerender } = render(
undefined)}
/>
)
expect(screen.getByRole('button', { name: '请先启动本地 API 服务' })).toBeDisabled()
rerender(
undefined)}
/>
)
const sending = screen.getByRole('button', { name: '发送中…' })
expect(sending).toBeDisabled()
expect(sending).toHaveAttribute('aria-busy', 'true')
})
})