import { renderHook } from '@testing-library/react-hooks'; import useAudio from '../src/useAudio'; const setUp = ( src: string = 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3', autoPlay: boolean = true ) => renderHook(() => useAudio({ src, autoPlay })); it('should init audio and utils', () => { global.console.error = jest.fn(); const MOCK_AUDIO_SRC = 'MOCK_AUDIO_SRC'; const MOCK_AUTO_PLAY_STATE = true; const { result } = setUp(MOCK_AUDIO_SRC, MOCK_AUTO_PLAY_STATE); const [audio, state, controls, ref] = result.current; // if not production mode, it will show the error message, cause audio do not render expect(console.error).toHaveBeenCalledTimes(1); // Test the audio comp expect(audio.type).toBe('audio'); expect(audio.props.src).toBe(MOCK_AUDIO_SRC); expect(audio.props.autoPlay).toBe(MOCK_AUTO_PLAY_STATE); // Test state value expect(state.time).toBe(0); expect(state.paused).toBe(true); expect(state.playing).toBe(false); expect(state.muted).toBe(false); expect(state.volume).toBe(1); // Test controls ref.current = document.createElement('audio'); // Mock ref current for controls testing expect(ref.current.muted).toBe(false); controls.mute(); expect(ref.current.muted).toBe(true); controls.unmute(); expect(ref.current.muted).toBe(false); expect(ref.current.volume).toBe(1); controls.volume(0.5); expect(ref.current.volume).toBe(0.5); });