emmental/tests/tracklist/test_row.py

242 lines
9.8 KiB
Python

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