Files
Genarrative/src/components/image-editor/ImageCanvasEditGenerationModalView.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

122 lines
3.6 KiB
TypeScript

/* @vitest-environment jsdom */
import { fireEvent, render, screen } from '@testing-library/react';
import { type ComponentProps, type ReactNode, useState } from 'react';
import { describe, expect, it, vi } from 'vitest';
import { AuthUiContext } from '../auth/AuthUiContext';
import { setPlainTextEditorValue } from '../common/AutoGrowTextArea.test-utils';
import { ImageCanvasEditGenerationModalView } from './ImageCanvasEditGenerationModalView';
import type { GenerateDialogState } from './ImageCanvasEditorTypes';
const DARK_AUTH_UI_VALUE = {
platformTheme: 'dark',
} as ComponentProps<typeof AuthUiContext.Provider>['value'];
function withDarkAuthUi(children: ReactNode) {
return (
<AuthUiContext.Provider value={DARK_AUTH_UI_VALUE}>
{children}
</AuthUiContext.Provider>
);
}
function createDialog(
patch: Partial<GenerateDialogState> = {},
): GenerateDialogState {
return {
mode: 'edit',
prompt: '旧修改提示',
status: 'idle',
sourceLayerId: 'layer-a',
imageModel: 'gpt-image-2',
imageSize: '1K',
...patch,
};
}
function EditGenerationModalHarness({
initialDialog = createDialog(),
onSubmit = vi.fn(),
}: {
initialDialog?: GenerateDialogState | null;
onSubmit?: (dialog: GenerateDialogState) => void;
}) {
const [dialog, setDialog] = useState<GenerateDialogState | null>(
initialDialog,
);
return (
<div>
<ImageCanvasEditGenerationModalView
dialog={dialog}
setGenerateDialog={setDialog}
onSubmit={onSubmit}
/>
<output aria-label="弹窗状态">{dialog ? 'open' : 'closed'}</output>
<output aria-label="当前提示词">{dialog?.prompt ?? '-'}</output>
</div>
);
}
describe('ImageCanvasEditGenerationModalView', () => {
it('updates prompt and submits edit generation', () => {
const submitEdit = vi.fn();
render(
withDarkAuthUi(<EditGenerationModalHarness onSubmit={submitEdit} />),
);
const modal = screen
.getAllByRole('dialog', { name: '修改图片' })
.find((element) => element.classList.contains('platform-modal-shell'));
expect(modal?.parentElement?.className).toContain('platform-theme--light');
expect(modal?.parentElement?.className).not.toContain(
'platform-theme--dark',
);
setPlainTextEditorValue(screen.getByLabelText('生成提示词'), '新的修改提示');
fireEvent.click(screen.getByRole('button', { name: '修改3泥点' }));
expect(screen.getByLabelText('当前提示词').textContent).toBe(
'新的修改提示',
);
expect(submitEdit).toHaveBeenCalledWith(
expect.objectContaining({ prompt: '新的修改提示' }),
);
});
it('renders failure state and closes through the modal close button', () => {
render(
<EditGenerationModalHarness
initialDialog={createDialog({
status: 'failed',
errorMessage: '修改失败',
})}
/>,
);
expect(screen.getByRole('alert').textContent).toContain('修改失败');
fireEvent.click(screen.getByRole('button', { name: '关闭修改图片' }));
expect(screen.getByLabelText('弹窗状态').textContent).toBe('closed');
});
it('stays hidden for non-edit dialogs and generating edit dialogs', () => {
const { rerender } = render(
<EditGenerationModalHarness
initialDialog={createDialog({ mode: 'generate' })}
/>,
);
expect(screen.queryByRole('dialog', { name: '修改图片' })).toBeNull();
rerender(
<EditGenerationModalHarness
initialDialog={createDialog({ status: 'generating' })}
/>,
);
expect(screen.queryByRole('dialog', { name: '修改图片' })).toBeNull();
});
});