4
from gi.repository import Gtk
7
from testutils import setup_test_env
10
from softwarecenter.ui.gtk3.widgets import spinner
13
class SpinnerNotebookTestCase(unittest.TestCase):
14
"""The test case for the SpinnerNotebook."""
16
_fake_timeout_id = object()
19
# helpers to check the timeout's callbacks
23
self.content = Gtk.Label('My test')
25
self.addCleanup(self.content.hide)
26
self.addCleanup(self.content.destroy)
28
self.obj = spinner.SpinnerNotebook(self.content)
29
self.addCleanup(self.obj.hide)
30
self.addCleanup(self.obj.destroy)
31
assert spinner.SOFTWARE_CENTER_DEBUG_TABS not in os.environ
35
def _fake_timeout_add(self, interval, callback):
36
self._interval = interval
37
self._callback = callback
38
return self._fake_timeout_id
40
def _fake_source_remove(self, event_id):
41
if event_id is self._fake_timeout_id:
42
self._fake_timeout_id = None
45
def test_no_borders(self):
46
"""The notebook has no borders."""
47
self.assertFalse(self.obj.get_show_border())
49
def test_no_tabs(self):
50
"""The notebook has no visible tabs."""
51
self.assertFalse(self.obj.get_show_tabs())
53
def test_tabs_if_debug_set(self):
54
"""The notebook has visible tabs if debug is set."""
55
with patch.object(spinner, 'SOFTWARE_CENTER_DEBUG_TABS', True):
56
self.obj = spinner.SpinnerNotebook(self.content)
57
self.assertTrue(self.obj.get_show_tabs())
59
def test_has_two_pages(self):
60
"""The notebook has two pages."""
61
self.assertEqual(self.obj.get_n_pages(), 2)
63
def test_has_content(self):
64
"""The notebook has the given content."""
65
self.assertEqual(self.obj.get_nth_page(self.obj.CONTENT_PAGE),
68
def test_has_spinner(self):
69
"""The notebook has the spinner view."""
70
self.assertEqual(self.obj.get_nth_page(self.obj.SPINNER_PAGE),
71
self.obj.spinner_view)
72
self.assertTrue(self.obj.spinner_view.get_visible())
74
def test_show_content_by_default(self):
75
"""The content tab is shown by default."""
76
self.assertEqual(self.obj.get_current_page(), self.obj.CONTENT_PAGE)
78
def test_show_spinner(self):
79
"""The spinner is shown only after the timeout occurs."""
80
assert self._interval is None
81
assert self._callback is None
83
with patch.object(spinner.GObject, 'timeout_add',
84
self._fake_timeout_add):
85
self.obj.show_spinner()
87
# this must hold before the callback is fired
88
self.assertEqual(self.obj.get_current_page(), self.obj.CONTENT_PAGE)
89
self.assertFalse(self.obj.spinner_view.spinner.get_property('active'))
90
self.assertFalse(self.obj.spinner_view.spinner.get_visible())
91
self.assertEqual(self._interval, 250)
92
self.assertEqual(self._callback, self.obj._unmask_view_spinner)
94
result = self._callback() # fire the timeout
96
# this must hold after the callback is fired
97
self.assertFalse(result, 'The timeout callback should return False.')
98
self.assertTrue(self.obj.spinner_view.spinner.get_property('active'))
99
self.assertTrue(self.obj.spinner_view.spinner.get_visible())
100
self.assertEqual(self.obj.get_current_page(), self.obj.SPINNER_PAGE)
102
def test_show_spinner_with_msg(self):
103
"""The spinner is shown with the given message."""
104
message = 'Something I want to show'
105
with patch.object(spinner.GObject, 'timeout_add', lambda *a: None):
106
self.obj.show_spinner(msg=message)
108
self.assertEqual(self.obj.spinner_view.get_text(), message)
110
def test_hide_spinner_before_timeout(self):
111
"""The spinner is hidden cancelling the timeout."""
112
with patch.object(spinner.GObject, 'timeout_add',
113
self._fake_timeout_add):
114
self.obj.show_spinner()
116
with patch.object(spinner.GObject, 'source_remove',
117
self._fake_source_remove):
118
self.obj.hide_spinner()
120
# hide_spinner should call source_remove with the proper event id,
121
# which in turn will set the _fake_timeout_id to None
122
self.assertTrue(self._fake_timeout_id is None,
123
'The timeout should be removed by calling GObject.source_remove')
124
# the content page is shown
125
self.assertEqual(self.obj.get_current_page(), self.obj.CONTENT_PAGE)
126
# the spinner is stoppped and hidden
127
self.assertFalse(self.obj.spinner_view.spinner.get_property('active'))
128
self.assertFalse(self.obj.spinner_view.spinner.get_visible())
130
def test_hide_spinner_after_timeout(self):
131
"""The spinner is hidden without cancelling the timeout."""
132
with patch.object(spinner.GObject, 'timeout_add',
133
self._fake_timeout_add):
134
self.obj.show_spinner()
136
self._callback() # fake the timeout being fired
138
with patch.object(spinner.GObject, 'source_remove',
139
self._fake_source_remove):
140
self.obj.hide_spinner()
142
self.assertTrue(self._fake_timeout_id is not None,
143
'GObject.source_remove should not be called if already fired.')
144
# the content page is shown
145
self.assertEqual(self.obj.get_current_page(), self.obj.CONTENT_PAGE)
146
# the spinner is stoppped and hidden
147
self.assertFalse(self.obj.spinner_view.spinner.get_property('active'))
148
self.assertFalse(self.obj.spinner_view.spinner.get_visible())
151
if __name__ == "__main__":