From ecf9d14a4ef550f23d2ef869b369293f8c8cd26f Mon Sep 17 00:00:00 2001 From: Twirre Meulenbelt <43213592+TwirreM@users.noreply.github.com> Date: Mon, 9 Feb 2026 15:51:35 +0100 Subject: [PATCH] test: make audio sender tests pass --- test/unit/test_audio_sender.py | 51 ++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/test/unit/test_audio_sender.py b/test/unit/test_audio_sender.py index d9f9ac2..32f7d46 100644 --- a/test/unit/test_audio_sender.py +++ b/test/unit/test_audio_sender.py @@ -33,35 +33,33 @@ def test_no_microphone(zmq_context, mocker): mock_info_logger = mocker.patch("robot_interface.endpoints.audio_sender.logger.info") mock_choose_mic = mocker.patch("robot_interface.endpoints.audio_sender.choose_mic") mock_choose_mic.return_value = None + mock_state = mocker.patch("robot_interface.endpoints.audio_sender.state") + mock_state.qi_session = None sender = AudioSender(zmq_context) - assert sender.microphone is None + assert sender.capturer.microphone is None - sender.start() - assert sender.thread is None + sender.capturer.setup() mock_info_logger.assert_called() - sender.wait_until_done() # Should return early because we didn't start a thread - def test_unicode_mic_name(zmq_context, mocker): """ Tests the robustness of the `AudioSender` when handling microphone names that contain Unicode characters. """ - mocker.patch("robot_interface.endpoints.audio_sender.threading") mock_choose_mic = mocker.patch("robot_interface.endpoints.audio_sender.choose_mic") - mock_choose_mic.return_value = {"name": u"• Some Unicode name"} + mock_choose_mic.return_value = {"name": u"• Some Unicode name", "index": 0L} + mock_state = mocker.patch("robot_interface.endpoints.audio_sender.state") + mock_state.qi_session = None sender = AudioSender(zmq_context) - assert sender.microphone is not None + assert sender.capturer.microphone is not None + sender.capturer.audio.open = mock.Mock(return_value=mock.Mock()) - # `.start()` logs the name of the microphone. It should not give an error if it contains Unicode + # `.setup()` logs the name of the microphone. It should not give an error if it contains Unicode # symbols. - sender.start() - assert sender.thread is not None - - sender.wait_until_done() # Should return instantly because we didn't start a real thread + sender.capturer.setup() def _fake_read(num_frames): @@ -79,6 +77,7 @@ def test_sending_audio(mocker): mock_choose_mic.return_value = {"name": u"Some mic", "index": 0L} mock_state = mocker.patch("robot_interface.endpoints.audio_sender.state") + mock_state.qi_session = None mock_state.exit_event.is_set.side_effect = [False, True] mock_zmq_context = mock.Mock() @@ -91,11 +90,11 @@ def test_sending_audio(mocker): sender = AudioSender(mock_zmq_context) sender.socket.send = send_socket - sender.audio.open = mock.Mock() - sender.audio.open.return_value = stream + sender.capturer.audio.open = mock.Mock() + sender.capturer.audio.open.return_value = stream sender.start() - sender.wait_until_done() + sender.thread.join() send_socket.assert_called() @@ -108,6 +107,7 @@ def test_no_sending_if_speaking(mocker): mock_choose_mic.return_value = {"name": u"Some mic", "index": 0L} mock_state = mocker.patch("robot_interface.endpoints.audio_sender.state") + mock_state.qi_session = None mock_state.exit_event.is_set.side_effect = [False, True] mock_zmq_context = mock.Mock() @@ -121,11 +121,11 @@ def test_no_sending_if_speaking(mocker): sender = AudioSender(mock_zmq_context) sender.socket.send = send_socket - sender.audio.open = mock.Mock() - sender.audio.open.return_value = stream + sender.capturer.audio.open = mock.Mock() + sender.capturer.audio.open.return_value = stream sender.start() - sender.wait_until_done() + sender.thread.join() send_socket.assert_not_called() @@ -145,6 +145,7 @@ def test_break_microphone(mocker): mock_choose_mic.return_value = {"name": u"Some mic", "index": 0L} mock_state = mocker.patch("robot_interface.endpoints.audio_sender.state") + mock_state.qi_session = None mock_state.exit_event.is_set.side_effect = [False, True] mock_zmq_context = mock.Mock() @@ -156,11 +157,11 @@ def test_break_microphone(mocker): sender = AudioSender(mock_zmq_context) sender.socket.send = send_socket - sender.audio.open = mock.Mock() - sender.audio.open.return_value = stream + sender.capturer.audio.open = mock.Mock() + sender.capturer.audio.open.return_value = stream sender.start() - sender.wait_until_done() + sender.thread.join() send_socket.assert_not_called() @@ -171,6 +172,8 @@ def test_pyaudio_init_failure(mocker, zmq_context): """ # Prevent binding the ZMQ socket mocker.patch("robot_interface.endpoints.audio_sender.AudioSender.create_socket") + mock_state = mocker.patch("robot_interface.endpoints.audio_sender.state") + mock_state.qi_session = None # Simulate PyAudio() failing mocker.patch( @@ -180,5 +183,5 @@ def test_pyaudio_init_failure(mocker, zmq_context): sender = AudioSender(zmq_context) - assert sender.audio is None - assert sender.microphone is None + assert sender.capturer.audio is None + assert sender.capturer.microphone is None