122 lines
3.6 KiB
TypeScript
122 lines
3.6 KiB
TypeScript
import { expect, test } from 'vitest';
|
|
|
|
import type { CustomWorldAgentSessionSnapshot } from '../../../packages/shared/src/contracts/customWorldAgent';
|
|
import {
|
|
buildRpgCreationPreviewFromResultPreview,
|
|
buildRpgCreationPreviewFromSession,
|
|
} from './rpgCreationPreviewAdapter';
|
|
|
|
const sessionWithPreview: CustomWorldAgentSessionSnapshot = {
|
|
sessionId: 'session-preview-1',
|
|
currentTurn: 3,
|
|
anchorContent: {
|
|
worldPromise: null,
|
|
playerFantasy: null,
|
|
themeBoundary: null,
|
|
playerEntryPoint: null,
|
|
coreConflict: null,
|
|
keyRelationships: [],
|
|
hiddenLines: null,
|
|
iconicElements: null,
|
|
},
|
|
progressPercent: 100,
|
|
lastAssistantReply: '第一版世界底稿已经准备好了。',
|
|
stage: 'object_refining',
|
|
focusCardId: null,
|
|
creatorIntent: null,
|
|
creatorIntentReadiness: {
|
|
isReady: true,
|
|
completedKeys: [],
|
|
missingKeys: [],
|
|
},
|
|
anchorPack: null,
|
|
lockState: null,
|
|
draftProfile: {
|
|
name: '只作为 fallback 的本地草稿名',
|
|
subtitle: 'fallback',
|
|
summary: 'fallback',
|
|
tone: 'fallback',
|
|
playerGoal: 'fallback',
|
|
playableNpcs: [],
|
|
storyNpcs: [],
|
|
landmarks: [],
|
|
},
|
|
messages: [],
|
|
draftCards: [
|
|
{
|
|
id: 'world-foundation',
|
|
kind: 'world',
|
|
title: '世界底稿',
|
|
subtitle: '阶段三预览',
|
|
summary: '测试服务端 result preview 优先级。',
|
|
status: 'warning',
|
|
linkedIds: [],
|
|
warningCount: 0,
|
|
},
|
|
],
|
|
pendingClarifications: [],
|
|
suggestedActions: [],
|
|
recommendedReplies: [],
|
|
qualityFindings: [],
|
|
assetCoverage: {
|
|
roleAssets: [],
|
|
sceneAssets: [],
|
|
allRoleAssetsReady: false,
|
|
allSceneAssetsReady: false,
|
|
},
|
|
resultPreview: {
|
|
source: 'session_preview',
|
|
preview: {
|
|
id: 'preview-profile-1',
|
|
settingText: '被海雾吞没的旧航路群岛',
|
|
name: '服务端结果预览',
|
|
subtitle: '优先于前端 fallback',
|
|
summary: '结果页应该优先消费 session.resultPreview。',
|
|
tone: '压抑、潮湿、悬疑',
|
|
playerGoal: '查清沉船与禁航区异动的真相。',
|
|
templateWorldType: 'WUXIA',
|
|
majorFactions: ['守灯会', '航运公会'],
|
|
coreConflicts: ['守灯会与航运公会争夺旧航路控制权'],
|
|
playableNpcs: [],
|
|
storyNpcs: [],
|
|
items: [],
|
|
landmarks: [],
|
|
generationMode: 'full',
|
|
generationStatus: 'complete',
|
|
sessionId: 'session-preview-1',
|
|
},
|
|
generatedAt: '2026-04-21T10:00:00.000Z',
|
|
qualityFindings: [],
|
|
blockers: [],
|
|
},
|
|
updatedAt: '2026-04-21T10:00:00.000Z',
|
|
};
|
|
|
|
test('buildRpgCreationPreviewFromResultPreview normalizes server preview envelope', () => {
|
|
const profile = buildRpgCreationPreviewFromResultPreview(
|
|
sessionWithPreview.resultPreview,
|
|
);
|
|
|
|
expect(profile?.name).toBe('服务端结果预览');
|
|
expect(profile?.subtitle).toBe('优先于前端 fallback');
|
|
expect(profile?.id).toBe('preview-profile-1');
|
|
expect(profile?.settingText).toBe('被海雾吞没的旧航路群岛');
|
|
});
|
|
|
|
test('buildRpgCreationPreviewFromSession prefers server resultPreview over draft fallback', () => {
|
|
const profile = buildRpgCreationPreviewFromSession(sessionWithPreview);
|
|
|
|
expect(profile?.name).toBe('服务端结果预览');
|
|
expect(profile?.name).not.toBe('只作为 fallback 的本地草稿名');
|
|
expect(profile?.summary).toBe('结果页应该优先消费 session.resultPreview。');
|
|
});
|
|
|
|
test('buildRpgCreationPreviewFromSession returns null when server resultPreview is missing', () => {
|
|
const profile = buildRpgCreationPreviewFromSession({
|
|
...sessionWithPreview,
|
|
resultPreview: null,
|
|
});
|
|
|
|
expect(profile).toBeNull();
|
|
});
|