import type { FC } from 'react'
import { fireEvent, render, screen } from '@testing-library/react'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { CommentInput } from './comment-input'
type MentionInputProps = {
value: string
onChange: (value: string) => void
onSubmit: (content: string, mentionedUserIds: string[]) => void
placeholder?: string
autoFocus?: boolean
className?: string
}
const stableT = (key: string, options?: { ns?: string }) => (
options?.ns ? `${options.ns}.${key}` : key
)
let mentionInputProps: MentionInputProps | null = null
vi.mock('react-i18next', () => ({
useTranslation: () => ({
t: stableT,
}),
}))
vi.mock('@/context/app-context', () => ({
useAppContext: () => ({
userProfile: {
id: 'user-1',
name: 'Alice',
avatar_url: 'avatar',
},
}),
}))
vi.mock('@/app/components/base/avatar', () => ({
default: ({ name }: { name: string }) =>
{name}
,
}))
vi.mock('./mention-input', () => ({
MentionInput: ((props: MentionInputProps) => {
mentionInputProps = props
return (
)
}) as FC,
}))
describe('CommentInput', () => {
beforeEach(() => {
vi.clearAllMocks()
mentionInputProps = null
})
it('passes translated placeholder to mention input', () => {
render(
,
)
expect(mentionInputProps?.placeholder).toBe('workflow.comments.placeholder.add')
expect(mentionInputProps?.autoFocus).toBe(true)
})
it('calls onCancel when Escape is pressed', () => {
const onCancel = vi.fn()
render(
,
)
fireEvent.keyDown(document, { key: 'Escape' })
expect(onCancel).toHaveBeenCalledTimes(1)
})
it('forwards mention submit to onSubmit', () => {
const onSubmit = vi.fn()
render(
,
)
fireEvent.click(screen.getByTestId('mention-input'))
expect(onSubmit).toHaveBeenCalledWith('Hello', ['user-2'])
})
})