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() with ( mock.patch.object( sound_helper.Gst.ElementFactory, "make", return_value=fakePlaybin, ) as makeElement, mock.patch.object( sound_helper.sound_sink, "create_audio_sink", ) as createAudioSink, ): player, sinkName, error = sound_helper._create_file_player("worker-file", settings.SOUND_SINK_AUTO) self.assertIs(player, fakePlaybin) self.assertEqual(sinkName, "playbin-default") self.assertIsNone(error) createAudioSink.assert_not_called() makeElement.assert_called_once_with("playbin", "worker-file") self.assertNotIn("audio-sink", fakePlaybin.properties) def test_create_file_player_sets_explicit_sink_when_requested(self): fakePlaybin = _FakePlaybin() fakeSink = object() with ( mock.patch.object( sound_helper.Gst.ElementFactory, "make", return_value=fakePlaybin, ) as makeElement, mock.patch.object( sound_helper.sound_sink, "create_audio_sink", return_value=(fakeSink, "pulsesink", None), ) as createAudioSink, ): player, sinkName, error = sound_helper._create_file_player("worker-file", settings.SOUND_SINK_PULSE) self.assertIs(player, fakePlaybin) self.assertEqual(sinkName, "pulsesink") self.assertIsNone(error) makeElement.assert_called_once_with("playbin", "worker-file") createAudioSink.assert_called_once() self.assertIs(fakePlaybin.properties["audio-sink"], fakeSink) if __name__ == "__main__": unittest.main()