Files
waooplus/tests/unit/components/long-text-detection-prompt.test.ts

73 lines
2.4 KiB
TypeScript

import * as React from 'react'
import { createElement } from 'react'
import { renderToStaticMarkup } from 'react-dom/server'
import { afterEach, describe, expect, it, vi } from 'vitest'
import LongTextDetectionPrompt from '@/components/story-input/LongTextDetectionPrompt'
const portalMocks = vi.hoisted(() => {
return {
currentPortalTarget: null as unknown,
createPortalMock: vi.fn((node: React.ReactNode, target: unknown) => {
const targetLabel = target === portalMocks.currentPortalTarget ? 'body' : 'unknown'
return createElement('div', { 'data-portal-target': targetLabel }, node)
}),
}
})
vi.mock('react-dom', async () => {
const actual = await vi.importActual<typeof import('react-dom')>('react-dom')
return {
...actual,
createPortal: portalMocks.createPortalMock,
}
})
vi.mock('@/components/ui/icons', () => ({
AppIcon: ({ name, className }: { name: string; className?: string }) =>
createElement('span', { 'data-icon': name, className }),
}))
describe('LongTextDetectionPrompt', () => {
afterEach(() => {
vi.clearAllMocks()
portalMocks.currentPortalTarget = null
Reflect.deleteProperty(globalThis, 'React')
Reflect.deleteProperty(globalThis, 'document')
})
it('renders through document.body at modal layer without the removed gradient border wrapper', () => {
const fakeDocument = {
body: { nodeName: 'BODY' },
}
Reflect.set(globalThis, 'React', React)
Reflect.set(globalThis, 'document', fakeDocument)
portalMocks.currentPortalTarget = fakeDocument.body
const html = renderToStaticMarkup(
createElement(LongTextDetectionPrompt, {
open: true,
copy: {
title: '建议使用智能分集',
description: '检测到文本较长',
strongRecommend: '建议拆分',
smartSplitLabel: '智能分集',
smartSplitBadge: '推荐',
continueLabel: '仍然单集创作',
continueHint: '单集模式',
},
onClose: () => undefined,
onSmartSplit: () => undefined,
onContinue: () => undefined,
}),
)
expect(portalMocks.createPortalMock).toHaveBeenCalledTimes(1)
expect(portalMocks.createPortalMock.mock.calls[0]?.[1]).toBe(fakeDocument.body)
expect(html).toContain('data-portal-target="body"')
expect(html).toContain('z-[120]')
expect(html).toContain('border-[var(--glass-stroke-base)]')
expect(html).not.toContain('p-[1.5px]')
})
})