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
}, })) // 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() 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() 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() 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') }) })