emmental/tests/sidebar/test_header.py

174 lines
7.1 KiB
Python

# Copyright 2022 (c) Anna Schumaker.
"""Tests our sidebar Section Header widget."""
import unittest
import emmental.sidebar.header
from gi.repository import Gtk
from gi.repository import Adw
class TestHeader(unittest.TestCase):
"""Tests the Section Header."""
def setUp(self):
"""Set up common variables."""
self.header = emmental.sidebar.header.Header()
def test_init(self):
"""Test that the Header is set up properly."""
self.assertIsInstance(self.header, Gtk.Box)
self.assertIsInstance(self.header._overlay, Gtk.Overlay)
self.assertEqual(self.header.get_orientation(),
Gtk.Orientation.VERTICAL)
self.assertIsInstance(self.header._box, Gtk.Box)
self.assertEqual(self.header._box.get_spacing(), 12)
self.assertEqual(self.header._box.get_orientation(),
Gtk.Orientation.HORIZONTAL)
self.assertEqual(self.header.get_first_child(), self.header._overlay)
self.assertEqual(self.header._overlay.get_child(), self.header._box)
self.assertEqual(self.header._overlay.get_css_name(), "button")
def test_icon(self):
"""Test the icon widget and icon-name property."""
self.assertIsInstance(self.header._icon, Gtk.Image)
self.assertEqual(self.header._box.get_first_child(), self.header._icon)
self.assertEqual(self.header.icon_name, "image-missing")
self.assertEqual(self.header._icon.get_icon_name(), "image-missing")
self.assertEqual(self.header._icon.get_icon_size(), Gtk.IconSize.LARGE)
self.header.icon_name = "audio-x-generic"
self.assertEqual(self.header._icon.get_icon_name(), "audio-x-generic")
header2 = emmental.sidebar.header.Header(icon_name="audio-x-generic")
self.assertEqual(header2._icon.get_icon_name(), "audio-x-generic")
def test_title(self):
"""Test the title widget and property."""
self.assertIsInstance(self.header._title, emmental.sidebar.title.Title)
self.assertEqual(self.header._icon.get_next_sibling(),
self.header._title)
self.assertEqual(self.header.title, "")
self.assertEqual(self.header._title.title, "")
self.header.title = "Test Title"
self.assertEqual(self.header._title.title, "Test Title")
header2 = emmental.sidebar.header.Header(title="Other Title")
self.assertEqual(header2._title.title, "Other Title")
def test_subtitle(self):
"""Test the subtitle property."""
self.assertEqual(self.header.subtitle, "")
self.assertEqual(self.header._title.subtitle, "")
self.header.subtitle = "Test Subtitle"
self.assertEqual(self.header._title.subtitle, "Test Subtitle")
header2 = emmental.sidebar.header.Header(subtitle="Other Subtitle")
self.assertEqual(header2._title.subtitle, "Other Subtitle")
def test_extra_widget(self):
"""Test setting an extra widget."""
self.assertIsInstance(self.header._extra, Adw.Bin)
self.assertEqual(self.header._title.get_next_sibling(),
self.header._extra)
self.assertIsNone(self.header.extra_widget)
self.assertIsNone(self.header._extra.get_child())
self.assertEqual(self.header._extra.get_valign(), Gtk.Align.CENTER)
self.header.extra_widget = Gtk.Button()
self.assertEqual(self.header._extra.get_child(),
self.header.extra_widget)
header2 = emmental.sidebar.header.Header(extra_widget=Gtk.Button())
self.assertIsInstance(header2._extra.get_child(), Gtk.Button)
def test_active_arrow(self):
"""Test the active property and arrow widget."""
self.assertIsInstance(self.header._arrow, Gtk.Image)
self.assertEqual(self.header._arrow.get_icon_name(),
"go-down-symbolic")
self.assertEqual(self.header._extra.get_next_sibling(),
self.header._arrow)
self.assertFalse(self.header.active)
flags = self.header._arrow.get_state_flags()
self.assertFalse(flags & Gtk.StateFlags.CHECKED)
for active in [True, False]:
with self.subTest(active=active):
self.header.active = active
flags = self.header._arrow.get_state_flags()
self.assertEqual(bool(flags & Gtk.StateFlags.CHECKED), active)
def test_progress(self):
"""Test the progress proprety and progress bar widget."""
self.assertIsInstance(self.header._progress, Gtk.ProgressBar)
self.assertEqual(self.header._progress.get_valign(), Gtk.Align.END)
self.assertFalse(self.header._progress.get_visible())
self.assertTrue(self.header._progress.has_css_class("osd"))
self.assertIn(self.header._progress, self.header._overlay)
self.assertEqual(self.header.progress, 0.0)
self.assertFalse(self.header.pending)
self.header.pending = True
self.header.progress = 0.42
self.assertTrue(self.header._progress.get_visible())
self.assertAlmostEqual(self.header._progress.get_fraction(), 0.42)
header2 = emmental.sidebar.header.Header(pending=True)
self.assertTrue(header2.pending)
self.assertTrue(header2._progress.get_visible())
def test_revealer(self):
"""Test the revealer."""
self.assertIsInstance(self.header._revealer, Gtk.Revealer)
self.assertEqual(self.header._overlay.get_next_sibling(),
self.header._revealer)
self.assertEqual(self.header.animation,
Gtk.RevealerTransitionType.SLIDE_UP)
self.assertEqual(self.header._revealer.get_transition_type(),
Gtk.RevealerTransitionType.SLIDE_UP)
self.assertIsNone(self.header.reveal_widget)
self.assertIsNone(self.header._revealer.get_child())
self.header.reveal_widget = Gtk.Label()
self.assertEqual(self.header._revealer.get_child(),
self.header.reveal_widget)
self.header.active = True
self.assertTrue(self.header._revealer.get_reveal_child())
self.assertTrue(self.header._revealer.get_vexpand())
self.header.animation = Gtk.RevealerTransitionType.SLIDE_DOWN
self.assertEqual(self.header._revealer.get_transition_type(),
Gtk.RevealerTransitionType.SLIDE_DOWN)
def test_clicked(self):
"""Test clicking the header."""
self.assertIsInstance(self.header._clicked, Gtk.GestureClick)
self.assertIn(self.header._clicked,
self.header._overlay.observe_controllers())
for i in [1, 2]:
with self.subTest(i=i):
self.header._clicked.emit("released", 1, 42, 42)
self.assertTrue(self.header.active)
flags = self.header._arrow.get_state_flags()
self.assertTrue(flags & Gtk.StateFlags.CHECKED)
def test_activate(self):
"""Test the activate() function."""
self.assertFalse(self.header.active)
self.header.activate()
self.assertTrue(self.header.active)