# -*- coding: utf-8 -*- """ Tests für Media-Commands. Testet: - MusicPlayPause, MusicNext, MusicStop, etc. - MediaStopAll Command """ import pytest from dataclasses import is_dataclass from trixy_core.network.cmd import ( MusicPlayPause, MusicNext, MusicPrevious, MusicStop, MusicVolumeChange, MediaStopAll, MusicStatus, MusicStatusResponse, CommandMessage, ) # ============================================================================= # Tests für MusicPlayPause # ============================================================================= class TestMusicPlayPause: """Tests für MusicPlayPause Command.""" def test_is_dataclass(self): """Testet, dass MusicPlayPause ein Dataclass ist.""" assert is_dataclass(MusicPlayPause) def test_inherits_from_command_message(self): """Testet die Vererbung.""" assert issubclass(MusicPlayPause, CommandMessage) def test_default_values(self): """Testet die Standardwerte.""" cmd = MusicPlayPause() assert cmd.satellite_id == "" def test_custom_satellite_id(self): """Testet benutzerdefinierte satellite_id.""" cmd = MusicPlayPause(satellite_id="living-room") assert cmd.satellite_id == "living-room" # ============================================================================= # Tests für MusicNext # ============================================================================= class TestMusicNext: """Tests für MusicNext Command.""" def test_is_dataclass(self): """Testet, dass MusicNext ein Dataclass ist.""" assert is_dataclass(MusicNext) def test_inherits_from_command_message(self): """Testet die Vererbung.""" assert issubclass(MusicNext, CommandMessage) def test_default_values(self): """Testet die Standardwerte.""" cmd = MusicNext() assert cmd.satellite_id == "" assert cmd.use_crossfade is True def test_crossfade_disabled(self): """Testet Crossfade deaktiviert.""" cmd = MusicNext(use_crossfade=False) assert cmd.use_crossfade is False def test_with_satellite_id(self): """Testet mit satellite_id.""" cmd = MusicNext(satellite_id="bedroom", use_crossfade=True) assert cmd.satellite_id == "bedroom" assert cmd.use_crossfade is True # ============================================================================= # Tests für MusicPrevious # ============================================================================= class TestMusicPrevious: """Tests für MusicPrevious Command.""" def test_is_dataclass(self): """Testet, dass MusicPrevious ein Dataclass ist.""" assert is_dataclass(MusicPrevious) def test_default_values(self): """Testet die Standardwerte.""" cmd = MusicPrevious() assert cmd.satellite_id == "" assert cmd.use_crossfade is True # ============================================================================= # Tests für MusicStop # ============================================================================= class TestMusicStop: """Tests für MusicStop Command.""" def test_is_dataclass(self): """Testet, dass MusicStop ein Dataclass ist.""" assert is_dataclass(MusicStop) def test_inherits_from_command_message(self): """Testet die Vererbung.""" assert issubclass(MusicStop, CommandMessage) def test_default_values(self): """Testet die Standardwerte.""" cmd = MusicStop() assert cmd.satellite_id == "" # ============================================================================= # Tests für MusicVolumeChange # ============================================================================= class TestMusicVolumeChange: """Tests für MusicVolumeChange Command.""" def test_is_dataclass(self): """Testet, dass MusicVolumeChange ein Dataclass ist.""" assert is_dataclass(MusicVolumeChange) def test_default_values(self): """Testet die Standardwerte.""" cmd = MusicVolumeChange() assert cmd.satellite_id == "" assert cmd.volume == 1.0 assert cmd.relative is False def test_absolute_volume(self): """Testet absolute Lautstärke.""" cmd = MusicVolumeChange(volume=0.5, relative=False) assert cmd.volume == 0.5 assert cmd.relative is False def test_relative_volume(self): """Testet relative Lautstärkeänderung.""" cmd = MusicVolumeChange(volume=-0.1, relative=True) assert cmd.volume == -0.1 assert cmd.relative is True # ============================================================================= # Tests für MediaStopAll # ============================================================================= class TestMediaStopAll: """Tests für MediaStopAll Command.""" def test_is_dataclass(self): """Testet, dass MediaStopAll ein Dataclass ist.""" assert is_dataclass(MediaStopAll) def test_inherits_from_command_message(self): """Testet die Vererbung.""" assert issubclass(MediaStopAll, CommandMessage) def test_default_values(self): """Testet die Standardwerte.""" cmd = MediaStopAll() assert cmd.satellite_id == "" def test_with_satellite_id(self): """Testet mit satellite_id.""" cmd = MediaStopAll(satellite_id="kitchen") assert cmd.satellite_id == "kitchen" # ============================================================================= # Tests für MusicStatus # ============================================================================= class TestMusicStatus: """Tests für MusicStatus Command.""" def test_is_dataclass(self): """Testet, dass MusicStatus ein Dataclass ist.""" assert is_dataclass(MusicStatus) def test_default_values(self): """Testet die Standardwerte.""" cmd = MusicStatus() assert cmd.satellite_id == "" # ============================================================================= # Tests für MusicStatusResponse # ============================================================================= class TestMusicStatusResponse: """Tests für MusicStatusResponse Command.""" def test_is_dataclass(self): """Testet, dass MusicStatusResponse ein Dataclass ist.""" assert is_dataclass(MusicStatusResponse) def test_default_values(self): """Testet die Standardwerte.""" cmd = MusicStatusResponse() assert cmd.satellite_id == "" assert cmd.is_playing is False assert cmd.is_paused is False assert cmd.current_track == "" assert cmd.track_position_ms == 0 assert cmd.track_duration_ms == 0 assert cmd.playlist_index == 0 assert cmd.playlist_length == 0 assert cmd.volume == 1.0 def test_playing_state(self): """Testet Status bei laufender Wiedergabe.""" cmd = MusicStatusResponse( satellite_id="living-room", is_playing=True, is_paused=False, current_track="Artist - Song", track_position_ms=60000, track_duration_ms=180000, playlist_index=2, playlist_length=10, volume=0.8, ) assert cmd.is_playing is True assert cmd.is_paused is False assert cmd.current_track == "Artist - Song" assert cmd.track_position_ms == 60000 assert cmd.volume == 0.8 def test_paused_state(self): """Testet Status bei pausierter Wiedergabe.""" cmd = MusicStatusResponse( is_playing=False, is_paused=True, ) assert cmd.is_playing is False assert cmd.is_paused is True # ============================================================================= # Tests für Command-Serialisierung (Pickle-Kompatibilität) # ============================================================================= class TestMediaCommandSerialization: """Tests für Serialisierung der Media-Commands.""" def test_pickle_music_play_pause(self): """Testet Pickle-Serialisierung von MusicPlayPause.""" import pickle cmd = MusicPlayPause(satellite_id="test") data = pickle.dumps(cmd) restored = pickle.loads(data) assert restored.satellite_id == "test" def test_pickle_music_next(self): """Testet Pickle-Serialisierung von MusicNext.""" import pickle cmd = MusicNext(satellite_id="test", use_crossfade=False) data = pickle.dumps(cmd) restored = pickle.loads(data) assert restored.satellite_id == "test" assert restored.use_crossfade is False def test_pickle_media_stop_all(self): """Testet Pickle-Serialisierung von MediaStopAll.""" import pickle cmd = MediaStopAll(satellite_id="test") data = pickle.dumps(cmd) restored = pickle.loads(data) assert restored.satellite_id == "test" def test_pickle_music_status_response(self): """Testet Pickle-Serialisierung von MusicStatusResponse.""" import pickle cmd = MusicStatusResponse( satellite_id="test", is_playing=True, current_track="Test Track", volume=0.5, ) data = pickle.dumps(cmd) restored = pickle.loads(data) assert restored.satellite_id == "test" assert restored.is_playing is True assert restored.current_track == "Test Track" assert restored.volume == 0.5