# 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")