dify/web/app/components/base/markdown-blocks/audio-block.spec.tsx

74 lines
2.4 KiB
TypeScript

import type { NamedExoticComponent } from 'react'
import { render, screen } from '@testing-library/react'
import * as React from 'react'
// AudioBlock.integration.spec.tsx
import { beforeEach, describe, expect, it, vi } from 'vitest'
import AudioBlock from './audio-block'
// Mock the nested AudioPlayer used by AudioGallery (do not mock AudioGallery itself)
const audioPlayerMock = vi.fn()
vi.mock('@/app/components/base/audio-gallery/AudioPlayer', () => ({
default: (props: { srcs: string[] }) => {
audioPlayerMock(props)
return <div data-testid="audio-player" data-srcs={JSON.stringify(props.srcs)} />
},
})) // adjust path if AudioBlock sits elsewhere
describe('AudioBlock (integration - real AudioGallery)', () => {
beforeEach(() => {
audioPlayerMock.mockClear()
})
it('renders AudioGallery with multiple srcs extracted from node.children', () => {
const node = {
children: [
{ properties: { src: 'one.mp3' } },
{ properties: { src: 'two.mp3' } },
{ type: 'text', value: 'plain' },
],
properties: {},
}
const { container } = render(<AudioBlock node={node} />)
const gallery = screen.getByTestId('audio-player')
expect(gallery).toBeInTheDocument()
expect(audioPlayerMock).toHaveBeenCalledTimes(1)
expect(audioPlayerMock).toHaveBeenCalledWith({ srcs: ['one.mp3', 'two.mp3'] })
expect(container.firstChild).not.toBeNull()
})
it('renders AudioGallery with single src from node.properties when no children with properties', () => {
const node = {
children: [{ type: 'text', value: 'no-src' }],
properties: { src: 'single.mp3' },
}
render(<AudioBlock node={node} />)
expect(audioPlayerMock).toHaveBeenCalledTimes(1)
expect(audioPlayerMock).toHaveBeenCalledWith({ srcs: ['single.mp3'] })
expect(screen.getByTestId('audio-player')).toBeInTheDocument()
})
it('returns null when there are no audio sources', () => {
const node = {
children: [{ type: 'text', value: 'nothing here' }],
properties: {},
}
const { container } = render(<AudioBlock node={node} />)
expect(container.firstChild).toBeNull()
expect(audioPlayerMock).not.toHaveBeenCalled()
})
it('has displayName set to AudioBlock', () => {
const component = AudioBlock as NamedExoticComponent<{ node: unknown }>
expect(component.displayName).toBe('AudioBlock')
})
})