feat(agents): 完成云智能体工作台与交互流程
This commit is contained in:
1 parent
46fbae9dec
commit
64a3cf4934
26 files changed
+1955
-49
No files matched your search
@@ -2,14 +2,16 @@ import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-libra
|
||||
import { createMemoryRouter, RouterProvider } from 'react-router-dom';
|
||||
import { afterEach, beforeEach, expect, it, vi } from 'vitest';
|
||||
import CloudAgents from '@/pages/CloudAgents';
|
||||
import { EMPTY_CLOUD_CONFIGURATION } from '../../shared/cloud-agents';
|
||||
|
||||
const api = vi.hoisted(() => ({ list: vi.fn(), create: vi.fn(), get: vi.fn(), save: vi.fn() }));
|
||||
const api = vi.hoisted(() => ({ list: vi.fn(), create: vi.fn(), get: vi.fn(), save: vi.fn(), call: vi.fn(), events: vi.fn() }));
|
||||
const auth = vi.hoisted(() => ({ user: { userId: 'creator' } }));
|
||||
vi.mock('@/lib/cloud-agents-api', () => ({ cloudAgentsApi: api }));
|
||||
vi.mock('@/stores/auth', () => ({ useAuthStore: (selector: (state: typeof auth) => unknown) => selector(auth) }));
|
||||
const draft = {
|
||||
slug: 'ml-' + 'a'.repeat(32), name: '写作搭档', purpose: '帮助写作', system_prompt: '原始指令',
|
||||
draft_revision: 1, updated_at: '2026-09-10T00:00:00Z',
|
||||
configuration: EMPTY_CLOUD_CONFIGURATION, published_version: null, enabled: true,
|
||||
};
|
||||
function open() {
|
||||
const router = createMemoryRouter([
|
||||
@@ -22,6 +24,8 @@ function open() {
|
||||
beforeEach(() => {
|
||||
vi.resetAllMocks(); auth.user.userId = 'creator';
|
||||
api.list.mockResolvedValue({ agents: [draft], next_cursor: null });
|
||||
api.call.mockImplementation(async (operation: string) => operation === 'knowledge'
|
||||
? { databases: [], models: [] } : { models: [], resources: {}, pricing: null });
|
||||
});
|
||||
afterEach(cleanup);
|
||||
|
||||
@@ -120,3 +124,23 @@ it('warns before leaving an uncertain creation and keeps its retry intent', asyn
|
||||
await waitFor(() => expect(api.create).toHaveBeenCalledTimes(2));
|
||||
expect(api.create.mock.calls[1][0]).toEqual(api.create.mock.calls[0][0]);
|
||||
});
|
||||
|
||||
|
||||
it('keeps unsent preview text when configuration changes and waits before switching saved revision', async () => {
|
||||
const configured = { ...draft, configuration: { ...EMPTY_CLOUD_CONFIGURATION, model: 'test-model' } };
|
||||
api.list.mockResolvedValue({ agents: [configured], next_cursor: null });
|
||||
api.save.mockResolvedValue({ ...configured, name: '新的名称', draft_revision: 2 });
|
||||
open();
|
||||
fireEvent.click(await screen.findByRole('button', { name: /写作搭档/ }));
|
||||
const prompt = await screen.findByPlaceholderText('输入消息或任务目标…');
|
||||
fireEvent.change(prompt, { target: { value: '还未发送的问题' } });
|
||||
fireEvent.change(screen.getByLabelText('名称'), { target: { value: '新的名称' } });
|
||||
expect(prompt).toHaveValue('还未发送的问题');
|
||||
expect(screen.getByText(/预览仍使用已保存的修订 1/)).toBeVisible();
|
||||
expect(screen.getByRole('button', { name: '保存草稿' })).toBeDisabled();
|
||||
fireEvent.change(prompt, { target: { value: '' } });
|
||||
await waitFor(() => expect(screen.getByRole('button', { name: '保存草稿' })).toBeEnabled());
|
||||
fireEvent.click(screen.getByRole('button', { name: '保存草稿' }));
|
||||
await screen.findByRole('button', { name: '已保存' });
|
||||
expect(api.save).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
Reference in new issue
Block a user