Files
Genarrative/src/components/CustomWorldGenerationView.test.tsx
高物 74fd9a33ac Increase VectorEngine timeouts and add image UI
Add VectorEngine image generation config and raise request timeouts (env + scripts) from 180000 to 1000000ms. Introduce a reusable CreativeImageInputPanel component with tests and wire up mobile keyboard-focus helpers; update generation views and related tests (CustomWorldGenerationView, BarkBattle editor, Match3D, Puzzle flows). Improve API error handling / VectorEngine request guidance (packages/shared http.ts and docs), and apply multiple backend/frontend fixes for puzzle/match3d/prompt handling. Also include extensive docs and decision-log updates describing UI/UX decisions and verification steps.
2026-05-15 02:40:59 +08:00

130 lines
3.7 KiB
TypeScript

/* @vitest-environment jsdom */
import { render, screen } from '@testing-library/react';
import { describe, expect, test } from 'vitest';
import type { CustomWorldGenerationProgress } from '../../packages/shared/src/contracts/runtime';
import { CustomWorldGenerationView } from './CustomWorldGenerationView';
function createProgress(
overrides: Partial<CustomWorldGenerationProgress> = {},
): CustomWorldGenerationProgress {
return {
phaseId: 'draft_foundation',
phaseLabel: '整理草稿',
phaseDetail: '正在整理当前生成步骤。',
batchLabel: '第 2 批',
overallProgress: 42,
completedWeight: 21,
totalWeight: 50,
elapsedMs: 125_000,
estimatedRemainingMs: 75_000,
activeStepIndex: 1,
steps: [
{
id: 'step-1',
label: '收集设定',
detail: '整理初始输入。',
completed: 1,
total: 1,
status: 'completed',
},
{
id: 'step-2',
label: '编译草稿',
detail: '生成首版结构。',
completed: 2,
total: 4,
status: 'active',
},
{
id: 'step-3',
label: '写回结果',
detail: '同步结果页。',
completed: 0,
total: 4,
status: 'pending',
},
],
...overrides,
};
}
describe('CustomWorldGenerationView', () => {
test.each(['拼图草稿生成进度', '抓大鹅草稿生成进度'])(
'hides batch module and keeps wait/timer in one row for %s',
(progressTitle) => {
render(
<CustomWorldGenerationView
settingText="竖屏生成题材"
progress={createProgress()}
isGenerating
error={null}
onBack={() => {}}
onEditSetting={() => {}}
onRetry={() => {}}
settingDescription={null}
settingActionLabel={null}
progressTitle={progressTitle}
/>,
);
expect(screen.queryByText('当前批次')).toBeNull();
expect(screen.getByText('预计等待')).toBeTruthy();
expect(screen.getByText('计时')).toBeTruthy();
const statsNode = screen
.getByText('预计等待')
.closest('.custom-world-generation-stats');
expect(statsNode?.className).toContain(
'custom-world-generation-stats--two-column',
);
expect(statsNode?.getAttribute('style')).toContain(
'grid-template-columns: repeat(2, minmax(0, 1fr))',
);
const stepNodes = [
screen.getByText('收集设定'),
screen.getByText('编译草稿'),
screen.getByText('写回结果'),
].map((node) => node.closest('.custom-world-generation-step'));
expect(stepNodes.every(Boolean)).toBe(true);
expect(stepNodes[0]?.getAttribute('style')).toContain(
'--generation-step-delay: 0ms',
);
expect(stepNodes[1]?.getAttribute('style')).toContain(
'--generation-step-delay: 90ms',
);
expect(stepNodes[2]?.getAttribute('style')).toContain(
'--generation-step-delay: 180ms',
);
},
);
test('keeps batch module for other generation pages', () => {
render(
<CustomWorldGenerationView
settingText="大鱼吃小鱼题材"
progress={createProgress()}
isGenerating
error={null}
onBack={() => {}}
onEditSetting={() => {}}
onRetry={() => {}}
settingDescription={null}
settingActionLabel={null}
progressTitle="大鱼吃小鱼草稿生成进度"
/>,
);
expect(screen.getByText('当前批次')).toBeTruthy();
expect(
screen
.getByText('预计等待')
.closest('.custom-world-generation-stats')
?.className,
).not.toContain('custom-world-generation-stats--two-column');
});
});