247 lines
10 KiB
Python
247 lines
10 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 Gdk
|
|
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.assertEqual(row.property, "property")
|
|
self.assertEqual(row.mediumid, 0)
|
|
|
|
row.child = Gtk.Label()
|
|
self.columnrow.set_child(row.child)
|
|
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.get_state_flags() &
|
|
Gtk.StateFlags.CHECKED)
|
|
|
|
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.get_state_flags() &
|
|
Gtk.StateFlags.CHECKED)
|
|
|
|
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."""
|
|
self.assertDictEqual(emmental.tracklist.row.AlbumCover.Cache, {})
|
|
cache = emmental.tracklist.row.AlbumCover.Cache
|
|
|
|
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(cache), 1)
|
|
self.assertIsInstance(cache[tests.util.COVER_JPG], Gdk.Texture)
|
|
self.assertEqual(row.child.get_paintable(),
|
|
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)
|