emmental/tests/sidebar/test_sidebar.py

189 lines
8.2 KiB
Python

# Copyright 2022 (c) Anna Schumaker.
"""Tests our playlist Sidebar card."""
import emmental.sidebar
import tests.util
import unittest.mock
from gi.repository import Gtk
class TestSidebar(tests.util.TestCase):
"""Tests the Sidebar card."""
def setUp(self):
"""Set up common variables."""
super().setUp()
self.sidebar = emmental.sidebar.Card(sql=self.sql)
def test_init(self):
"""Test that the Sidebar has been set up correctly."""
self.assertIsInstance(self.sidebar, Gtk.Box)
self.assertEqual(self.sidebar.sql, self.sql)
self.assertEqual(self.sidebar.get_orientation(),
Gtk.Orientation.VERTICAL)
self.assertFalse(self.sidebar.get_sensitive())
self.assertTrue(self.sidebar.has_css_class("card"))
def test_header(self):
"""Test the Sidebar header."""
self.assertIsInstance(self.sidebar._header, Gtk.CenterBox)
self.assertEqual(self.sidebar.get_first_child(), self.sidebar._header)
self.assertTrue(self.sidebar._header.has_css_class("toolbar"))
def test_filter(self):
"""Test the Sidebar filter entry."""
self.assertIsInstance(self.sidebar._filter, emmental.entry.Filter)
self.assertEqual(self.sidebar._header.get_center_widget(),
self.sidebar._filter)
self.assertEqual(self.sidebar._filter.get_placeholder_text(),
"type to filter playlists")
self.assertTrue(self.sidebar._filter.get_hexpand())
with unittest.mock.patch.object(self.sql, "filter") as mock_filter:
self.sidebar._filter.set_text("test text")
self.sidebar._filter.emit("search-changed")
mock_filter.assert_called_with("*test text*")
def test_jump(self):
"""Test the jump button."""
self.assertIsInstance(self.sidebar._jump, Gtk.Button)
self.assertEqual(self.sidebar._header.get_end_widget(),
self.sidebar._jump)
self.assertEqual(self.sidebar._jump.get_icon_name(),
"go-jump-symbolic")
self.assertEqual(self.sidebar._jump.get_tooltip_text(),
"scroll to current playlist")
self.sql.playlists.load(now=True)
with unittest.mock.patch.object(self.sidebar,
"select_playlist") as mock_select:
self.sidebar._jump.emit("clicked")
mock_select.assert_called_with(self.sql.active_playlist)
def test_sensitivity_and_startup(self):
"""Test setting the sidebar sensitivity when all tables have loaded."""
tables = [t for t in self.sql.playlist_tables()]
self.sidebar.select_playlist = unittest.mock.Mock()
self.sidebar._libraries.extra_widget.emit = unittest.mock.Mock()
for table in tables:
self.assertFalse(self.sidebar.get_sensitive())
self.sidebar.select_playlist.assert_not_called()
self.sidebar._libraries.extra_widget.emit.assert_not_called()
self.sql.emit("table-loaded", table)
self.assertTrue(self.sidebar.get_sensitive())
self.sidebar.select_playlist.assert_called()
self.sidebar._libraries.extra_widget.emit.assert_called_with("clicked")
self.sidebar.select_playlist.reset_mock()
self.sql.emit("table-loaded", tables[0])
self.sidebar.select_playlist.assert_not_called()
def test_show_all_artists(self):
"""Test the show-all-artists property."""
self.assertFalse(self.sidebar.show_all_artists)
self.sidebar.show_all_artists = True
self.assertTrue(self.sidebar._artists.show_all)
self.sidebar._artists.show_all = False
self.assertFalse(self.sidebar.show_all_artists)
def test_selected_playlist(self):
"""Test the selected-playlist property."""
self.assertIsNone(self.sidebar.selected_playlist)
playlist1 = self.sql.playlists.create("Playlist 1")
self.sidebar._view.selected_playlist = playlist1
self.assertEqual(self.sidebar.selected_playlist, playlist1)
def test_view(self):
"""Test that sidebar sections are in the View."""
self.assertIsInstance(self.sidebar._view,
emmental.sidebar.section.View)
self.assertEqual(self.sidebar._header.get_next_sibling(),
self.sidebar._view)
self.assertListEqual(self.sidebar._view._sections,
[self.sidebar._playlists,
self.sidebar._artists,
self.sidebar._genres,
self.sidebar._decades,
self.sidebar._libraries])
def test_sections(self):
"""Tests sidebar section models."""
self.assertIsInstance(self.sidebar._playlists,
emmental.sidebar.playlist.Section)
self.assertIsInstance(self.sidebar._artists,
emmental.sidebar.artist.Section)
self.assertIsInstance(self.sidebar._genres,
emmental.sidebar.genre.Section)
self.assertIsInstance(self.sidebar._decades,
emmental.sidebar.decade.Section)
self.assertIsInstance(self.sidebar._libraries,
emmental.sidebar.library.Section)
self.assertEqual(self.sidebar._view.get_first_child(),
self.sidebar._playlists)
self.assertEqual(self.sidebar._playlists.get_next_sibling(),
self.sidebar._artists)
self.assertEqual(self.sidebar._artists.get_next_sibling(),
self.sidebar._genres)
self.assertEqual(self.sidebar._genres.get_next_sibling(),
self.sidebar._decades)
self.assertEqual(self.sidebar._decades.get_next_sibling(),
self.sidebar._libraries)
self.assertEqual(self.sidebar._playlists.table, self.sql.playlists)
self.assertEqual(self.sidebar._artists.table, self.sql.artists)
self.assertEqual(self.sidebar._artists.album_table, self.sql.albums)
self.assertEqual(self.sidebar._genres.table, self.sql.genres)
self.assertEqual(self.sidebar._decades.table, self.sql.decades)
self.assertEqual(self.sidebar._decades.year_table, self.sql.years)
self.assertEqual(self.sidebar._libraries.table, self.sql.libraries)
def test_select_playlist(self):
"""Test setting the active playlist."""
playlist = self.sql.playlists.create("Test Playlist")
self.sidebar.select_playlist(playlist)
self.assertTrue(self.sidebar._playlists.active)
self.assertEqual(self.sidebar.selected_playlist, playlist)
artist = self.sql.artists.create("Test Artist")
album = self.sql.albums.create("Test Album", "Test Artist", "2023")
medium = self.sql.media.create(album, "Test Medium", number=1)
self.sidebar._artists.select_playlist = unittest.mock.Mock()
for plist in [artist, album, medium]:
self.sidebar._artists.select_playlist.reset_mock()
self.sidebar._artists.active = False
self.sidebar.select_playlist(plist)
self.assertTrue(self.sidebar._artists.active)
self.sidebar._artists.select_playlist.assert_called_with(plist)
genre = self.sql.genres.create("Test Genre")
self.sidebar.select_playlist(genre)
self.assertTrue(self.sidebar._genres.active)
self.assertEqual(self.sidebar.selected_playlist, genre)
decade = self.sql.decades.create(1990)
year = self.sql.years.create(1990)
self.sidebar._decades.select_playlist = unittest.mock.Mock()
for plist in [decade, year]:
self.sidebar._decades.select_playlist.reset_mock()
self.sidebar._decades.active = False
self.sidebar.select_playlist(plist)
self.assertTrue(self.sidebar._decades.active)
self.sidebar._decades.select_playlist.assert_called_with(plist)
library = self.sql.libraries.create("/a/b/c")
self.sidebar.select_playlist(library)
self.assertTrue(self.sidebar._libraries.active)
self.assertEqual(self.sidebar.selected_playlist, library)