| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- # -*- 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
|