import pathlib import shutil import pytest from solo_tool.solo_tool import SoloTool from player_mock import Player as MockPlayer @pytest.fixture def mockPlayer(): return MockPlayer() @pytest.fixture def uut(mockPlayer): return SoloTool(player=mockPlayer) @pytest.fixture def testSongs(): return [ "test.flac", "test.mp3" ] def test_songSelectionFlow(uut, mockPlayer, testSongs): # Initially, song list is empty and no song is selected assert uut.song is None assert mockPlayer.currentSong == None assert uut.songs == [] # When the first song is added, it is selected automatically uut.addSong(testSongs[0]) assert uut.song == 0 assert mockPlayer.currentSong == testSongs[0] assert uut.songs == testSongs[0:1] # Subsequently added songs are not selected automatically # Song list order is addition order for i, song in enumerate(testSongs[1:]): uut.addSong(testSongs[1]) assert uut.song == 0 assert mockPlayer.currentSong == testSongs[0] assert uut.songs == testSongs[0:i + 2] # Songs are selected by index for i, s in enumerate(uut.songs): uut.song = i assert uut.song == i assert mockPlayer.currentSong == uut.songs[i] def test_songSelectionSanitization(uut, mockPlayer, testSongs): for song in testSongs: uut.addSong(song) # Modifying the song list directly has no effect uut.songs.append("something") assert uut.songs == testSongs assert mockPlayer.currentSong == testSongs[0] # The current song cannot be de-selected uut.song = None assert uut.song == 0 assert mockPlayer.currentSong == testSongs[0] # Non-existent songs cannot be selected uut.song = -1 assert uut.song == 0 assert mockPlayer.currentSong == testSongs[0] uut.song = len(testSongs) assert uut.song == 0 assert mockPlayer.currentSong == testSongs[0] def test_addInexistentSong(uut, mockPlayer): # Songs must exist in the filesystem song = "not/a/real/file" with pytest.raises(FileNotFoundError): uut.addSong(song) assert uut.songs == [] assert uut.song is None def test_songSelectionNotification(uut, testSongs): called = False receivedValue = None def callback(value): nonlocal called, receivedValue called = True receivedValue = value uut.registerSongSelectionCallback(callback) assert not called # Adding the first song triggers because the song is automatically selected uut.addSong(songs[0]) assert called assert receivedValue == 0 called = False # Adding more songs does not trigger since the selection doesn't change for song in testSongs: uut.addSong(song) assert not called # Selecting another song triggers uut.song = 1 assert called assert receivedValue == 1 called = False # Selecting the currently selected song does not trigger uut.song = 1 assert not called