Files
iofficeai--aionui/tests/unit/settings/AssistantEditorPage.dom.test.tsx
2026-07-13 13:20:22 +08:00

165 lines
4.9 KiB
TypeScript

/**
* @license
* Copyright 2025 AionUi (aionui.com)
* SPDX-License-Identifier: Apache-2.0
*/
import React from 'react';
import { describe, it, expect, vi } from 'vitest';
import { render, screen } from '@testing-library/react';
import { ConfigProvider } from '@arco-design/web-react';
import AssistantEditorPage from '@/renderer/pages/settings/AssistantSettings/AssistantEditorPage';
import type { AssistantEditorViewModel } from '@/renderer/pages/settings/AssistantSettings/types';
vi.mock('react-i18next', () => ({
useTranslation: () => ({
t: (_key: string, options?: { defaultValue?: string }) => options?.defaultValue || _key,
}),
}));
vi.mock('@/renderer/pages/settings/AssistantSettings/AssistantEditorSections', () => ({
default: () => <div data-testid='assistant-editor-sections' />,
}));
describe('AssistantEditorPage', () => {
const createEditor = (): AssistantEditorViewModel => ({
isCreating: true,
profile: {
name: '',
setName: vi.fn(),
description: '',
setDescription: vi.fn(),
avatar: '🤖',
setAvatar: vi.fn(),
setAvatarPreview: vi.fn(),
},
agent: {
value: 'claude',
setValue: vi.fn(),
availableBackends: [],
},
prompts: {
text: '',
setText: vi.fn(),
},
defaults: {
model: { mode: 'auto', setMode: vi.fn(), value: '', setValue: vi.fn() },
permission: { mode: 'auto', setMode: vi.fn(), value: '', setValue: vi.fn() },
skills: { mode: 'auto', setMode: vi.fn() },
mcps: { mode: 'auto', setMode: vi.fn(), availableServers: [], selectedIds: [], setSelectedIds: vi.fn() },
},
rules: {
content: '',
setContent: vi.fn(),
viewMode: 'preview',
setViewMode: vi.fn(),
},
skills: {
availableSkills: [],
selectedSkills: [],
setSelectedSkills: vi.fn(),
pendingSkills: [],
setDeletePendingSkillName: vi.fn(),
setDeleteCustomSkillName: vi.fn(),
builtinAutoSkills: [],
disabledBuiltinSkills: [],
setDisabledBuiltinSkills: vi.fn(),
},
actions: {
save: vi.fn(),
requestDelete: vi.fn(),
duplicate: vi.fn(),
},
});
it('renders a single assistant-editor-page test id', () => {
render(
<ConfigProvider>
<AssistantEditorPage editor={createEditor()} activeAssistant={null} onBack={vi.fn()} />
</ConfigProvider>
);
expect(screen.getAllByTestId('assistant-editor-page')).toHaveLength(1);
expect(screen.getByTestId('assistant-editor-bar')).toHaveClass('sticky');
expect(screen.getByTestId('assistant-editor-body')).toBeInTheDocument();
});
it('uses a high-contrast back action in the editor header', () => {
render(
<ConfigProvider>
<AssistantEditorPage editor={createEditor()} activeAssistant={null} onBack={vi.fn()} />
</ConfigProvider>
);
expect(screen.getByTestId('btn-back-assistant-editor').className).toContain('text-t-primary');
});
it('prefers the editor profile name in the header title', () => {
const editor = createEditor();
editor.isCreating = false;
editor.profile.name = '学术论文助手';
render(
<ConfigProvider>
<AssistantEditorPage
editor={editor}
activeAssistant={{
id: 'builtin-1',
name: 'Academic Paper',
source: 'builtin',
enabled: true,
sort_order: 1,
name_i18n: { 'en-US': 'Academic Paper', 'zh-CN': '学术论文助手' },
description_i18n: {},
context_i18n: {},
prompts_i18n: {},
enabled_skills: [],
custom_skill_names: [],
disabled_builtin_skills: [],
preset_agent_type: 'claude',
models: [],
}}
onBack={vi.fn()}
/>
</ConfigProvider>
);
expect(screen.getByText('学术论文助手')).toBeInTheDocument();
expect(screen.queryByText('Academic Paper')).not.toBeInTheDocument();
});
it('allows saving and hides delete for generated assistants', () => {
const editor = createEditor();
editor.isCreating = false;
editor.profile.name = 'Droid';
render(
<ConfigProvider>
<AssistantEditorPage
editor={editor}
activeAssistant={{
id: 'bare-1',
name: 'Droid',
source: 'generated',
enabled: true,
sort_order: 1,
name_i18n: {},
description_i18n: {},
context_i18n: {},
prompts_i18n: {},
enabled_skills: [],
custom_skill_names: [],
disabled_builtin_skills: [],
preset_agent_type: 'droid',
models: [],
}}
onBack={vi.fn()}
/>
</ConfigProvider>
);
expect(screen.queryByTestId('btn-delete-assistant')).not.toBeInTheDocument();
expect(screen.getByTestId('btn-save-assistant')).not.toBeDisabled();
});
});