Files
cms-onpageeditor/test/ai.test.tsx
T
2026-11-01 12:11:23 +01:00

62 lines
2.5 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from 'vitest'
import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'
import { cleanReply, rewriteMessages } from '../src/ai/rewrite'
const generate = vi.fn()
vi.mock('../src/ai/engine', () => ({
aiSupported: () => true,
getEngine: async () => ({ generate }),
}))
const { RewriteButton } = await import('../src/ai/RewriteButton')
afterEach(() => {
cleanup()
generate.mockReset()
})
describe('rewrite prompts', () => {
it('carries the task, text, format and length limit', () => {
const m = rewriteMessages('shorten', 'Hello world', { 'x-editor': 'markdown', maxLength: 50 }, 'Intro')
expect(m[0].content).toContain('Markdown')
expect(m[0].content).toContain('50 characters')
expect(m[1].content).toContain('Field: Intro')
expect(m[1].content).toContain('Hello world')
})
it('strips fences/quotes and enforces maxLength', () => {
expect(cleanReply('```\nHi there\n```', {})).toBe('Hi there')
expect(cleanReply('"Hi there"', {})).toBe('Hi there')
expect(cleanReply('abcdefghij', { maxLength: 4 })).toBe('abcd')
})
})
describe('RewriteButton', () => {
it('only writes after Accept', async () => {
generate.mockResolvedValue('Better text')
const onAccept = vi.fn()
render(<RewriteButton schema={{}} value="Bad txt" onAccept={onAccept} />)
fireEvent.click(screen.getByLabelText('Rewrite with AI'))
fireEvent.click(screen.getByText('Fix spelling & grammar'))
await screen.findByLabelText('AI suggestion')
expect(onAccept).not.toHaveBeenCalled()
fireEvent.click(screen.getByText('Accept'))
expect(onAccept).toHaveBeenCalledWith('Better text')
})
it('Reject leaves the value alone', async () => {
generate.mockResolvedValue('Other')
const onAccept = vi.fn()
render(<RewriteButton schema={{}} value="x" onAccept={onAccept} />)
fireEvent.click(screen.getByLabelText('Rewrite with AI'))
fireEvent.click(screen.getByText('Improve'))
fireEvent.click(await screen.findByText('Reject'))
expect(onAccept).not.toHaveBeenCalled()
await waitFor(() => screen.getByLabelText('Rewrite with AI'))
})
it('surfaces engine errors', async () => {
generate.mockRejectedValue(new Error('boom'))
render(<RewriteButton schema={{}} value="x" onAccept={() => {}} />)
fireEvent.click(screen.getByLabelText('Rewrite with AI'))
fireEvent.click(screen.getByText('Improve'))
expect((await screen.findByRole('alert')).textContent).toBe('boom')
})
})