Files
Genarrative/src/components/image-editor/EditorAgentConversation/EditorAgentDraftTextarea.test.tsx
T
k88936 676bd524ee
Project CI / Repository checks (push) Successful in 1m23s
Project CI / Frontend tests (push) Successful in 3m1s
Project CI / Backend tests (push) Successful in 3m51s
Project CI / Native shell tests (push) Successful in 13m32s
滑动条样式调整 (#149)
示例来自微信:
![shotmd-1786091231.jpg](/attachments/b59bae77-00ca-4669-8a54-a9786ae53c93)

before:
- firefox:
![shotmd-1786091298.jpg](/attachments/80bbd46e-551d-4b44-abe4-d3d0ecaa34dd)

- edge:
![shotmd-1786091062.jpg](/attachments/7918c523-1b5b-4439-926d-591e0029c5b9)

after:
- firefox:
![shotmd-1786110119.jpg](/attachments/31b22537-236b-4782-bc47-28ac5ecb0f9f)
![shotmd-1786110060.jpg](/attachments/b48d5343-fd07-451d-943a-55000600e248)

- edge:

![shotmd-1786110050.jpg](/attachments/cfd0d8e4-7d52-45f2-bab8-1b573b3a43b0)

- 使用 Lexical + OverlayScrollbars 实现统一可控的滑动条样式, 取代原来的textarea

Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/149
Co-authored-by: 王德宇 <kvtodev@outlook.com>
Co-committed-by: 王德宇 <kvtodev@outlook.com>
2026-08-08 15:10:16 +08:00

87 lines
2.3 KiB
TypeScript

/* @vitest-environment jsdom */
import { fireEvent, render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { useState } from 'react';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { EditorAgentDraftTextarea } from './EditorAgentDraftTextarea.tsx';
beforeEach(() => {
vi.stubGlobal(
'ResizeObserver',
class ResizeObserver {
observe() {}
unobserve() {}
disconnect() {}
},
);
});
function DraftHarness({
onPaste,
onSubmitRequest,
}: {
onPaste?: (event: ClipboardEvent) => void;
onSubmitRequest: () => void;
}) {
const [value, setValue] = useState('');
return (
<EditorAgentDraftTextarea
value={value}
onValueChange={setValue}
onPaste={onPaste}
onSubmitRequest={onSubmitRequest}
/>
);
}
describe('EditorAgentDraftTextarea', () => {
it('forwards controlled draft edits and paste events', async () => {
const user = userEvent.setup();
const onPaste = vi.fn((event: ClipboardEvent) => event.preventDefault());
render(<DraftHarness onPaste={onPaste} onSubmitRequest={vi.fn()} />);
const editor = screen.getByRole('textbox', {
name: '发送给画布 Agent',
});
await user.click(editor);
fireEvent.paste(editor, {
clipboardData: {
files: [],
getData: () => '',
items: [],
types: [],
},
});
expect(onPaste).toHaveBeenCalledTimes(1);
});
it('submits on Enter but preserves Shift+Enter and IME confirmation', async () => {
const user = userEvent.setup();
const onSubmitRequest = vi.fn();
const { container } = render(
<DraftHarness onSubmitRequest={onSubmitRequest} />,
);
const editor = screen.getByRole('textbox', {
name: '发送给画布 Agent',
});
await user.click(editor);
fireEvent.keyDown(editor, { key: 'Enter', shiftKey: true });
expect(onSubmitRequest).not.toHaveBeenCalled();
fireEvent.keyDown(editor, {
key: 'Enter',
isComposing: true,
keyCode: 229,
});
expect(onSubmitRequest).not.toHaveBeenCalled();
fireEvent.keyDown(editor, { key: 'Enter' });
expect(onSubmitRequest).toHaveBeenCalledTimes(1);
expect(container.querySelector('form')).toBeNull();
expect(container.querySelector('textarea')).toBeNull();
});
});