import sys import unittest from pathlib import Path from unittest import mock sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) from cthulhu import settings from cthulhu import sound_helper class _FakePlaybin: def __init__(self): self.properties = {} def set_property(self, name, value): self.properties[name] = value class SoundHelperBackendTests(unittest.TestCase): def test_create_file_player_uses_playbin_default_sink_for_auto(self): fakePlaybin = _FakePlaybin() fakePanorama = object() with ( mock.patch.object( sound_helper.Gst.ElementFactory, "make", side_effect=[fakePlaybin, fakePanorama], ) as makeElement, mock.patch.object( sound_helper.sound_sink, "create_audio_sink", ) as createAudioSink, ): player, panorama, sinkName, error = sound_helper._create_file_player( "worker-file", settings.SOUND_SINK_AUTO, ) self.assertIs(player, fakePlaybin) self.assertIs(panorama, fakePanorama) self.assertEqual(sinkName, "playbin-default") self.assertIsNone(error) createAudioSink.assert_not_called() makeElement.assert_has_calls( [ mock.call("playbin", "worker-file"), mock.call("audiopanorama", "worker-file-panorama"), ] ) self.assertNotIn("audio-sink", fakePlaybin.properties) self.assertIs(fakePlaybin.properties["audio-filter"], fakePanorama) def test_create_file_player_sets_explicit_sink_when_requested(self): fakePlaybin = _FakePlaybin() fakePanorama = object() fakeSink = object() with ( mock.patch.object( sound_helper.Gst.ElementFactory, "make", side_effect=[fakePlaybin, fakePanorama], ) as makeElement, mock.patch.object( sound_helper.sound_sink, "create_audio_sink", return_value=(fakeSink, "pulsesink", None), ) as createAudioSink, ): player, panorama, sinkName, error = sound_helper._create_file_player( "worker-file", settings.SOUND_SINK_PULSE, ) self.assertIs(player, fakePlaybin) self.assertIs(panorama, fakePanorama) self.assertEqual(sinkName, "pulsesink") self.assertIsNone(error) makeElement.assert_has_calls( [ mock.call("playbin", "worker-file"), mock.call("audiopanorama", "worker-file-panorama"), ] ) createAudioSink.assert_called_once() self.assertIs(fakePlaybin.properties["audio-sink"], fakeSink) self.assertIs(fakePlaybin.properties["audio-filter"], fakePanorama) if __name__ == "__main__": unittest.main()