# Copyright 2022 (c) Anna Schumaker. """Tests our Now Playing card.""" import unittest import unittest.mock import emmental import tests.util from gi.repository import Gtk class TestNowPlaying(unittest.TestCase): """Test case for our custom Now Playing card.""" def setUp(self): """Set up common variables.""" self.card = emmental.nowplaying.Card() def test_init(self): """Test that the card has been initialized correctly.""" self.assertIsInstance(self.card, Gtk.Box) self.assertIsInstance(self.card._grid, Gtk.Grid) self.assertIsInstance(self.card._bottom_box, Gtk.Box) self.assertEqual(self.card._bottom_box.get_orientation(), Gtk.Orientation.HORIZONTAL) self.assertEqual(self.card._bottom_box.get_spacing(), 0) self.assertEqual(self.card._artwork.get_next_sibling(), self.card._grid) self.assertEqual(self.card._grid.get_child_at(0, 1), self.card._bottom_box) self.assertEqual(self.card._grid.get_child_at(1, 1), self.card._bottom_box) self.assertTrue(self.card.has_css_class("card")) def test_artwork(self): """Test that an Artwork instance has been added.""" self.assertIsInstance(self.card._artwork, emmental.nowplaying.artwork.Artwork) self.assertEqual(self.card.get_first_child(), self.card._artwork) self.card.artwork = tests.util.COVER_JPG self.assertEqual(self.card._artwork.filepath, tests.util.COVER_JPG) def test_prefer_artist(self): """Test the 'prefer-artist' property.""" self.assertTrue(self.card.prefer_artist) self.card.prefer_artist = False self.assertFalse(self.card.prefer_artist) self.assertFalse(self.card._tags.prefer_artist) self.card._tags.prefer_artist = True self.assertTrue(self.card.prefer_artist) self.assertTrue(self.card._tags.prefer_artist) def test_tags(self): """Test tag properties.""" self.assertIsInstance(self.card._tags, emmental.nowplaying.tags.TagInfo) self.assertEqual(self.card._grid.get_child_at(0, 0), self.card._tags) for tag in ["title", "album", "artist", "album-artist"]: with self.subTest(tag=tag): self.card.set_property(tag, f"test {tag}") self.assertEqual(self.card.get_property(tag), f"test {tag}") self.assertEqual(self.card._tags.get_property(tag), f"test {tag}") def test_controls(self): """Test the now playing controls.""" self.assertIsInstance(self.card._controls, emmental.nowplaying.controls.Controls) self.assertEqual(self.card._grid.get_child_at(1, 0), self.card._controls) for signal in ["play", "pause", "previous", "next"]: with self.subTest(signal=signal): handler = unittest.mock.Mock() self.card.connect(signal, handler) self.card.emit(signal) handler.assert_called_with(self.card) def test_favorite_button(self): """Test the favorite button.""" self.assertIsInstance(self.card._favorite, emmental.buttons.ImageToggle) self.assertEqual(self.card._bottom_box.get_first_child(), self.card._favorite) self.assertEqual(self.card._favorite.active_icon_name, "heart-filled") self.assertEqual(self.card._favorite.active_tooltip_text, "remove from 'Favorite Tracks'") self.assertEqual(self.card._favorite.inactive_icon_name, "heart-outline-thick-symbolic") self.assertEqual(self.card._favorite.inactive_tooltip_text, "add to 'Favorite Tracks'") self.assertEqual(self.card._favorite.get_valign(), Gtk.Align.CENTER) self.assertFalse(self.card._favorite.get_has_frame()) self.assertTrue(self.card._favorite.large_icon) self.assertFalse(self.card._favorite.get_sensitive()) self.card.have_db_track = True self.assertTrue(self.card._favorite.get_sensitive()) self.assertFalse(self.card.favorite) self.card.favorite = True self.assertTrue(self.card._favorite.active) self.card._favorite.active = False self.assertFalse(self.card.favorite) def test_jump_button(self): """Test the jump button.""" self.assertIsInstance(self.card._jump, emmental.buttons.Button) self.assertEqual(self.card._favorite.get_next_sibling(), self.card._jump) self.assertEqual(self.card._jump.icon_name, "arrow4-down-symbolic") self.assertEqual(self.card._jump.get_tooltip_text(), "scroll to current track") self.assertEqual(self.card._jump.get_valign(), Gtk.Align.CENTER) self.assertFalse(self.card._jump.get_has_frame()) self.assertTrue(self.card._jump.large_icon) self.assertFalse(self.card._jump.get_sensitive()) self.card.have_db_track = True self.assertTrue(self.card._jump.get_sensitive()) jumped = unittest.mock.Mock() self.card.connect("jump", jumped) self.card._jump.emit("clicked") jumped.assert_called_with(self.card) def test_seeker(self): """Test the seeker widget.""" self.assertIsInstance(self.card._seeker, emmental.nowplaying.seeker.Scale) self.assertEqual(self.card._jump.get_next_sibling(), self.card._seeker) self.assertFalse(self.card._seeker.get_sensitive()) self.card.have_track = True self.assertTrue(self.card._seeker.get_sensitive()) handler = unittest.mock.Mock() self.card.connect("seek", handler) self.card._seeker.emit("change-value", Gtk.ScrollType.JUMP, 10) handler.assert_called_with(self.card, 10) def test_editing(self): """Test the 'editing' property.""" self.assertFalse(self.card.editing) self.card.editing = True self.assertTrue(self.card._controls.editing) self.card.editing = False self.assertFalse(self.card._controls.editing) def test_playing(self): """Test the 'playing' property.""" self.assertFalse(self.card.playing) self.card.playing = True self.assertTrue(self.card._controls.playing) self.card.playing = False self.assertFalse(self.card._controls.playing) def test_have_properties(self): """Test the 'have-{next, previous, track}' properties.""" for property in ["have-next", "have-previous", "have-track"]: with self.subTest(property=property): self.assertFalse(self.card.get_property(property)) self.card.set_property(property, True) self.assertTrue(self.card._controls.get_property(property)) def test_autopause(self): """Test the 'autopause' property.""" self.assertEqual(self.card.autopause, -1) self.card._controls.autopause = 1 self.assertEqual(self.card.autopause, 1) self.card.autopause = 3 self.assertEqual(self.card.autopause, 3) self.assertEqual(self.card._controls.autopause, 3) def test_duration(self): """Test the 'duration' property.""" self.assertEqual(self.card.duration, 1) self.card.duration = 10 self.assertEqual(self.card._seeker.duration, 10) def test_position(self): """Test the 'position' property.""" self.assertEqual(self.card.position, 0) self.card.position = 0.5 self.assertEqual(self.card._seeker.position, 0.5) def test_accelerators(self): """Check that the accelerators list is set up properly.""" entries = [("toggle-favorite", self.card._favorite.activate, ["f"], self.card, "have-db-track"), ("goto-current-track", self.card._jump.activate, ["g"], self.card, "have-db-track"), ("next-track", self.card._controls.activate_next, ["Return"], self.card._controls, "can-activate-next"), ("previous-track", self.card._controls.activate_previous, ["BackSpace"], self.card._controls, "can-activate-prev"), ("play-pause", self.card._controls.activate_play_pause, ["space"], self.card._controls, "can-activate-play-pause"), ("inc-autopause", self.card._controls.increase_autopause, ["plus", "KP_Add"], self.card, "playing"), ("dec-autopause", self.card._controls.decrease_autopause, ["minus", "KP_Subtract"], self.card, "playing")] accels = self.card.accelerators self.assertIsInstance(accels, list) for i, (name, func, accel, gobject, prop) in enumerate(entries): with self.subTest(action=name): self.assertIsInstance(accels[i], emmental.action.ActionEntry) self.assertEqual(accels[i].name, name) self.assertEqual(accels[i].func, func) self.assertListEqual(accels[i].accels, accel) enabled = gobject.get_property(prop) self.assertEqual(accels[i].enabled, enabled) gobject.set_property(prop, not enabled) self.assertEqual(accels[i].enabled, not enabled) self.assertEqual(len(accels), i + 1)