import * as React from 'react' import { createElement } from 'react' import { renderToStaticMarkup } from 'react-dom/server' import { describe, expect, it, vi } from 'vitest' import { NextIntlClientProvider } from 'next-intl' import type { AbstractIntlMessages } from 'next-intl' vi.mock('@/components/ui/icons', () => ({ AppIcon: () => createElement('span', null), })) vi.mock('@/components/task/TaskStatusOverlay', () => ({ default: () => createElement('div', null, 'overlay'), })) vi.mock('@/components/media/MediaImageWithLoading', () => ({ MediaImageWithLoading: (props: { containerClassName?: string; className?: string }) => createElement('div', { className: [props.containerClassName, props.className].filter(Boolean).join(' ') }), })) const messages = { assets: { common: { generateFailed: '生成失败', }, image: { optionNumber: '方案 {number}', }, }, } as const const TestIntlProvider = NextIntlClientProvider as React.ComponentType<{ locale: string messages: AbstractIntlMessages timeZone: string children?: React.ReactNode }> describe('CharacterCardGallery aspect ratio', () => { it('renders the single-image slot at a fixed 3:2 ratio', async () => { Reflect.set(globalThis, 'React', React) const { default: CharacterCardGallery } = await import('@/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/assets/character-card/CharacterCardGallery') const html = renderToStaticMarkup( createElement( TestIntlProvider, { locale: 'zh', messages: messages as unknown as AbstractIntlMessages, timeZone: 'Asia/Shanghai', }, createElement(CharacterCardGallery, { mode: 'single', characterName: '沈烬', changeReason: '默认形象', aspectClassName: 'aspect-[3/2]', currentImageUrl: null, selectedIndex: null, hasMultipleImages: false, isAppearanceTaskRunning: true, displayTaskPresentation: null, onImageClick: () => undefined, overlayActions: null, }), ), ) expect(html).toContain('aspect-[3/2]') }) })