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

154 lines
4.8 KiB
TypeScript

/**
* @license
* Copyright 2025 AionUi (aionui.com)
* SPDX-License-Identifier: Apache-2.0
*/
import React from 'react';
import { describe, expect, it, vi, beforeEach } from 'vitest';
import { render, screen } from '@testing-library/react';
import { ConfigProvider } from '@arco-design/web-react';
import { MemoryRouter } from 'react-router-dom';
import AssistantSettings from '@/renderer/pages/settings/AssistantSettings';
const useAssistantListMock = vi.fn();
const useAssistantEditorMock = vi.fn();
vi.mock('react-i18next', () => ({
useTranslation: () => ({
t: (_key: string, options?: { defaultValue?: string }) => options?.defaultValue || _key,
}),
}));
vi.mock('@arco-design/web-react', async () => {
const actual = await vi.importActual<typeof import('@arco-design/web-react')>('@arco-design/web-react');
return {
...actual,
Message: {
useMessage: () => [{ success: vi.fn(), error: vi.fn(), warning: vi.fn() }, <div key='message-context' />],
},
};
});
vi.mock('@/renderer/hooks/assistant', () => ({
useAssistantList: () => useAssistantListMock(),
useAssistantEditor: (params: unknown) => useAssistantEditorMock(params),
}));
vi.mock('@/renderer/pages/settings/components/SettingsPageWrapper', () => ({
default: ({ children }: { children: React.ReactNode }) => <div data-testid='settings-wrapper'>{children}</div>,
}));
vi.mock('@/renderer/pages/settings/AssistantSettings/AssistantEditorPage', () => ({
default: () => <div data-testid='assistant-editor-page' />,
}));
vi.mock('@/renderer/pages/settings/AssistantSettings/AssistantListPanel', () => ({
default: () => <div data-testid='assistant-list-panel' />,
}));
vi.mock('@/renderer/pages/settings/AssistantSettings/DeleteAssistantModal', () => ({
default: () => null,
}));
vi.mock('@/renderer/pages/settings/AssistantSettings/SkillConfirmModals', () => ({
default: () => null,
}));
vi.mock('@/renderer/pages/settings/AssistantSettings/assistantUtils', async () => {
const actual = await vi.importActual<typeof import('@/renderer/pages/settings/AssistantSettings/assistantUtils')>(
'@/renderer/pages/settings/AssistantSettings/assistantUtils'
);
return {
...actual,
resolveAvatarImageSrc: () => undefined,
};
});
describe('AssistantSettings', () => {
beforeEach(() => {
useAssistantListMock.mockReturnValue({
assistants: [],
activeAssistantId: 'assistant-1',
setActiveAssistantId: vi.fn(),
activeAssistant: null,
loadAssistants: vi.fn(),
reorderAssistants: vi.fn(),
localeKey: 'en-US',
});
useAssistantEditorMock.mockReturnValue({
editVisible: true,
isCreating: false,
editName: '',
setEditName: vi.fn(),
editDescription: '',
setEditDescription: vi.fn(),
editAvatar: '',
setEditAvatar: vi.fn(),
editAgent: 'claude',
setEditAgent: vi.fn(),
editRecommendedPromptsText: '',
setEditRecommendedPromptsText: vi.fn(),
defaultModelMode: 'auto',
setDefaultModelMode: vi.fn(),
defaultModelValue: '',
setDefaultModelValue: vi.fn(),
defaultPermissionMode: 'auto',
setDefaultPermissionMode: vi.fn(),
defaultPermissionValue: '',
setDefaultPermissionValue: vi.fn(),
defaultSkillsMode: 'fixed',
setDefaultSkillsMode: vi.fn(),
defaultMcpMode: 'auto',
setDefaultMcpMode: vi.fn(),
availableMcpServers: [],
selectedMcpIds: [],
setSelectedMcpIds: vi.fn(),
editContext: '',
setEditContext: vi.fn(),
promptViewMode: 'preview',
setPromptViewMode: vi.fn(),
availableSkills: [],
selectedSkills: [],
setSelectedSkills: vi.fn(),
pendingSkills: [],
setDeletePendingSkillName: vi.fn(),
setDeleteCustomSkillName: vi.fn(),
builtinAutoSkills: [],
disabledBuiltinSkills: [],
setDisabledBuiltinSkills: vi.fn(),
handleSave: vi.fn(),
handleDeleteClick: vi.fn(),
handleDuplicate: vi.fn(),
handleDeleteRequest: vi.fn(),
handleToggleEnabled: vi.fn(),
handleEdit: vi.fn(),
handleCreate: vi.fn(),
deleteConfirmVisible: false,
setDeleteConfirmVisible: vi.fn(),
deletePendingSkillName: null,
deleteCustomSkillName: null,
customSkills: [],
setCustomSkills: vi.fn(),
setPendingSkills: vi.fn(),
handleDeleteConfirm: vi.fn(),
setEditVisible: vi.fn(),
});
});
it('keeps the editor visible when an existing assistant session is open and activeAssistant is temporarily null', () => {
render(
<ConfigProvider>
<MemoryRouter>
<AssistantSettings />
</MemoryRouter>
</ConfigProvider>
);
expect(screen.getByTestId('assistant-editor-page')).toBeInTheDocument();
expect(screen.queryByTestId('assistant-list-panel')).not.toBeInTheDocument();
});
});