emmental/tests/sidebar/test_row.py

368 lines
15 KiB
Python

# Copyright 2022 (c) Anna Schumaker.
"""Tests our sidebar row widgets."""
import unittest
import tests.util
import emmental.sidebar.icon
import emmental.sidebar.row
from gi.repository import Gio
from gi.repository import Gtk
from gi.repository import Adw
class TestBaseRow(unittest.TestCase):
"""Test our BaseRow class."""
def setUp(self):
"""Set up common variables."""
self.row = emmental.sidebar.row.BaseRow()
def test_init(self):
"""Test that the BaseRow is configured correctly."""
self.assertIsInstance(self.row, Gtk.Box)
self.assertEqual(self.row.get_orientation(),
Gtk.Orientation.HORIZONTAL)
def test_name(self):
"""Test the name property."""
self.assertEqual(self.row.name, "")
row2 = emmental.sidebar.row.BaseRow(name="Test Playlist")
self.assertEqual(row2.name, "Test Playlist")
def test_count(self):
"""Test the count property."""
self.assertEqual(self.row.count, 0)
row2 = emmental.sidebar.row.BaseRow(count=42)
self.assertEqual(row2.count, 42)
def test_playlist(self):
"""Test the playlist property."""
plist = emmental.db.playlist.Playlist(Gio.ListStore(),
0, "Playlist Name")
self.assertIsNone(self.row.playlist)
row2 = emmental.sidebar.row.BaseRow(playlist=plist)
self.assertEqual(row2.playlist, plist)
class TestRow(unittest.TestCase):
"""Test a playlist Row."""
def setUp(self):
"""Set up common variables."""
self.row = emmental.sidebar.row.Row()
def test_init(self):
"""Test that the Row is configured correctly."""
self.assertIsInstance(self.row, emmental.sidebar.row.BaseRow)
self.assertEqual(self.row.get_spacing(), 12)
def test_image(self):
"""Test the image property and icon widget."""
self.assertIsInstance(self.row._icon, emmental.sidebar.icon.Icon)
self.assertEqual(self.row.get_first_child(), self.row._icon)
self.assertIsNone(self.row.image)
self.assertIsNone(self.row._icon.filepath)
self.assertTrue(self.row._icon.show_initials)
self.row.image = tests.util.COVER_JPG
self.assertEqual(self.row._icon.filepath, tests.util.COVER_JPG)
def test_name(self):
"""Test the name property and title widgets."""
self.assertIsInstance(self.row._title,
emmental.sidebar.title.PlaylistTitle)
self.assertEqual(self.row._icon.get_next_sibling(), self.row._title)
self.row.name = "Test Playlist"
self.assertEqual(self.row._title.title, "Test Playlist")
self.assertEqual(self.row._icon.text, "Test Playlist")
def test_count(self):
"""Test the count property."""
self.assertEqual(self.row.count, 0)
self.assertEqual(self.row._title.count, 0)
self.row.count = 1
self.assertEqual(self.row._title.count, 1)
def test_year(self):
"""Test setting a year as the icon text."""
self.assertIsNone(self.row.year)
self.row.year = 1985
self.assertEqual(self.row._icon.text, "8 5")
self.row.year = 1988
self.assertEqual(self.row._icon.text, "8 8")
self.row.year = 2000
self.assertEqual(self.row._icon.text, "0 0")
class TestPlaylistRow(unittest.TestCase):
"""Test our playlist row with extra buttons."""
def setUp(self):
"""Set up common variables."""
self.row = emmental.sidebar.row.PlaylistRow()
self.playlist = emmental.db.playlists.Playlist(table=Gio.ListStore(),
propertyid=12345,
playlistid=67890,
name="Test Playlist")
def test_init(self):
"""Test that the playlist row is configured properly."""
self.assertIsInstance(self.row, emmental.sidebar.row.BaseRow)
def test_icon(self):
"""Test the settable icon widget and properties."""
self.assertIsInstance(self.row._icon, emmental.sidebar.icon.Settable)
self.assertEqual(self.row.get_first_child(), self.row._icon)
self.row.name = "Test Playlist"
self.row.icon_name = "image-missing"
self.row.filepath = tests.util.COVER_JPG
self.assertEqual(self.row._icon.text, "Test Playlist")
self.assertEqual(self.row._icon.icon_name, "image-missing")
self.assertEqual(self.row._icon.filepath, tests.util.COVER_JPG)
self.row._icon.filepath = None
self.assertIsNone(self.row.filepath)
def test_title(self):
"""Test the editable title widget and properties."""
self.assertIsInstance(self.row._title,
emmental.sidebar.title.EditableTitle)
self.assertEqual(self.row._icon.get_next_sibling(), self.row._title)
self.assertEqual(self.row._title.get_margin_start(), 12)
self.assertEqual(self.row._title.get_margin_end(), 12)
self.row.name = "Test Playlist"
self.row.count = 42
self.assertEqual(self.row._title.title, "Test Playlist")
self.assertEqual(self.row._title.count, 42)
def test_delete(self):
"""Test the delete button."""
self.assertIsInstance(self.row._delete, Gtk.Button)
self.assertEqual(self.row._title.get_next_sibling(), self.row._delete)
self.assertEqual(self.row._delete.get_icon_name(), "big-x-symbolic")
self.assertEqual(self.row._delete.get_tooltip_text(),
"delete playlist")
self.assertEqual(self.row._delete.get_valign(), Gtk.Align.CENTER)
self.assertFalse(self.row._delete.get_has_frame())
self.assertTrue(self.row._delete.has_css_class("emmental-delete"))
self.row._delete.emit("clicked")
self.playlist.delete = unittest.mock.Mock()
self.row.playlist = self.playlist
self.row._delete.emit("clicked")
self.playlist.delete.assert_called()
def test_modifiable(self):
"""Test the modifiable property."""
self.assertFalse(self.row.modifiable)
self.assertFalse(self.row._icon.settable)
self.assertFalse(self.row._title.editable)
self.assertFalse(self.row._delete.get_visible())
self.row.modifiable = True
self.assertTrue(self.row._icon.settable)
self.assertTrue(self.row._title.editable)
self.assertTrue(self.row._delete.get_visible())
def test_rename(self):
"""Test responding to the request-rename signal."""
self.row._title.emit("request-rename", "No Error Expected")
self.playlist.rename = unittest.mock.Mock()
self.row.playlist = self.playlist
self.row._title.emit("request-rename", "New Name")
self.playlist.rename.assert_called_with("New Name")
class TestLibraryRow(unittest.TestCase):
"""Tests our library row with extra widgets."""
def setUp(self):
"""Set up common variables."""
super().setUp()
self.row = emmental.sidebar.row.LibraryRow()
self.playlist = emmental.db.playlist.Playlist(Gio.ListStore(),
propertyid=12345,
name="Test Playlist")
def test_init(self):
"""Test that the library row is configured properly."""
self.assertIsInstance(self.row, emmental.sidebar.row.BaseRow)
self.assertIsInstance(self.row._box, Gtk.Box)
self.assertIsInstance(self.row._overlay, Gtk.Overlay)
self.assertEqual(self.row.get_first_child(), self.row._overlay)
self.assertEqual(self.row._overlay.get_child(), self.row._box)
def test_switch(self):
"""Test the switch widget and enabled property."""
self.assertIsInstance(self.row._switch, Gtk.Switch)
self.assertEqual(self.row._switch.get_valign(), Gtk.Align.CENTER)
self.assertEqual(self.row._box.get_first_child(), self.row._switch)
self.assertTrue(self.row.enabled)
self.assertTrue(self.row._switch.get_active())
self.assertTrue(self.row._title.get_sensitive())
self.assertEqual(self.row._switch.get_tooltip_text(),
"disable library path")
self.row.enabled = False
self.assertFalse(self.row._switch.get_active())
self.assertFalse(self.row._title.get_sensitive())
self.assertEqual(self.row._switch.get_tooltip_text(),
"enable library path")
self.row._switch.set_active(True)
self.assertTrue(self.row.enabled)
self.assertTrue(self.row._title.get_sensitive())
self.assertEqual(self.row._switch.get_tooltip_text(),
"disable library path")
def test_progress(self):
"""Test the progress bar widget and property."""
self.assertIsInstance(self.row._progress, Gtk.ProgressBar)
self.assertEqual(self.row._progress.get_valign(), Gtk.Align.END)
self.assertTrue(self.row._progress.has_css_class("osd"))
self.assertIn(self.row._progress, self.row._overlay)
self.assertEqual(self.row.progress, 0.0)
self.row.progress = 0.42
self.assertEqual(self.row._progress.get_fraction(), 0.42)
def test_title(self):
"""Test the title widget and properties."""
self.assertIsInstance(self.row._title,
emmental.sidebar.title.PlaylistTitle)
self.assertEqual(self.row._title.get_margin_start(), 12)
self.assertEqual(self.row._title.get_margin_end(), 12)
self.assertEqual(self.row._switch.get_next_sibling(), self.row._title)
self.row.name = "/a/b/c"
self.row.count = 42
self.assertEqual(self.row._title.title, "/a/b/c")
self.assertEqual(self.row._title.count, 42)
def test_scan(self):
"""Test the scan button."""
self.assertIsInstance(self.row._scan, Gtk.Button)
self.assertEqual(self.row._scan.get_icon_name(), "update")
self.assertEqual(self.row._scan.get_tooltip_text(),
"update library path")
self.assertEqual(self.row._scan.get_valign(), Gtk.Align.CENTER)
self.assertFalse(self.row._scan.get_has_frame())
self.assertEqual(self.row._title.get_next_sibling(), self.row._scan)
self.row._scan.emit("clicked")
self.playlist.scan = unittest.mock.Mock()
self.row.playlist = self.playlist
self.row._scan.emit("clicked")
self.playlist.scan.assert_called()
def test_stop(self):
"""Test the stop button."""
self.assertIsInstance(self.row._stop, Gtk.Button)
self.assertEqual(self.row._stop.get_icon_name(), "stop-sign-large")
self.assertEqual(self.row._stop.get_tooltip_text(), "cancel update")
self.assertEqual(self.row._stop.get_valign(), Gtk.Align.CENTER)
self.assertFalse(self.row._stop.get_has_frame())
self.assertTrue(self.row._stop.has_css_class("emmental-stop"))
self.assertEqual(self.row._scan.get_next_sibling(), self.row._stop)
self.row._stop.emit("clicked")
self.playlist.stop = unittest.mock.Mock()
self.row.playlist = self.playlist
self.row._stop.emit("clicked")
self.playlist.stop.assert_called()
def test_delete(self):
"""Test the delete button."""
self.assertIsInstance(self.row._delete, Gtk.Button)
self.assertEqual(self.row._delete.get_icon_name(), "big-x-symbolic")
self.assertEqual(self.row._delete.get_tooltip_text(),
"delete library path")
self.assertEqual(self.row._delete.get_valign(), Gtk.Align.CENTER)
self.assertFalse(self.row._delete.get_has_frame())
self.assertTrue(self.row._delete.has_css_class("emmental-delete"))
self.assertEqual(self.row._stop.get_next_sibling(), self.row._delete)
self.row._delete.emit("clicked")
self.playlist.delete = unittest.mock.Mock()
self.row.playlist = self.playlist
self.row._delete.emit("clicked")
self.playlist.delete.assert_called()
def test_online(self):
"""Test the online property."""
self.assertTrue(self.row.online)
self.assertTrue(self.row._switch.get_sensitive())
self.assertTrue(self.row._title.get_sensitive())
self.row.online = False
self.assertFalse(self.row._switch.get_sensitive())
self.assertFalse(self.row._title.get_sensitive())
def test_scaning(self):
"""Test the scanning property."""
self.assertFalse(self.row.scanning)
self.assertFalse(self.row._progress.get_visible())
self.assertFalse(self.row._stop.get_visible())
self.assertTrue(self.row._scan.get_visible())
self.row.scanning = True
self.assertTrue(self.row._progress.get_visible())
self.assertTrue(self.row._stop.get_visible())
self.assertFalse(self.row._scan.get_visible())
class TestTreeRow(unittest.TestCase):
"""Test the TreeRow widget used by the section factories."""
def setUp(self):
"""Set up common variables."""
self.playlist = emmental.db.playlist.Playlist(Gio.ListStore(),
0, "Playlist Name")
self.treeitem = Gtk.TreeListRow()
self.treeitem.get_item = unittest.mock.Mock(return_value=self.playlist)
self.listitem = Gtk.ListItem()
self.listitem.get_item = unittest.mock.Mock(return_value=self.treeitem)
self.treerow = emmental.sidebar.row.TreeRow(self.listitem)
self.adw_bin = Adw.Bin(child=self.listitem.get_child())
def test_init(self):
"""Test that the TreeRow was set up properly."""
self.assertIsInstance(self.treerow, emmental.factory.TreeRow)
self.assertIsNone(self.treerow.child)
def test_bind(self):
"""Test binding a Playlist to the TreeRow."""
self.treerow.child = emmental.sidebar.row.BaseRow()
self.playlist.table.update = unittest.mock.Mock(return_value=True)
self.playlist.active = True
self.playlist.n_tracks = 42
self.playlist.children = Gtk.FilterListModel.new(Gio.ListStore(), None)
self.treerow.bind()
self.assertEqual(self.treerow.child.playlist, self.playlist)
self.assertEqual(self.treerow.child.name, "Playlist Name")
self.assertEqual(self.treerow.child.count, 42)
self.assertEqual(self.treerow.n_children, 0)
self.assertTrue(self.treerow.active)
self.playlist.children.get_model().append(Gtk.Label())
self.assertEqual(self.treerow.n_children, 1)
self.treerow.unbind()
self.assertIsNone(self.treerow.child.playlist)