feat: restore the last queue per server
This commit is contained in:
18 files changed
+237
-3
No files matched your search
@@ -24,6 +24,7 @@ EXPECTED_ENDPOINTS = {
|
||||
("post", "/api/jump"),
|
||||
("post", "/api/remove"),
|
||||
("post", "/api/reorder"),
|
||||
("post", "/api/queue/restore"),
|
||||
("post", "/api/queue/plays"),
|
||||
("get", "/api/uploads"),
|
||||
("post", "/api/upload"),
|
||||
|
||||
@@ -30,6 +30,24 @@ class HistoryRepositoryTest(unittest.TestCase):
|
||||
self.assertTrue((Path(directory) / "history" / "10.json").exists())
|
||||
self.assertFalse((Path(directory) / "history" / "20.json").exists())
|
||||
|
||||
def test_new_entries_are_available_after_repository_reload(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
store = JsonFileStore(str(Path(directory) / "history.json"))
|
||||
entry = HistoryEntry(
|
||||
id="track-2",
|
||||
title="Another track",
|
||||
url="https://example.test/another-track",
|
||||
)
|
||||
|
||||
HistoryRepository(store).add(42, entry)
|
||||
|
||||
reloaded = HistoryRepository(store)
|
||||
self.assertEqual(reloaded.list(42), [entry])
|
||||
persisted = json.loads(
|
||||
(Path(directory) / "history" / "42.json").read_text(encoding="utf-8")
|
||||
)
|
||||
self.assertEqual(persisted["entries"][0]["id"], "track-2")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -2,10 +2,13 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from tests.fakes import FakeTrack, build_player
|
||||
from zyrarbot.music.loop_mode import LoopMode
|
||||
from zyrarbot.storage.queue_repository import QueueRepository
|
||||
|
||||
GUILD = 1
|
||||
|
||||
@@ -177,6 +180,31 @@ class MusicPlayerQueueTest(unittest.IsolatedAsyncioTestCase):
|
||||
|
||||
self.assertIsNone(state.current)
|
||||
|
||||
async def test_restore_replaces_active_queue_without_old_callback_interference(self):
|
||||
player, voice_client = build_player()
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
player._queues = QueueRepository(directory)
|
||||
player._queues.save(
|
||||
GUILD,
|
||||
[{"id": "restored", "title": "Restored", "plays_left": 3}],
|
||||
)
|
||||
|
||||
async def from_url(url, loop=None):
|
||||
return FakeTrack("restored")
|
||||
|
||||
player._tracks.from_url = from_url
|
||||
await player.enqueue(GUILD, FakeTrack("old"))
|
||||
old_callback = voice_client.after
|
||||
|
||||
count = await player.restore_queue(GUILD)
|
||||
|
||||
self.assertEqual(count, 1)
|
||||
self.assertEqual([track.id for track in player.state(GUILD).queue], ["restored"])
|
||||
self.assertIs(player.state(GUILD).current, player.state(GUILD).queue[0])
|
||||
old_callback(None)
|
||||
await asyncio.sleep(0)
|
||||
self.assertEqual([track.id for track in player.state(GUILD).queue], ["restored"])
|
||||
|
||||
|
||||
class LoopModeTest(unittest.TestCase):
|
||||
def test_cycle_order(self):
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
from zyrarbot.storage.queue_repository import QueueRepository
|
||||
|
||||
|
||||
class QueueRepositoryTest(unittest.TestCase):
|
||||
def test_snapshots_are_isolated_per_guild(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
repository = QueueRepository(directory)
|
||||
first = [{"id": "first", "title": "First", "plays_left": 2}]
|
||||
second = [{"id": "second", "title": "Second", "plays_left": 4}]
|
||||
|
||||
repository.save(10, first)
|
||||
repository.save(20, second)
|
||||
|
||||
self.assertEqual(repository.load(10), first)
|
||||
self.assertEqual(repository.load(20), second)
|
||||
self.assertTrue((Path(directory) / "10.json").exists())
|
||||
self.assertTrue((Path(directory) / "20.json").exists())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user