emmental/tests/tracklist/test_trackview.py

318 lines
14 KiB
Python

# Copyright 2022 (c) Anna Schumaker.
"""Tests our Track ColumnView."""
import pathlib
import unittest.mock
import emmental.tracklist.trackview
import tests.util
from gi.repository import Gtk
class TestTrackView(tests.util.TestCase):
"""Tests the TrackView widget."""
def setUp(self):
"""Set up common variables."""
super().setUp()
self.db_plist = self.sql.playlists.create("Test Playlist")
self.playlist = emmental.playlist.playlist.Playlist(self.sql,
self.db_plist)
self.trackview = emmental.tracklist.trackview.TrackView(self.sql)
self.library = self.sql.libraries.create(pathlib.Path("/a/b/"))
self.album = self.sql.albums.create("Test Album", "Artist", "2023")
self.medium = self.sql.media.create(self.album, "", number=1)
self.year = self.sql.years.create(2023)
self.track = self.sql.tracks.create(self.library,
pathlib.Path("/a/b/1.ogg"),
self.medium, self.year, length=10)
def test_init(self):
"""Test that the TrackView is initialized properly."""
self.assertIsInstance(self.trackview, Gtk.ScrolledWindow)
self.assertEqual(self.trackview.get_child(),
self.trackview._columnview)
def test_list_models(self):
"""Test our filter and selection list models."""
self.assertIsInstance(self.trackview._filtermodel, Gtk.FilterListModel)
self.assertIsInstance(self.trackview._selection, Gtk.MultiSelection)
self.assertEqual(self.trackview._filtermodel.get_filter(),
self.sql.tracks.get_filter())
self.assertTrue(self.trackview._filtermodel.get_incremental())
self.assertEqual(self.trackview._selection.get_model(),
self.trackview._filtermodel)
self.assertEqual(self.trackview.selection_model,
self.trackview._selection)
def test_columnview(self):
"""Test the columnview."""
self.assertIsInstance(self.trackview._columnview, Gtk.ColumnView)
self.assertEqual(self.trackview._columnview.get_model(),
self.trackview._selection)
self.assertEqual(self.trackview._columnview.get_columns(),
self.trackview.columns)
self.assertTrue(self.trackview._columnview.get_hexpand())
self.assertTrue(self.trackview._columnview.get_vexpand())
self.assertTrue(self.trackview._columnview.get_show_row_separators())
self.assertTrue(self.trackview._columnview.get_enable_rubberband())
self.assertTrue(self.trackview._columnview.has_css_class(
"emmental-track-list"))
def test_track_activated(self):
"""Test activating a row in the columnview."""
requested = unittest.mock.Mock()
self.playlist.connect("track-requested", requested)
self.trackview.playlist = self.playlist
self.trackview._selection.set_model(self.playlist)
self.db_plist.add_track(self.track)
with unittest.mock.patch.object(self.trackview._selection,
"unselect_all") as mock_unselect:
self.trackview._columnview.emit("activate", 0)
requested.assert_called_with(self.playlist, self.track)
mock_unselect.assert_called()
def test_playlist(self):
"""Test the playlist property."""
self.assertIsNone(self.trackview.playlist)
self.trackview.playlist = self.playlist
self.assertEqual(self.trackview._filtermodel.get_model(),
self.playlist)
def test_n_tracks(self):
"""Test the n-tracks property."""
self.assertEqual(self.trackview.n_tracks, 0)
self.trackview._selection.set_model(self.playlist)
self.db_plist.add_track(self.track)
self.assertEqual(self.trackview.n_tracks, 1)
def test_runtime(self):
"""Test the runtime property."""
self.assertEqual(self.trackview.runtime, 0)
self.trackview._selection.set_model(self.playlist)
self.db_plist.add_track(self.track)
self.assertEqual(self.trackview.runtime, 10.0)
class TestTrackViewColumns(tests.util.TestCase):
"""Test the TrackView Columns."""
def setUp(self):
"""Set up common variables."""
super().setUp()
self.trackview = emmental.tracklist.trackview.TrackView(self.sql)
self.columns = self.trackview.columns
self.listitem = Gtk.ListItem()
def test_artwork_column(self, i: int = 0):
"""Test the favorite column."""
self.assertEqual(self.columns[i].get_title(), "Art")
self.assertEqual(self.columns[i].get_fixed_width(), -1)
self.assertFalse(self.columns[i].get_resizable())
self.assertTrue(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type, emmental.tracklist.row.AlbumCover)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "cover")
def test_favorite_column(self, i: int = 1):
"""Test the favorite column."""
self.assertEqual(self.columns[i].get_title(), "Fav")
self.assertEqual(self.columns[i].get_fixed_width(), -1)
self.assertFalse(self.columns[i].get_resizable())
self.assertTrue(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type,
emmental.tracklist.row.FavoriteButton)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "favorite")
def test_trackno_column(self, i: int = 2):
"""Test the track number column."""
self.assertEqual(self.columns[i].get_title(), "Track")
self.assertEqual(self.columns[i].get_fixed_width(), 55)
self.assertTrue(self.columns[i].get_resizable())
self.assertTrue(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type,
emmental.tracklist.row.TracknoString)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "number")
self.assertEqual(self.listitem.listrow.child.get_xalign(), 1.0)
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
def test_title_column(self, i: int = 3):
"""Test the title column."""
self.assertEqual(self.columns[i].get_title(), "Title")
self.assertEqual(self.columns[i].get_fixed_width(), 300)
self.assertTrue(self.columns[i].get_resizable())
self.assertTrue(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type, emmental.tracklist.row.TrackString)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "title")
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
self.assertFalse(self.listitem.listrow.child.has_css_class("numeric"))
def test_length_column(self, i: int = 4):
"""Test the length column."""
self.assertEqual(self.columns[i].get_title(), "Length")
self.assertEqual(self.columns[i].get_fixed_width(), -1)
self.assertTrue(self.columns[i].get_resizable())
self.assertTrue(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type, emmental.tracklist.row.LengthString)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "length")
self.assertEqual(self.listitem.listrow.child.get_xalign(), 1.0)
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
def test_artist_column(self, i: int = 5):
"""Test the artist column."""
self.assertEqual(self.columns[i].get_title(), "Artist")
self.assertEqual(self.columns[i].get_fixed_width(), 250)
self.assertTrue(self.columns[i].get_resizable())
self.assertTrue(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type, emmental.tracklist.row.TrackString)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "artist")
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
self.assertFalse(self.listitem.listrow.child.has_css_class("numeric"))
def test_album_column(self, i: int = 6):
"""Test the artist column."""
self.assertEqual(self.columns[i].get_title(), "Album")
self.assertEqual(self.columns[i].get_fixed_width(), 350)
self.assertTrue(self.columns[i].get_resizable())
self.assertTrue(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type, emmental.tracklist.row.MediumString)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "name")
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
self.assertFalse(self.listitem.listrow.child.has_css_class("numeric"))
def test_album_artist_column(self, i: int = 7):
"""Test the album artist column."""
self.assertEqual(self.columns[i].get_title(), "Album Artist")
self.assertEqual(self.columns[i].get_fixed_width(), 250)
self.assertTrue(self.columns[i].get_resizable())
self.assertFalse(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type, emmental.tracklist.row.AlbumString)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "artist")
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
self.assertFalse(self.listitem.listrow.child.has_css_class("numeric"))
def test_release_column(self, i: int = 8):
"""Test the release date column."""
self.assertEqual(self.columns[i].get_title(), "Release")
self.assertEqual(self.columns[i].get_fixed_width(), 115)
self.assertTrue(self.columns[i].get_resizable())
self.assertTrue(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type, emmental.tracklist.row.AlbumString)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "release")
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
def test_playcount_column(self, i: int = 9):
"""Test the play count column."""
self.assertEqual(self.columns[i].get_title(), "Play Count")
self.assertEqual(self.columns[i].get_fixed_width(), 135)
self.assertTrue(self.columns[i].get_resizable())
self.assertTrue(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type,
emmental.tracklist.row.PlayCountString)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "playcount")
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
def test_last_started_column(self, i: int = 10):
"""Test the last started column."""
self.assertEqual(self.columns[i].get_title(), "Last Started")
self.assertEqual(self.columns[i].get_fixed_width(), 250)
self.assertTrue(self.columns[i].get_resizable())
self.assertFalse(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type,
emmental.tracklist.row.TimestampString)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "laststarted")
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
def test_last_played_column(self, i: int = 11):
"""Test the last played column."""
self.assertEqual(self.columns[i].get_title(), "Last Played")
self.assertEqual(self.columns[i].get_fixed_width(), 250)
self.assertTrue(self.columns[i].get_resizable())
self.assertTrue(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type,
emmental.tracklist.row.TimestampString)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "lastplayed")
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
def test_filepath_column(self, i: int = 12):
"""Test the last played column."""
self.assertEqual(self.columns[i].get_title(), "Filepath")
self.assertEqual(self.columns[i].get_fixed_width(), -1)
self.assertTrue(self.columns[i].get_resizable())
self.assertFalse(self.columns[i].get_visible())
factory = self.columns[i].get_factory()
self.assertIsInstance(factory, emmental.factory.Factory)
self.assertEqual(factory.row_type, emmental.tracklist.row.PathString)
factory.emit("setup", self.listitem)
self.assertEqual(self.listitem.listrow.property, "path")
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
self.assertFalse(self.listitem.listrow.child.has_css_class("numeric"))