Remove teacher conversation discussion components
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// Deterministic responses for layout/interaction tests only; never imported by the app.
|
||||
import type { TeacherDefinition, TeacherTopic, TeacherSend, TeacherDiscussionAction } from '../../../shared/coding-teacher';
|
||||
import type { TeacherDefinition, TeacherTopic, TeacherSend } from '../../../shared/coding-teacher';
|
||||
import type { TeacherDiscussionContent } from '../../../shared/teacher-discussion';
|
||||
const definition: TeacherDefinition = { schema_version: 1, teacher_id: 'coding-teacher', name: '麦洛智能体', description: '', avatar_id: 'avatar-01', welcome_message: '', suggested_questions: [], system_prompt: '测试', skills: [], model: { model_id: 'fixture', reasoning_choice: { mode: 'default' } }, limits: { max_input_tokens: 8000, max_output_tokens: 1500 } };
|
||||
const samples: Record<string, TeacherDiscussionContent> = {
|
||||
@@ -28,42 +28,14 @@ export const teacherApi = {
|
||||
read: async () => structuredClone(current),
|
||||
create: async () => structuredClone(current),
|
||||
events: async () => stream,
|
||||
updateDiscussion: async (_base: string, _id: string, input: TeacherDiscussionAction) => {
|
||||
const tool = current.discussion!;
|
||||
if (input.action === 'pause' || input.action === 'finish') tool.status = input.action === 'pause' ? 'paused' : 'finished';
|
||||
else tool.status = 'active';
|
||||
if (input.action === 'back-ideas' && tool.previousIdeas) {
|
||||
if (tool.content.kind === 'structure') tool.previousStructure = structuredClone(tool.content);
|
||||
tool.content = structuredClone(tool.previousIdeas);
|
||||
}
|
||||
if (tool.content.kind === 'ideas') {
|
||||
const item = tool.content.items.find(item => item.id === input.itemId);
|
||||
if (item && input.action === 'keep-idea') item.state = 'kept';
|
||||
if (item && input.action === 'aside-idea') item.state = 'aside';
|
||||
if (item && input.action === 'first-idea') tool.content.firstItemId = item.id;
|
||||
}
|
||||
tool.revision++;
|
||||
snapshot();
|
||||
return structuredClone(current);
|
||||
},
|
||||
send: async (_base: string, _id: string, input: TeacherSend) => {
|
||||
if (input.presentation || input.discussion) throw new Error('New chat requests must not ask for components');
|
||||
current.requests.push({ id: input.requestId, text: input.text, references: [], createdAt: 'now', status: 'running', sourceCursor: { workerGeneration: 0, seq: 1 }, sourceCapturedAt: 'now', includedSourceMessageIds: [], omittedMessages: 0, response: '', discussionContext: input.discussion });
|
||||
snapshot();
|
||||
timer = setTimeout(() => {
|
||||
const request = current.requests.at(-1)!;
|
||||
request.status = 'completed';
|
||||
request.response = '好,已经把你的补充放在上面了。我们可以接着想。';
|
||||
const tool = current.discussion;
|
||||
if (tool?.status === 'active' && input.discussion) {
|
||||
if (input.discussion.transition === 'structure' && tool.content.kind === 'ideas') {
|
||||
tool.previousIdeas = structuredClone(tool.content);
|
||||
tool.content = structuredClone(samples.structure);
|
||||
} else if (tool.content.kind === 'ideas') tool.content.items.push({ id: `new-${tool.revision}`, text: input.text, state: 'kept' });
|
||||
else if (tool.content.kind === 'structure') tool.content.nodes.push({ id: `new-${tool.revision}`, label: input.text, parentId: 'world' });
|
||||
else if (tool.content.kind === 'flow') tool.content.nodes.push({ id: `new-${tool.revision}`, label: input.text, kind: 'outcome' });
|
||||
else tool.content.rows.push({ id: `new-${tool.revision}`, label: '再想想这一点', cells: tool.content.columns.map(col => ({ columnId: col.id, text: '先观察实际玩的时候有什么不同。' })) });
|
||||
tool.revision++;
|
||||
}
|
||||
request.response = '好,我们可以接着聊。';
|
||||
snapshot();
|
||||
}, 350);
|
||||
return structuredClone(current);
|
||||
@@ -73,3 +45,5 @@ export const teacherApi = {
|
||||
export const teacherTopicsPath = () => '/fixture';
|
||||
|
||||
export const legacyTopicBase = (base: string) => base;
|
||||
|
||||
export const teacherConversationsPath = () => '/fixture/conversations';
|
||||
|
||||
@@ -1879,6 +1879,12 @@ test('project consultations preserve student drafts and switch between work and
|
||||
await expect(composer).toHaveValue('保留我的草稿');
|
||||
await teacher.getByRole('button',{name:'我也说不清,你带我看看',exact:true}).click();
|
||||
await expect(teacher.getByText('你最近做的哪一步,让你停下来想了一会儿?')).toBeVisible();
|
||||
await expect(teacher.getByTestId('teacher-discussion')).toHaveCount(0);
|
||||
const consultationSends = (await readState(electronApp)).captured.filter(item => item.path.endsWith('/messages') && item.method === 'POST');
|
||||
for (const sent of consultationSends) {
|
||||
expect(sent.body).not.toHaveProperty('presentation');
|
||||
expect(sent.body).not.toHaveProperty('discussion');
|
||||
}
|
||||
await expect(teacher.getByRole('textbox',{name:'向智能体提问'})).toHaveValue('还没说完的困惑');
|
||||
await page.getByRole('tab',{name:'操作对话',exact:true}).click();
|
||||
await expect(composer).toBeVisible();
|
||||
|
||||
@@ -8,7 +8,7 @@ test.beforeAll(async () => {
|
||||
server = await createServer({ configFile: false, cacheDir: 'node_modules/.vite-teacher-discussion', resolve: { alias: { '@': resolve('src') } }, esbuild: { jsx: 'automatic' }, server: { host: '127.0.0.1', port: 0 }, plugins: [{
|
||||
name: 'isolated-discussion-test', enforce: 'pre',
|
||||
load(id) {
|
||||
if (id.endsWith('/src/lib/coding-teacher.ts')) return "export { teacherApi, teacherTopicsPath, legacyTopicBase } from '/tests/e2e/fixtures/teacher-discussion-api.ts';";
|
||||
if (id.endsWith('/src/lib/coding-teacher.ts')) return "export { teacherApi, teacherTopicsPath, teacherConversationsPath, legacyTopicBase } from '/tests/e2e/fixtures/teacher-discussion-api.ts';";
|
||||
if (id.endsWith('/src/stores/auth.ts')) return 'export const useAuthStore = selector => selector({user:{userId:"fixture"}});';
|
||||
},
|
||||
configureServer(vite) { vite.middlewares.use((req, res, next) => {
|
||||
@@ -49,7 +49,7 @@ for (const width of [319, 508]) {
|
||||
});
|
||||
}
|
||||
for (const width of [319, 508]) for (const kind of ['ordinary', 'ideas', 'structure', 'flow', 'comparison']) {
|
||||
test(`${kind} pins the current tool and composer at ${width}px`, async ({ page }) => {
|
||||
test(`${kind} history uses the message pane without discussion cards at ${width}px`, async ({ page }) => {
|
||||
await page.setViewportSize({ width: 1180, height: 800 });
|
||||
const errors: string[] = []; page.on('pageerror', error => errors.push(error.message));
|
||||
await page.addInitScript(() => localStorage.setItem(
|
||||
@@ -60,43 +60,23 @@ for (const width of [319, 508]) for (const kind of ['ordinary', 'ideas', 'struct
|
||||
await expect(input).toBeEnabled();
|
||||
await expect(page.locator('form')).not.toHaveText(/^0/);
|
||||
await expect(page.getByText('查看旧版朋友草稿')).toHaveCount(0);
|
||||
const tool = page.getByTestId('teacher-discussion');
|
||||
await expect(page.getByTestId('teacher-discussion')).toHaveCount(0);
|
||||
const composer = await input.boundingBox();
|
||||
await page.locator('.consultation-messages').hover();
|
||||
await page.mouse.wheel(0, -1500);
|
||||
expect((await input.boundingBox())?.y).toBe(composer!.y);
|
||||
expect(composer!.y + composer!.height).toBeLessThan(800);
|
||||
if (kind === 'ordinary') {
|
||||
await expect(tool).toHaveCount(0);
|
||||
await input.fill('保留我的草稿');
|
||||
await page.getByRole('button', { name: '有什么好玩的想法?' }).click();
|
||||
await expect(page.getByText('好,已经把你的补充放在上面了。我们可以接着想。')).toBeVisible();
|
||||
await expect(input).toHaveValue('保留我的草稿');
|
||||
} else {
|
||||
await expect(tool).toHaveAttribute('data-kind', kind);
|
||||
const before = await tool.boundingBox();
|
||||
const composer = await input.boundingBox();
|
||||
await page.locator('.consultation-messages').hover();
|
||||
await page.mouse.wheel(0, -1500);
|
||||
await expect.poll(async () => (await tool.boundingBox())?.y).toBe(before!.y);
|
||||
expect((await input.boundingBox())?.y).toBe(composer!.y);
|
||||
expect(await tool.evaluate(el => el.scrollWidth <= el.clientWidth)).toBe(true);
|
||||
expect(composer!.y + composer!.height).toBeLessThan(800);
|
||||
await input.fill('它还喜欢和我踢球');
|
||||
await page.getByRole('button', { name: '提问', exact: true }).click();
|
||||
await expect(page.getByRole('status')).toContainText('正在梳理');
|
||||
await expect(page.getByText('好,已经把你的补充放在上面了。我们可以接着想。')).toBeVisible();
|
||||
await expect(tool).toHaveCount(1);
|
||||
await expect(tool).toHaveAttribute('data-kind', kind);
|
||||
if (kind === 'ideas') {
|
||||
await page.getByRole('button', { name: '把想法理一理' }).click();
|
||||
await expect(tool).toHaveAttribute('data-kind', 'structure');
|
||||
await page.getByRole('button', { name: '回去补充想法' }).click();
|
||||
await expect(tool).toHaveAttribute('data-kind', 'ideas');
|
||||
await expect(tool.getByText('它还喜欢和我踢球', { exact: true })).toHaveCount(1);
|
||||
}
|
||||
await input.fill('先留下下一句');
|
||||
await page.getByRole('button', { name: '先这些', exact: true }).click();
|
||||
await expect(tool).toHaveAttribute('data-collapsed', 'true');
|
||||
await expect(input).toHaveValue('先留下下一句');
|
||||
await page.getByRole('button', { name: '接着改', exact: true }).click();
|
||||
await expect(tool).toHaveAttribute('data-collapsed', 'false');
|
||||
}
|
||||
await expect(page.getByText('好,我们可以接着聊。')).toBeVisible();
|
||||
await expect(page.getByTestId('teacher-discussion')).toHaveCount(0);
|
||||
await expect.poll(() => page.locator('.consultation-messages').evaluate(el => el.scrollWidth <= el.clientWidth)).toBe(true);
|
||||
await page.screenshot({ path: test.info().outputPath(`${kind}-${width}.png`) });
|
||||
expect(errors).toEqual([]);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user