149 lines
7.0 KiB
Python
149 lines
7.0 KiB
Python
# Copyright 2022 (c) Anna Schumaker.
|
|
"""Tests our user & system playlists section."""
|
|
import emmental.sidebar.playlist
|
|
import tests.util
|
|
import unittest.mock
|
|
from gi.repository import Gtk
|
|
|
|
|
|
class TestPlaylists(tests.util.TestCase):
|
|
"""Test our Playlists section."""
|
|
|
|
def setUp(self):
|
|
"""Set up common variables."""
|
|
super().setUp()
|
|
self.playlists = emmental.sidebar.playlist.Section(self.sql.playlists)
|
|
self.sql.playlists.queue.enabled = False
|
|
|
|
def test_attributes(self):
|
|
"""Test playlist name -> attribute mapping."""
|
|
self.assertListEqual(emmental.sidebar.playlist.ATTR_NAMES,
|
|
["icon_name", "activatable", "modifiable"])
|
|
self.assertDictEqual(emmental.sidebar.playlist.PLAYLIST_ATTRS,
|
|
{"Collection":
|
|
("library-music", True, False),
|
|
"Favorite Tracks":
|
|
("heart-filled", True, False),
|
|
"Most Played Tracks":
|
|
("right-large", True, False),
|
|
"New Tracks":
|
|
("music-note-single", True, False),
|
|
"Previous Tracks":
|
|
("media-skip-backward", False, False),
|
|
"Queued Tracks":
|
|
("music-queue", True, False),
|
|
"Unplayed Tracks":
|
|
("circle-outline-thick", True, False)})
|
|
self.assertEqual(emmental.sidebar.playlist.FALLBACK_ATTR,
|
|
("playlist2", True, True))
|
|
|
|
def test_init(self):
|
|
"""Test that the playlists section is set up correctly."""
|
|
self.assertIsInstance(self.playlists, emmental.sidebar.section.Section)
|
|
self.assertEqual(self.playlists.table, self.sql.playlists)
|
|
self.assertEqual(self.playlists.title, "Playlists")
|
|
self.assertEqual(self.playlists.icon_name, "playlist2")
|
|
self.assertEqual(self.playlists._factory.row_type,
|
|
emmental.sidebar.playlist.PlaylistRow)
|
|
|
|
def test_extra_widget(self):
|
|
"""Test the playlist section extra widget."""
|
|
self.assertIsInstance(self.playlists.extra_widget,
|
|
emmental.buttons.PopoverButton)
|
|
self.assertEqual(self.playlists.extra_widget.get_icon_name(),
|
|
"document-new")
|
|
self.assertEqual(self.playlists.extra_widget.get_tooltip_text(),
|
|
"add new playlist")
|
|
self.assertEqual(self.playlists.extra_widget.popover_child,
|
|
self.playlists._entry)
|
|
self.assertFalse(self.playlists.extra_widget.get_has_frame())
|
|
|
|
def test_entry(self):
|
|
"""Test activating the entry."""
|
|
self.assertIsInstance(self.playlists._entry, Gtk.Entry)
|
|
self.assertEqual(self.playlists._entry.get_placeholder_text(),
|
|
"add new playlist")
|
|
self.assertEqual(self.playlists._entry.get_icon_name(
|
|
Gtk.EntryIconPosition.PRIMARY), "list-add")
|
|
self.assertIsNone(self.playlists._entry.get_icon_name(
|
|
Gtk.EntryIconPosition.SECONDARY))
|
|
self.assertTrue(self.playlists._entry.has_css_class("card"))
|
|
|
|
with unittest.mock.patch.object(self.playlists.extra_widget,
|
|
"popdown") as mock_popdown:
|
|
with unittest.mock.patch.object(self.sql, "commit") as mock_commit:
|
|
self.playlists._entry.emit("activate")
|
|
self.assertEqual(len(self.sql.playlists), 0)
|
|
mock_popdown.assert_not_called()
|
|
mock_commit.assert_not_called()
|
|
|
|
self.playlists._entry.set_text("Test 1")
|
|
self.playlists._entry.emit("activate")
|
|
self.assertEqual(len(self.sql.playlists), 1)
|
|
self.assertEqual(self.sql.playlists.get_item(0).name, "Test 1")
|
|
mock_popdown.assert_called()
|
|
mock_commit.assert_called()
|
|
|
|
mock_popdown.reset_mock()
|
|
mock_commit.reset_mock()
|
|
self.playlists._entry.set_text("Test 2")
|
|
self.playlists._entry.emit("icon-release",
|
|
Gtk.EntryIconPosition.PRIMARY)
|
|
self.assertEqual(len(self.sql.playlists), 2)
|
|
self.assertEqual(self.sql.playlists.get_item(1).name, "Test 2")
|
|
mock_popdown.assert_called()
|
|
mock_commit.assert_called()
|
|
|
|
self.playlists._entry.set_text("Test 3")
|
|
self.assertEqual(self.playlists._entry.get_icon_name(
|
|
Gtk.EntryIconPosition.SECONDARY),
|
|
"edit-clear-symbolic")
|
|
self.playlists._entry.emit("icon-release",
|
|
Gtk.EntryIconPosition.SECONDARY)
|
|
self.assertEqual(self.playlists._entry.get_text(), "")
|
|
self.assertIsNone(self.playlists._entry.get_icon_name(
|
|
Gtk.EntryIconPosition.SECONDARY))
|
|
|
|
def test_bind_playlists(self):
|
|
"""Test binding to system playlists."""
|
|
playlist = self.sql.playlists.create("Test Playlist")
|
|
playlist.image = tests.util.COVER_JPG
|
|
treeitem = Gtk.TreeListRow()
|
|
listitem = Gtk.ListItem()
|
|
listitem.get_item = unittest.mock.Mock(return_value=treeitem)
|
|
row = emmental.sidebar.playlist.PlaylistRow(listitem)
|
|
|
|
self.assertIsInstance(row.child, emmental.sidebar.row.PlaylistRow)
|
|
self.assertFalse(row.indented)
|
|
|
|
self.sql.playlists.load()
|
|
fallback = emmental.sidebar.playlist.FALLBACK_ATTR
|
|
for name in ["Collection", "Favorite Tracks", "New Tracks",
|
|
"Previous Tracks", "Queued Tracks", "Test Playlist"]:
|
|
attr = emmental.sidebar.playlist.PLAYLIST_ATTRS.get(name, fallback)
|
|
playlist = self.sql.playlists.lookup(name)
|
|
treeitem.get_item = unittest.mock.Mock(return_value=playlist)
|
|
|
|
with self.subTest(name=name):
|
|
row.bind()
|
|
self.assertEqual(row.child.playlist, playlist)
|
|
self.assertEqual(row.child.name, name)
|
|
self.assertEqual(row.child.filepath, playlist.image)
|
|
self.assertEqual(row.child.icon_name,
|
|
f"{attr.icon_name}-symbolic")
|
|
self.assertEqual(listitem.get_activatable(), attr.activatable)
|
|
self.assertEqual(row.child.modifiable, attr.modifiable)
|
|
|
|
if name == "Test Playlist":
|
|
row.child._icon.filepath = None
|
|
self.assertIsNone(playlist.image)
|
|
row.unbind()
|
|
|
|
def test_subtitle(self):
|
|
"""Test that the subtitle is set properly."""
|
|
self.assertEqual(self.playlists.subtitle, "0 playlists")
|
|
self.sql.playlists.create("Test Playlist")
|
|
self.assertEqual(self.playlists.subtitle, "1 playlist")
|
|
self.sql.playlists.load()
|
|
self.assertEqual(self.playlists.subtitle, "8 playlists")
|