This commit is contained in:
173
src/components/big-fish-result/BigFishResultView.test.tsx
Normal file
173
src/components/big-fish-result/BigFishResultView.test.tsx
Normal file
@@ -0,0 +1,173 @@
|
||||
// @vitest-environment jsdom
|
||||
|
||||
import { fireEvent, render, screen } from '@testing-library/react';
|
||||
import { describe, expect, test, vi } from 'vitest';
|
||||
|
||||
import type { BigFishSessionSnapshotResponse } from '../../../packages/shared/src/contracts/bigFish';
|
||||
import { BigFishResultView } from './BigFishResultView';
|
||||
|
||||
vi.mock('../ResolvedAssetImage', () => ({
|
||||
ResolvedAssetImage: ({
|
||||
src,
|
||||
alt,
|
||||
className,
|
||||
}: {
|
||||
src?: string | null;
|
||||
alt?: string;
|
||||
className?: string;
|
||||
}) => (src ? <img src={src} alt={alt} className={className} /> : null),
|
||||
}));
|
||||
|
||||
function createSession(): BigFishSessionSnapshotResponse {
|
||||
return {
|
||||
sessionId: 'big-fish-session-1',
|
||||
currentTurn: 2,
|
||||
progressPercent: 88,
|
||||
stage: 'asset_refining',
|
||||
anchorPack: {
|
||||
gameplayPromise: {
|
||||
key: 'gameplayPromise',
|
||||
label: '玩法承诺',
|
||||
value: '弱小逆袭',
|
||||
status: 'confirmed',
|
||||
},
|
||||
ecologyVisualTheme: {
|
||||
key: 'ecologyVisualTheme',
|
||||
label: '生态与视觉母题',
|
||||
value: '深海谜境',
|
||||
status: 'confirmed',
|
||||
},
|
||||
growthLadder: {
|
||||
key: 'growthLadder',
|
||||
label: '成长阶梯',
|
||||
value: '8 级进化',
|
||||
status: 'confirmed',
|
||||
},
|
||||
riskTempo: {
|
||||
key: 'riskTempo',
|
||||
label: '风险节奏',
|
||||
value: '平衡',
|
||||
status: 'confirmed',
|
||||
},
|
||||
},
|
||||
draft: {
|
||||
title: '深海谜境',
|
||||
subtitle: '逐级吞噬成长',
|
||||
coreFun: '弱小逆袭',
|
||||
ecologyTheme: '深海谜境',
|
||||
levels: [
|
||||
{
|
||||
level: 1,
|
||||
name: '荧潮幼体',
|
||||
oneLineFantasy: '在深海荧光裂谷中寻找第一个同伴。',
|
||||
silhouetteDirection: '圆润鱼苗',
|
||||
sizeRatio: 1,
|
||||
visualPromptSeed: '深海荧光幼体',
|
||||
motionPromptSeed: '轻微摆尾',
|
||||
mergeSourceLevel: null,
|
||||
preyWindow: [1],
|
||||
threatWindow: [2],
|
||||
isFinalLevel: false,
|
||||
},
|
||||
],
|
||||
background: {
|
||||
theme: '深海谜境',
|
||||
colorMood: '深蓝与青绿',
|
||||
foregroundHints: '漂浮微粒',
|
||||
midgroundComposition: '中央留白',
|
||||
backgroundDepth: '深海纵深',
|
||||
safePlayAreaHint: '中央 70%',
|
||||
spawnEdgeHint: '四周边缘',
|
||||
backgroundPromptSeed: '深海谜境背景',
|
||||
},
|
||||
runtimeParams: {
|
||||
levelCount: 1,
|
||||
mergeCountPerUpgrade: 3,
|
||||
spawnTargetCount: 12,
|
||||
leaderMoveSpeed: 160,
|
||||
followerCatchUpSpeed: 120,
|
||||
offscreenCullSeconds: 3,
|
||||
preySpawnDeltaLevels: [1],
|
||||
threatSpawnDeltaLevels: [1],
|
||||
winLevel: 1,
|
||||
},
|
||||
},
|
||||
assetSlots: [
|
||||
{
|
||||
slotId: 'big-fish-asset-level-main',
|
||||
assetKind: 'level_main_image',
|
||||
level: 1,
|
||||
motionKey: null,
|
||||
status: 'ready',
|
||||
assetUrl:
|
||||
'/generated-big-fish-assets/big-fish-session-1/level-main-image/level-1/image.png',
|
||||
promptSnapshot: '深海荧光幼体',
|
||||
updatedAt: '2026-04-23T10:00:00.000Z',
|
||||
},
|
||||
{
|
||||
slotId: 'big-fish-asset-background',
|
||||
assetKind: 'stage_background',
|
||||
level: null,
|
||||
motionKey: null,
|
||||
status: 'ready',
|
||||
assetUrl:
|
||||
'/generated-big-fish-assets/big-fish-session-1/stage-background/image.png',
|
||||
promptSnapshot: '深海谜境背景',
|
||||
updatedAt: '2026-04-23T10:00:00.000Z',
|
||||
},
|
||||
],
|
||||
assetCoverage: {
|
||||
levelMainImageReadyCount: 1,
|
||||
levelMotionReadyCount: 0,
|
||||
backgroundReady: true,
|
||||
requiredLevelCount: 1,
|
||||
publishReady: false,
|
||||
blockers: ['还缺少 2 个基础动作'],
|
||||
},
|
||||
messages: [],
|
||||
lastAssistantReply: '主图占位图已生成。',
|
||||
publishReady: false,
|
||||
updatedAt: '2026-04-23T10:00:00.000Z',
|
||||
};
|
||||
}
|
||||
|
||||
describe('BigFishResultView', () => {
|
||||
test('renders generated formal previews with accurate status copy', () => {
|
||||
render(
|
||||
<BigFishResultView
|
||||
session={createSession()}
|
||||
onBack={() => {}}
|
||||
onExecuteAction={() => {}}
|
||||
onStartTestRun={() => {}}
|
||||
/>,
|
||||
);
|
||||
|
||||
expect(screen.getByText('主图 已生成')).toBeTruthy();
|
||||
expect(screen.getByAltText('荧潮幼体')).toBeTruthy();
|
||||
expect(screen.getByAltText('深海谜境 场地背景')).toBeTruthy();
|
||||
});
|
||||
|
||||
test('shows publish failures in a dismissible modal', () => {
|
||||
const onDismissError = vi.fn();
|
||||
|
||||
render(
|
||||
<BigFishResultView
|
||||
session={createSession()}
|
||||
error="big_fish 发布校验未通过:还缺少 16 个基础动作"
|
||||
onBack={() => {}}
|
||||
onDismissError={onDismissError}
|
||||
onExecuteAction={() => {}}
|
||||
onStartTestRun={() => {}}
|
||||
/>,
|
||||
);
|
||||
|
||||
expect(screen.getByRole('dialog')).toBeTruthy();
|
||||
expect(screen.getByText('发布失败')).toBeTruthy();
|
||||
expect(
|
||||
screen.getByText('big_fish 发布校验未通过:还缺少 16 个基础动作'),
|
||||
).toBeTruthy();
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: '知道了' }));
|
||||
expect(onDismissError).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user