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(); });