from solo_tool.session_manager import loadSession, saveSession from json import loads, dumps import pytest testSession = [ { "path" : "/path/to/another/song", "ab_limits" : None }, { "path" : "/path/to/song", "ab_limits" : [ [0.1, 0.2], [0.3, 0.4] ] }, { "path" : "/path/to/something", "ab_limits" : [ [0.1, 0.2] ] } ] class ABControllerMock: def __init__(self): self.limits = dict() def storeLimits(self, aLimit, bLimit, song="current"): if song not in self.limits: self.limits[song] = list() self.limits[song].append([aLimit, bLimit]) def getStoredLimits(self, song): return self.limits.get(song) def clear(self): self.__init__() class MockFile: def __init__(self, init=""): self.contents = init def open(self, *args): pass def write(self, s): self.contents += s def read(self): return self.contents @pytest.fixture def songListMock(): return [] @pytest.fixture def abControllerMock(): return ABControllerMock() def test_loadSession(songListMock, abControllerMock): sessionFile = MockFile(dumps(testSession)) loadSession(sessionFile, songListMock, abControllerMock) for i, entry in enumerate(testSession): expectedSong = entry["path"] expectedLimits = entry["ab_limits"] loadedSong = songListMock[i] loadedLimits = abControllerMock.limits.get(expectedSong) assert loadedSong == expectedSong assert loadedLimits == expectedLimits def test_saveSession(songListMock, abControllerMock): for i, entry in enumerate(testSession): song = entry["path"] songListMock.append(song) abLimits = entry["ab_limits"] if abLimits is not None: for l in abLimits: abControllerMock.storeLimits(l[0], l[1], song) sessionFile = MockFile() saveSession(sessionFile, songListMock, abControllerMock) savedSession = loads(sessionFile.read()) assert savedSession == testSession def test_loadAndSaveEmptySession(songListMock, abControllerMock): sessionFile = MockFile() saveSession(sessionFile, songListMock, abControllerMock) assert loads(sessionFile.read()) == list() loadSession(sessionFile, songListMock, abControllerMock) assert songListMock == list() for s in songListMock: assert abControllerMock.getStoredLimits(s) == None def test_loadSessionNotAdditive(songListMock, abControllerMock): sessionFile = MockFile(dumps(testSession)) loadSession(sessionFile, songListMock, abControllerMock) loadSession(sessionFile, songListMock, abControllerMock) songs = songListMock assert len(songs) == len(set(songs)) for s in songs: abLimits = abControllerMock.getStoredLimits(s) if abLimits is not None: abLimitStr = [f"[{l[0]}, {l[1]}] " for l in abLimits] assert len(abLimitStr) == len(set(abLimitStr))