1
3
from gi.repository import Gtk
4
4
from mock import patch, Mock
6
6
from testutils import setup_test_env
9
import softwarecenter.distro
10
import softwarecenter.paths
12
from softwarecenter.db.database import StoreDatabase
9
13
from softwarecenter.enums import SortMethods
10
from softwarecenter.testutils import (get_test_db,
11
make_recommender_agent_recommend_me_dict)
13
class TestCatView(unittest.TestCase):
14
from softwarecenter.testutils import (
19
make_recommender_agent_recommend_me_dict,
22
from softwarecenter.ui.gtk3.views import catview_gtk
23
from softwarecenter.ui.gtk3.views.catview_gtk import get_test_window_catview
24
from softwarecenter.ui.gtk3.widgets.containers import FramedHeaderBox
25
from softwarecenter.ui.gtk3.widgets.spinner import SpinnerNotebook
28
class CatViewBaseTestCase(unittest.TestCase):
32
cls.db = get_test_db()
16
self.db = get_test_db()
36
self.win = get_test_window_catview(self.db)
37
self.addCleanup(self.win.destroy)
38
self.notebook = self.win.get_child()
39
self.lobby = self.win.get_data("lobby")
40
self.subcat_view = self.win.get_data("subcat")
41
self.rec_panel = self.lobby.recommended_for_you_panel
18
43
def _on_category_selected(self, subcatview, category):
19
#print "**************", subcatview, category
20
44
self._cat = category
22
def test_subcatview_top_rated(self):
23
from softwarecenter.ui.gtk3.views.catview_gtk import get_test_window_catview
24
# get the widgets we need
25
win = get_test_window_catview()
26
lobby = win.get_data("lobby")
47
class TopAndWhatsNewTestCase(CatViewBaseTestCase):
49
def test_top_rated(self):
28
50
# simulate review-stats refresh
29
lobby._update_top_rated_content = Mock()
30
lobby.reviews_loader.emit("refresh-review-stats-finished", [])
31
self.assertTrue(lobby._update_top_rated_content.called)
51
self.lobby._update_top_rated_content = Mock()
52
self.lobby.reviews_loader.emit("refresh-review-stats-finished", [])
53
self.assertTrue(self.lobby._update_top_rated_content.called)
33
55
# test clicking top_rated
34
lobby.connect("category-selected", self._on_category_selected)
35
lobby.top_rated_frame.more.clicked()
56
self.lobby.connect("category-selected", self._on_category_selected)
57
self.lobby.top_rated_frame.more.clicked()
37
59
self.assertNotEqual(self._cat, None)
38
60
self.assertEqual(self._cat.name, "Top Rated")
39
61
self.assertEqual(self._cat.sortmode, SortMethods.BY_TOP_RATED)
42
def test_subcatview_new(self):
43
from softwarecenter.ui.gtk3.views.catview_gtk import get_test_window_catview
44
# get the widgets we need
45
win = get_test_window_catview()
46
lobby = win.get_data("lobby")
48
64
# test db reopen triggers whats-new update
49
lobby._update_whats_new_content = Mock()
50
lobby.db.emit("reopen")
51
self.assertTrue(lobby._update_whats_new_content.called)
65
self.lobby._update_whats_new_content = Mock()
66
self.lobby.db.emit("reopen")
67
self.assertTrue(self.lobby._update_whats_new_content.called)
53
69
# test clicking new
54
lobby.connect("category-selected", self._on_category_selected)
55
lobby.whats_new_frame.more.clicked()
70
self.lobby.connect("category-selected", self._on_category_selected)
71
self.lobby.whats_new_frame.more.clicked()
57
73
self.assertNotEqual(self._cat, None)
58
74
# encoding is utf-8 (since r2218, see category.py)
59
75
self.assertEqual(self._cat.name, 'What\xe2\x80\x99s New')
60
76
self.assertEqual(self._cat.sortmode, SortMethods.BY_CATALOGED_TIME)
63
def test_subcatview_new_no_sort_info_yet(self):
78
def test_new_no_sort_info_yet(self):
64
79
# ensure that we don't show a empty "whats new" category
66
81
from softwarecenter.testutils import get_test_db
97
112
self.assertFalse(view.whats_new_frame.get_property("visible"))
101
def test_subcatview_recommended_for_you_opt_in_display(self):
103
# patch the recommender UUID value to insure that we are not opted-in for this test
104
get_recommender_opted_in_patcher = patch('softwarecenter.backend.recagent.RecommenderAgent.is_opted_in')
105
self.addCleanup(get_recommender_opted_in_patcher.stop)
106
mock_get_recommender_opted_in = get_recommender_opted_in_patcher.start()
107
mock_get_recommender_opted_in.return_value = False
109
from softwarecenter.ui.gtk3.views.catview_gtk import get_test_window_catview
110
# get the widgets we need
111
win = get_test_window_catview()
112
lobby = win.get_data("lobby")
113
rec_panel = lobby.recommended_for_you_panel
115
from softwarecenter.ui.gtk3.widgets.containers import FramedHeaderBox
116
self.assertTrue(rec_panel.spinner_notebook.get_current_page() == FramedHeaderBox.CONTENT)
117
self.assertTrue(rec_panel.opt_in_vbox.get_property("visible"))
120
# patch out the agent query method to avoid making the actual server call
121
@patch('softwarecenter.backend.recagent.RecommenderAgent'
122
'.post_submit_profile')
123
def test_subcatview_recommended_for_you_spinner_display(self, mock_query):
125
# patch the recommender UUID value to insure that we are not opted-in for this test
126
get_recommender_opted_in_patcher = patch('softwarecenter.backend.recagent.RecommenderAgent.is_opted_in')
127
self.addCleanup(get_recommender_opted_in_patcher.stop)
128
mock_get_recommender_opted_in = get_recommender_opted_in_patcher.start()
129
mock_get_recommender_opted_in.return_value = False
131
from softwarecenter.ui.gtk3.views.catview_gtk import get_test_window_catview
132
# get the widgets we need
133
win = get_test_window_catview()
134
lobby = win.get_data("lobby")
135
rec_panel = lobby.recommended_for_you_panel
137
# click the opt-in button to initiate the process, this will show the spinner
138
rec_panel.opt_in_button.emit('clicked')
140
from softwarecenter.ui.gtk3.widgets.spinner import SpinnerNotebook
141
self.assertTrue(rec_panel.spinner_notebook.get_current_page() == SpinnerNotebook.SPINNER_PAGE)
142
self.assertTrue(rec_panel.opt_in_vbox.get_property("visible"))
145
# patch out the agent query method to avoid making the actual server call
146
@patch('softwarecenter.backend.recagent.RecommenderAgent'
147
'.post_submit_profile')
148
def test_subcatview_recommended_for_you_display_recommendations(self, mock_query):
150
# patch the recommender UUID value to insure that we are not opted-in for this test
151
get_recommender_opted_in_patcher = patch('softwarecenter.backend.recagent.RecommenderAgent.is_opted_in')
152
self.addCleanup(get_recommender_opted_in_patcher.stop)
153
mock_get_recommender_opted_in = get_recommender_opted_in_patcher.start()
154
mock_get_recommender_opted_in.return_value = False
156
from softwarecenter.ui.gtk3.views.catview_gtk import get_test_window_catview
157
# get the widgets we need
158
win = get_test_window_catview()
159
lobby = win.get_data("lobby")
160
rec_panel = lobby.recommended_for_you_panel
162
# click the opt-in button to initiate the process, this will show the spinner
163
rec_panel.opt_in_button.emit('clicked')
165
rec_panel._update_recommended_for_you_content()
115
class RecommendationsTestCase(CatViewBaseTestCase):
116
"""The test suite for the recommendations ."""
119
@patch('softwarecenter.backend.recagent.RecommenderAgent.is_opted_in')
120
def disabled_test_recommended_for_you_opt_in_display(
121
self, mock_get_recommender_opted_in):
122
# patch the recommender UUID value to ensure that we are not opted-in
124
mock_get_recommender_opted_in.return_value = False
126
do_events_with_sleep()
127
self.assertEqual(self.rec_panel.spinner_notebook.get_current_page(),
128
FramedHeaderBox.CONTENT)
129
self.assertTrue(self.rec_panel.opt_in_vbox.get_property("visible"))
132
# patch out the agent query method to avoid making the actual server call
133
@patch('softwarecenter.backend.recagent.RecommenderAgent.is_opted_in')
134
@patch('softwarecenter.backend.recagent.RecommenderAgent'
135
'.post_submit_profile')
136
def disabled_test_recommended_for_you_spinner_display(
137
self, mock_query, mock_get_recommender_opted_in):
138
# patch the recommender UUID value to insure that we are not opted-in
140
mock_get_recommender_opted_in.return_value = False
142
# click the opt-in button to initiate the process,
143
# this will show the spinner
144
self.rec_panel.opt_in_button.emit('clicked')
145
do_events_with_sleep()
146
self.assertEqual(self.rec_panel.spinner_notebook.get_current_page(),
147
SpinnerNotebook.SPINNER_PAGE)
148
self.assertTrue(self.rec_panel.opt_in_vbox.get_property("visible"))
150
# patch out the agent query method to avoid making the actual server call
151
@patch('softwarecenter.backend.recagent.RecommenderAgent.is_opted_in')
152
@patch('softwarecenter.backend.recagent.RecommenderAgent'
153
'.post_submit_profile')
154
def test_recommended_for_you_display_recommendations(self,
155
mock_query, mock_get_recommender_opted_in):
156
# patch the recommender UUID value to insure that we are not opted-in
158
mock_get_recommender_opted_in.return_value = False
160
# click the opt-in button to initiate the process,
161
# this will show the spinner
162
self.rec_panel.opt_in_button.emit('clicked')
164
self.rec_panel._update_recommended_for_you_content()
167
166
# we fake the callback from the agent here
168
lobby.recommended_for_you_panel.recommended_for_you_cat._recommend_me_result(
170
make_recommender_agent_recommend_me_dict())
172
lobby.recommended_for_you_panel.recommended_for_you_cat.get_documents(self.db), [])
173
from softwarecenter.ui.gtk3.widgets.spinner import SpinnerNotebook
174
self.assertTrue(rec_panel.spinner_notebook.get_current_page() == SpinnerNotebook.CONTENT_PAGE)
167
for_you = self.lobby.recommended_for_you_panel.recommended_for_you_cat
168
for_you._recommend_me_result(None,
169
make_recommender_agent_recommend_me_dict())
170
self.assertNotEqual(for_you.get_documents(self.db), [])
171
self.assertEqual(self.rec_panel.spinner_notebook.get_current_page(),
172
SpinnerNotebook.CONTENT_PAGE)
176
174
# test clicking recommended_for_you More button
177
lobby.connect("category-selected", self._on_category_selected)
178
lobby.recommended_for_you_panel.more.clicked()
175
self.lobby.connect("category-selected", self._on_category_selected)
176
self.lobby.recommended_for_you_panel.more.clicked()
177
# this is delayed for some reason so we need to sleep here
178
do_events_with_sleep()
180
179
self.assertNotEqual(self._cat, None)
181
180
self.assertEqual(self._cat.name, "Recommended For You")
184
182
# patch out the agent query method to avoid making the actual server call
183
@patch('softwarecenter.backend.recagent.RecommenderAgent.is_opted_in')
185
184
@patch('softwarecenter.backend.recagent.RecommenderAgent'
186
185
'.query_recommend_me')
187
def test_subcatview_recommended_for_you_display_recommendations_not_opted_in(self, mock_query):
189
# patch the recommender UUID value to insure that we are not opted-in for this test
190
get_recommender_opted_in_patcher = patch('softwarecenter.backend.recagent.RecommenderAgent.is_opted_in')
191
self.addCleanup(get_recommender_opted_in_patcher.stop)
192
mock_get_recommender_opted_in = get_recommender_opted_in_patcher.start()
186
def test_recommended_for_you_display_recommendations_not_opted_in(self,
187
mock_query, mock_get_recommender_opted_in):
188
# patch the recommender UUID value to insure that we are not opted-in
193
190
mock_get_recommender_opted_in.return_value = False
195
from softwarecenter.ui.gtk3.views.catview_gtk import get_test_window_catview
196
# get the widgets we need
197
win = get_test_window_catview()
198
192
# we want to work in the "subcat" view
199
notebook = win.get_child()
202
subcat_view = win.get_data("subcat")
204
self.assertFalse(subcat_view.recommended_for_you_in_cat.get_property("visible"))
193
self.notebook.next_page()
196
visible = self.subcat_view.recommended_for_you_in_cat.get_property(
198
self.assertFalse(visible)
207
200
# patch out the agent query method to avoid making the actual server call
201
@patch('softwarecenter.backend.recagent.RecommenderAgent.is_opted_in')
208
202
@patch('softwarecenter.backend.recagent.RecommenderAgent'
209
203
'.query_recommend_me')
210
def test_subcatview_recommended_for_you_display_recommendations_opted_in(self, mock_query):
212
# patch the recommender UUID value to insure that we are not opted-in for this test
213
get_recommender_opted_in_patcher = patch('softwarecenter.backend.recagent.RecommenderAgent.is_opted_in')
214
self.addCleanup(get_recommender_opted_in_patcher.stop)
215
mock_get_recommender_opted_in = get_recommender_opted_in_patcher.start()
204
def test_recommended_for_you_display_recommendations_opted_in(
205
self, mock_query, mock_get_recommender_opted_in):
206
# patch the recommender UUID value to insure that we are not opted-in
216
208
mock_get_recommender_opted_in.return_value = True
218
from softwarecenter.ui.gtk3.views.catview_gtk import get_test_window_catview
219
# get the widgets we need
220
win = get_test_window_catview()
221
210
# we want to work in the "subcat" view
222
notebook = win.get_child()
225
subcat_view = win.get_data("subcat")
226
rec_cat_panel = subcat_view.recommended_for_you_in_cat
211
self.notebook.next_page()
213
rec_cat_panel = self.subcat_view.recommended_for_you_in_cat
228
214
rec_cat_panel._update_recommended_for_you_content()
230
216
# we fake the callback from the agent here
231
217
rec_cat_panel.recommended_for_you_cat._recommend_me_result(
233
219
make_recommender_agent_recommend_me_dict())
234
result_docs = rec_cat_panel.recommended_for_you_cat.get_documents(self.db)
220
result_docs = rec_cat_panel.recommended_for_you_cat.get_documents(
235
222
self.assertNotEqual(result_docs, [])
236
# check that we are getting the correct number of results, corresponding
237
# to the following Internet items:
223
# check that we are getting the correct number of results,
224
# corresponding to the following Internet items:
238
225
# Mangler, Midori, Midori Private Browsing, Psi
239
226
self.assertTrue(len(result_docs) == 4)
240
from softwarecenter.ui.gtk3.widgets.spinner import SpinnerNotebook
241
self.assertTrue(rec_cat_panel.spinner_notebook.get_current_page() == SpinnerNotebook.CONTENT_PAGE)
227
self.assertEqual(rec_cat_panel.spinner_notebook.get_current_page(),
228
SpinnerNotebook.CONTENT_PAGE)
242
229
# check that the tiles themselves are visible
244
self.assertTrue(rec_cat_panel.recommended_for_you_content.get_property("visible"))
245
self.assertTrue(rec_cat_panel.recommended_for_you_content.get_children()[0].title.get_property("visible"))
231
self.assertTrue(rec_cat_panel.recommended_for_you_content.get_property(
233
self.assertTrue(rec_cat_panel.recommended_for_you_content.get_children(
234
)[0].title.get_property("visible"))
247
236
# test clicking recommended_for_you More button
248
subcat_view.connect("category-selected", self._on_category_selected)
237
self.subcat_view.connect(
238
"category-selected", self._on_category_selected)
249
239
rec_cat_panel.more.clicked()
240
# this is delayed for some reason so we need to sleep here
241
do_events_with_sleep()
251
242
self.assertNotEqual(self._cat, None)
252
243
self.assertEqual(self._cat.name, "Recommended For You in Internet")
258
while Gtk.events_pending():
246
class ExhibitsTestCase(unittest.TestCase):
247
"""The test suite for the exhibits carousel."""
250
self.datadir = softwarecenter.paths.datadir
251
self.desktopdir = softwarecenter.paths.APP_INSTALL_PATH
252
self.cache = FakedCache()
253
self.db = StoreDatabase(cache=self.cache)
254
self.lobby = catview_gtk.LobbyViewGtk(datadir=self.datadir,
255
desktopdir=self.desktopdir, cache=self.cache, db=self.db,
256
icons=None, apps_filter=None)
257
self.addCleanup(self.lobby.destroy)
259
def _get_banner_from_lobby(self):
260
return self.lobby.vbox.get_children()[-1].get_child()
262
def test_featured_exhibit_by_default(self):
263
"""Show the featured exhibit before querying the remote service."""
264
self.lobby._append_banner_ads()
266
banner = self._get_banner_from_lobby()
267
self.assertEqual(1, len(banner.exhibits))
268
self.assertIsInstance(banner.exhibits[0], catview_gtk.FeaturedExhibit)
270
def test_no_exhibit_if_not_available(self):
271
"""The exhibit should not be shown if the package is not available."""
273
exhibit.package_names = u'foobarbaz'
275
sca = ObjectWithSignals()
276
sca.query_exhibits = lambda: sca.emit('exhibits', sca, [exhibit])
278
with patch.object(catview_gtk, 'SoftwareCenterAgent', lambda: sca):
279
self.lobby._append_banner_ads()
281
banner = self._get_banner_from_lobby()
282
self.assertEqual(1, len(banner.exhibits))
283
self.assertIsInstance(banner.exhibits[0], catview_gtk.FeaturedExhibit)
285
def test_exhibit_if_available(self):
286
"""The exhibit should be shown if the package is available."""
288
exhibit.package_names = u'foobarbaz'
289
exhibit.banner_url = 'banner'
290
exhibit.title_translated = ''
292
self.cache[u'foobarbaz'] = Mock()
294
sca = ObjectWithSignals()
295
sca.query_exhibits = lambda: sca.emit('exhibits', sca, [exhibit])
297
with patch.object(catview_gtk, 'SoftwareCenterAgent', lambda: sca):
298
self.lobby._append_banner_ads()
300
banner = self._get_banner_from_lobby()
301
self.assertEqual(1, len(banner.exhibits))
302
self.assertIs(banner.exhibits[0], exhibit)
304
def test_exhibit_if_mixed_availability(self):
305
"""The exhibit should be shown even if some are not available."""
308
exhibit.package_names = u'foobarbaz'
309
exhibit.banner_url = 'banner'
310
exhibit.title_translated = ''
312
self.cache[u'foobarbaz'] = Mock()
314
# not available exhibit
316
other.package_names = u'not-there'
318
sca = ObjectWithSignals()
319
sca.query_exhibits = lambda: sca.emit('exhibits', sca,
322
with patch.object(catview_gtk, 'SoftwareCenterAgent', lambda: sca):
323
self.lobby._append_banner_ads()
325
banner = self._get_banner_from_lobby()
326
self.assertEqual(1, len(banner.exhibits))
327
self.assertIs(banner.exhibits[0], exhibit)
263
330
if __name__ == "__main__":