# Copyright 2023 (c) Anna Schumaker. """Tests our TrackView Row widgets.""" import datetime import dateutil.tz import pathlib import emmental.factory import emmental.tracklist.row import tests.util import unittest.mock from gi.repository import GObject from gi.repository import Gtk from gi.repository import Adw class TestTrackRowWidgets(tests.util.TestCase): """Tests our Track Row widgets.""" def setUp(self): """Set up common variables.""" super().setUp() self.sql.playlists.load(now=True) self.library = self.sql.libraries.create(pathlib.Path("/a/b")) self.album = self.sql.albums.create("Test Album", "Artist", "2023", cover=tests.util.COVER_JPG) self.medium = self.sql.media.create(self.album, "Medium", 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, title="Test Title") self.listitem = Gtk.ListItem() self.listitem.get_item = unittest.mock.Mock(return_value=self.track) self.columnrow = Adw.Bin() self.listrow = Adw.Bin(child=self.columnrow) def test_track_row(self): """Test the base Track Row.""" row = emmental.tracklist.row.TrackRow(self.listitem, "property") self.assertIsInstance(row, emmental.factory.ListRow) self.assertIsNone(row.album_binding) self.assertIsNone(row.listrow) self.assertEqual(row.property, "property") self.assertEqual(row.mediumid, 0) row.child = Gtk.Label() self.columnrow.set_child(row.child) self.assertEqual(row.listrow, self.listrow) self.library.online = False self.track.active = True row.bind() self.assertFalse(row.online) self.assertFalse(self.listitem.get_activatable()) self.assertFalse(row.child.get_sensitive()) self.assertTrue(row.active) self.assertTrue(self.listrow.has_css_class("emmental-active-row")) self.library.online = True self.track.active = False self.assertTrue(row.online) self.assertTrue(self.listitem.get_activatable()) self.assertTrue(row.child.get_sensitive()) self.assertFalse(row.active) self.assertFalse(self.listrow.has_css_class("emmental-active-row")) def test_inscription_row(self): """Test the base Inscription Row.""" row = emmental.tracklist.row.InscriptionRow(self.listitem, "property") self.assertIsInstance(row, emmental.tracklist.row.TrackRow) self.assertIsInstance(row.child, Gtk.Inscription) self.assertEqual(row.child.get_xalign(), 0.0) self.assertFalse(row.child.has_css_class("numeric")) row.child.set_text("Test Text") self.assertEqual(row.child.get_tooltip_text(), "Test Text") row = emmental.tracklist.row.InscriptionRow(self.listitem, "property", xalign=1.0, numeric=True) self.assertEqual(row.child.get_xalign(), 1.0) self.assertTrue(row.child.has_css_class("numeric")) def test_track_string(self): """Test the Track String widget.""" row = emmental.tracklist.row.TrackString(self.listitem, "title") self.assertIsInstance(row, emmental.tracklist.row.InscriptionRow) self.assertEqual(row.property, "title") row.bind() self.assertEqual(row.child.get_text(), "Test Title") self.track.title = "New Title" self.assertEqual(row.child.get_text(), "New Title") def test_length_string(self): """Test the LengthString widget.""" row = emmental.tracklist.row.LengthString(self.listitem, "length") self.assertIsInstance(row, emmental.tracklist.row.InscriptionRow) self.assertEqual(row.property, "length") self.assertEqual(row.length, 0.0) row.bind() self.assertEqual(row.child.get_text(), "0:00") self.track.length = 123.45 self.assertEqual(row.child.get_text(), "2:03") self.track.length = 123.84 self.assertEqual(row.child.get_text(), "2:04") def test_timestamp_string(self): """Test the TimestampString widget.""" row = emmental.tracklist.row.TimestampString(self.listitem, "laststarted") self.assertIsInstance(row, emmental.tracklist.row.InscriptionRow) self.assertEqual(row.TZ_UTC, dateutil.tz.tzutc()) self.assertEqual(row.property, "laststarted") self.assertEqual(row.timestamp, None) row.bind() self.assertEqual(row.child.get_text(), "Never") local = datetime.datetime.now() utc = local.astimezone(dateutil.tz.tzutc()) self.track.laststarted = utc.replace(tzinfo=None) self.assertEqual(row.child.get_text(), local.strftime("%c")) def test_path_string(self): """Test the PathString widget.""" row = emmental.tracklist.row.PathString(self.listitem, "path") self.assertIsInstance(row, emmental.tracklist.row.InscriptionRow) self.assertEqual(row.property, "path") self.assertEqual(row.path, None) row.bind() self.assertEqual(row.child.get_text(), str(pathlib.Path("/a/b/1.ogg"))) def test_trackno_label(self): """Test the Track Number Label widget.""" row = emmental.tracklist.row.TracknoString(self.listitem, "number") self.assertIsInstance(row, emmental.tracklist.row.InscriptionRow) self.assertEqual(row.property, "number") self.assertEqual(row.number, 0) row.bind() self.assertEqual(row.mediumid, self.medium.mediumid) self.assertEqual(row.child.get_text(), "1-00") self.track.number = 3 self.assertEqual(row.child.get_text(), "1-03") medium = self.sql.media.create(self.album, "", number=3) self.track.mediumid = medium.mediumid self.assertEqual(row.child.get_text(), "3-03") def test_album_string(self): """Test the Album String widget.""" row = emmental.tracklist.row.AlbumString(self.listitem, "artist") self.assertIsInstance(row, emmental.tracklist.row.InscriptionRow) self.assertEqual(row.property, "artist") row.bind() self.assertIsInstance(row.album_binding, GObject.Binding) self.assertEqual(row.child.get_text(), "Artist") album = self.sql.albums.create("Other Album", "Other Artist", "2022") medium = self.sql.media.create(album, "Other Medium", number=4) self.track.mediumid = medium.mediumid self.assertEqual(row.child.get_text(), "Other Artist") row.unbind() self.assertIsNone(row.album_binding) def test_medium_string(self): """Test the Medium String widget.""" row = emmental.tracklist.row.MediumString(self.listitem, "name") self.assertIsInstance(row, emmental.tracklist.row.InscriptionRow) self.assertEqual(row.property, "name") self.assertEqual(row.medium, "") row.bind() self.assertEqual(row.medium, "Medium") self.assertEqual(row.child.get_text(), "Test Album:\nMedium") self.medium.rename("New Name") self.assertEqual(row.medium, "New Name") self.assertEqual(row.child.get_text(), "Test Album:\nNew Name") album = self.sql.albums.create("Other Album", "Other Artist", "2023") medium = self.sql.media.create(album, "", number=4) self.track.mediumid = medium.mediumid self.assertEqual(row.medium, "") self.assertEqual(row.child.get_text(), "Other Album") def test_album_cover(self): """Test the Album Cover widget.""" row = emmental.tracklist.row.AlbumCover(self.listitem, "cover") self.assertIsInstance(row, emmental.tracklist.row.TrackRow) self.assertIsInstance(row.child, Gtk.Picture) self.assertEqual(row.property, "cover") self.assertEqual(row.child.get_content_fit(), Gtk.ContentFit.COVER) self.assertIsNone(row.filepath) row.bind() self.assertEqual(row.filepath, tests.util.COVER_JPG) self.assertEqual(len(emmental.texture.CACHE), 1) self.assertEqual(row.child.get_paintable(), emmental.texture.CACHE[tests.util.COVER_JPG]) self.assertTrue(row.child.get_has_tooltip()) self.album.cover = None self.assertIsNone(row.filepath) self.assertIsNone(row.child.get_paintable()) self.assertFalse(row.child.get_has_tooltip()) album = self.sql.albums.create("Other Album", "Other Artist", "2023", cover=tests.util.COVER_JPG) medium = self.sql.media.create(album, "Other Medium", number=4) self.track.mediumid = medium.mediumid self.assertEqual(row.filepath, tests.util.COVER_JPG) def test_favorite_button(self): """Test the Favorite Button widget.""" row = emmental.tracklist.row.FavoriteButton(self.listitem, "favorite") self.assertIsInstance(row, emmental.tracklist.row.TrackRow) self.assertIsInstance(row.child, emmental.buttons.ImageToggle) self.assertEqual(row.property, "favorite") self.assertEqual(row.child.active_icon_name, "heart-filled") self.assertEqual(row.child.inactive_icon_name, "heart-outline-thick") self.assertEqual(row.child.get_valign(), Gtk.Align.CENTER) self.assertFalse(row.child.get_has_frame()) self.assertFalse(row.child.large_icon) self.track.favorite = True row.bind() self.assertTrue(row.child.active) self.track.favorite = False self.assertFalse(row.child.active) row.child.active = True self.assertTrue(self.track.favorite)