5
from gi.repository import Gtk, GObject
6
3
from gettext import gettext as _
8
from testutils import setup_test_env
5
from tests.utils import (
7
get_mock_app_from_real_app,
9
make_recommend_app_data,
11
14
from mock import Mock, patch
13
16
from softwarecenter.db.application import Application
14
from softwarecenter.testutils import get_mock_app_from_real_app, do_events, make_recommend_app_data
17
from softwarecenter.enums import PkgStates
15
18
from softwarecenter.ui.gtk3.widgets.labels import HardwareRequirementsBox
16
from softwarecenter.ui.gtk3.views.appdetailsview import get_test_window_appdetails
17
from softwarecenter.enums import PkgStates
18
19
from softwarecenter.region import REGION_WARNING_STRING
20
from test.test_database import make_purchased_app_details
24
# window destory timeout
27
class TestAppdetailsView(unittest.TestCase):
20
from tests.gtk3.windows import get_test_window_appdetails
21
from tests.test_database import make_purchased_app_details
24
class BaseViewTestCase(unittest.TestCase):
27
app_name = "software-center"
28
pkg_state = PkgStates.UNINSTALLED
30
31
self.win = get_test_window_appdetails()
32
self.addCleanup(self.win.destroy)
31
33
self.view = self.win.get_data("view")
34
GObject.timeout_add(TIMEOUT, lambda: self.win.destroy())
35
app = Application("", self.app_name)
36
self.app_mock = get_mock_app_from_real_app(app)
37
self.app_mock.details.pkg_state = self.pkg_state
40
class TestAppdetailsView(BaseViewTestCase):
37
42
def test_videoplayer(self):
38
43
# show app with no video
50
55
self.view.show_app(mock)
52
57
self.assertTrue(self.view.videoplayer.get_property("visible"))
54
59
def test_page_pkgstates(self):
56
61
app = Application("", "abiword")
57
62
self.view.show_app(app)
60
65
# check that the action bar is given initial focus in the view
61
66
self.assertTrue(self.view.pkg_statusbar.button.is_focus())
74
79
# the states and what labels we expect in the pkgstatusbar
75
80
# first string is status text, second is button text
76
81
pkg_states_to_labels = {
77
PkgStates.INSTALLED : ("Purchased on 2011-11-20", "Remove"),
78
PkgStates.UNINSTALLED : ('Free', 'Install'),
79
PkgStates.NEEDS_PURCHASE : ('US$ 1.00', u'Buy\u2026'),
80
PkgStates.PURCHASED_BUT_REPO_MUST_BE_ENABLED : ('Purchased on 2011-11-20', 'Install'),
82
PkgStates.INSTALLED: ("Purchased on 2011-11-20", "Remove"),
83
PkgStates.UNINSTALLED: ('Free', 'Install'),
84
PkgStates.NEEDS_PURCHASE: ('US$ 1.00', u'Buy\u2026'),
85
PkgStates.PURCHASED_BUT_REPO_MUST_BE_ENABLED:
86
('Purchased on 2011-11-20', 'Install'),
82
88
# this describes if a button is visible or invisible
83
89
button_invisible = [ PkgStates.ERROR,
101
107
if state in pkg_states_to_labels:
102
108
label, button_label = pkg_states_to_labels[state]
103
109
self.assertEqual(
104
self.view.pkg_statusbar.get_label(),
110
self.view.pkg_statusbar.get_label(),
105
111
label.decode("utf-8"))
106
112
self.assertEqual(
107
113
self.view.pkg_statusbar.get_button_label().decode("utf-8"),
148
154
def test_reviews_page(self):
149
win = get_test_window_appdetails()
150
view = win.get_data("view")
151
155
# show s-c and click on more review
152
156
app = Application("", "software-center")
157
self.view.show_app(app)
154
158
self.assertEqual(view._reviews_server_page, 1)
155
view._on_more_reviews_clicked(None)
159
self.view._on_more_reviews_clicked(None)
156
160
self.assertEqual(view._reviews_server_page, 2)
157
161
# show different app, ensure page is reset
158
162
app = Application("", "apt")
163
self.view.show_app(app)
160
164
self.assertEqual(view._reviews_server_page, 1)
162
166
def test_human_readable_name_in_view(self):
237
241
@patch('softwarecenter.backend.spawn_helper.SpawnHelper.run')
238
242
def test_submit_new_review_disables_button(self, mock_run):
243
app = Application("", "2vcard")
244
self.view.show_app(app)
239
245
button = self.view.reviews.new_review
240
246
self.assertTrue(button.is_sensitive())
250
256
self.view._submit_reviews_done_callback(None, 0)
252
258
self.assertTrue(button.is_sensitive())
255
class MultipleVersionsTestCase(unittest.TestCase):
259
# Set these as class attributes as we don't modify either
261
from softwarecenter.testutils import get_test_db
262
cls.db = get_test_db()
263
cls.win = get_test_window_appdetails()
264
cls.view = cls.win.get_data("view")
267
def tearDownClass(cls):
268
GObject.timeout_add(TIMEOUT, lambda: cls.win.destroy())
272
app = Application("", "software-center")
273
self.app_mock = get_mock_app_from_real_app(app)
274
self.app_mock.details.pkg_state = PkgStates.UNINSTALLED
261
class MultipleVersionsTestCase(BaseViewTestCase):
276
263
def test_multiple_versions_automatic_button(self):
278
265
self.view.show_app(self.app_mock)
279
266
self.assertFalse(self.view.pkg_statusbar.combo_multiple_versions.get_visible())
280
267
# switch to not-automatic app with different description
281
self.app_mock.details.get_not_automatic_archive_versions = lambda: [
268
self.app_mock.details.get_not_automatic_archive_versions = lambda: [
282
269
("5.0", "precise"),
283
270
("12.0", "precise-backports"),
290
277
def test_combo_multiple_versions(self):
291
278
self.app_mock.details.get_not_automatic_archive_versions = lambda: [
292
279
("5.0", "precise"),
293
("12.0", "precise-backports")
280
("12.0", "precise-backports")
295
282
# ensure that the right method is called
296
283
self.app_mock.details.force_not_automatic_archive_suite = Mock()
305
292
def test_installed_multiple_version_default(self):
306
293
self.app_mock.details.get_not_automatic_archive_versions = lambda: [
307
294
("5.0", "precise"),
308
("12.0", "precise-backports")
295
("12.0", "precise-backports")
310
297
self.app_mock.details.pkg_state = PkgStates.INSTALLED
311
298
self.app_mock.details.version = "12.0"
332
319
#self.assertEqual(call_args, (("precise",), {}))
333
320
# ensure the button changes
334
321
self.assertEqual(self.view.pkg_statusbar.button.get_label(), "Change")
337
class HardwareRequirementsTestCase(unittest.TestCase):
341
# Set these as class attributes as we don't modify either
343
from softwarecenter.testutils import get_test_db
344
cls.db = get_test_db()
345
cls.win = get_test_window_appdetails()
346
cls.view = cls.win.get_data("view")
349
def tearDownClass(cls):
350
GObject.timeout_add(TIMEOUT, lambda: cls.win.destroy())
354
app = Application("", "software-center")
355
self.app_mock = get_mock_app_from_real_app(app)
356
self.app_mock.details.pkg_state = PkgStates.UNINSTALLED
324
class HardwareRequirementsTestCase(BaseViewTestCase):
358
326
def test_show_hardware_requirements(self):
359
self.app_mock.details.hardware_requirements = {
360
'hardware::video:opengl' : 'yes',
361
'hardware::gps' : 'no',
327
self.app_mock.details.hardware_requirements = {
328
'hardware::video:opengl': 'yes',
329
'hardware::gps': 'no',
363
331
self.app_mock.details.hardware_requirements_satisfied = False
364
332
self.view.show_app(self.app_mock)
378
346
self.app_mock.details.pkg_state = PkgStates.NEEDS_PURCHASE
379
347
self.view.show_app(self.app_mock)
380
348
self.assertEqual(
381
self.view.pkg_statusbar.button.get_label(),
349
self.view.pkg_statusbar.button.get_label(),
382
350
_(u"Buy Anyway\u2026").encode("utf-8"))
383
351
# check if the warning bar is displayed
384
352
self.assertTrue(self.view.pkg_warningbar.get_property("visible"))
401
369
self.app_mock.details.pkg_state = PkgStates.NEEDS_PURCHASE
402
370
self.view.show_app(self.app_mock)
403
371
self.assertEqual(
404
self.view.pkg_statusbar.button.get_label(),
372
self.view.pkg_statusbar.button.get_label(),
405
373
_(u'Buy\u2026').encode("utf-8"))
406
374
# check if the warning bar is invisible
407
375
self.assertFalse(self.view.pkg_warningbar.get_property("visible"))
409
class RegionRequirementsTestCase(unittest.TestCase):
413
# Set these as class attributes as we don't modify either
415
from softwarecenter.testutils import get_test_db
416
cls.db = get_test_db()
417
cls.win = get_test_window_appdetails()
418
cls.view = cls.win.get_data("view")
421
def tearDownClass(cls):
422
GObject.timeout_add(TIMEOUT, lambda: cls.win.destroy())
426
app = Application("", "software-center")
427
self.app_mock = get_mock_app_from_real_app(app)
428
self.app_mock.details.pkg_state = PkgStates.UNINSTALLED
378
class RegionRequirementsTestCase(BaseViewTestCase):
430
380
def test_show_region_requirements(self):
431
381
self.app_mock.details.region_requirements_satisfied = False
438
388
self.app_mock.details.pkg_state = PkgStates.NEEDS_PURCHASE
439
389
self.view.show_app(self.app_mock)
440
390
self.assertEqual(
441
self.view.pkg_statusbar.button.get_label(),
391
self.view.pkg_statusbar.button.get_label(),
442
392
_(u"Buy Anyway\u2026").encode("utf-8"))
443
393
# check if the warning bar is displayed
444
394
self.assertTrue(self.view.pkg_warningbar.get_property("visible"))
446
396
REGION_WARNING_STRING)
449
class PurchasedAppDetailsStatusBarTestCase(unittest.TestCase):
453
# Set these as class attributes as we don't modify either
455
from softwarecenter.testutils import get_test_db
456
cls.db = get_test_db()
457
cls.win = get_test_window_appdetails()
460
def tearDownClass(cls):
461
GObject.timeout_add(TIMEOUT, lambda: cls.win.destroy())
399
class PurchasedAppDetailsStatusBarTestCase(BaseViewTestCase):
464
401
def _make_statusbar_view_for_state(self, state):
465
402
app_details = make_purchased_app_details(db=self.db)
537
474
self.assertEqual(
539
476
all_method_calls)
541
class AppRecommendationsTestCase(unittest.TestCase):
545
# Set these as class attributes as we don't modify either
547
cls.win = get_test_window_appdetails()
548
cls.view = cls.win.get_data("view")
549
from softwarecenter.testutils import get_test_db
550
cls.db = get_test_db()
553
def tearDownClass(cls):
554
GObject.timeout_add(TIMEOUT, lambda: cls.win.destroy())
558
app = Application("", "pitivi")
559
self.app_mock = get_mock_app_from_real_app(app)
560
self.app_mock.details.pkg_state = PkgStates.UNINSTALLED
479
class AppRecommendationsTestCase(BaseViewTestCase):
562
483
def on_query_done(self, recagent, data):
563
print "query done, data: '%s'" % data
484
# print "query done, data: '%s'" % data
566
487
def on_query_error(self, recagent, error):
567
print "query error received: ", error
488
# print "query error received: ", error
569
490
self.error = True
574
495
def test_show_recommendations_for_app(self, mock_query):
575
496
self.view.show_app(self.app_mock)
577
self.view.recommended_for_app_panel._update_app_recommendations_content()
498
panel = self.view.recommended_for_app_panel
499
panel._update_app_recommendations_content()
579
501
# we fake the callback from the agent here
580
self.view.recommended_for_app_panel.app_recommendations_cat._recommend_app_result(
502
panel.app_recommendations_cat._recommend_app_result(None,
582
503
make_recommend_app_data())
583
504
self.assertNotEqual(
584
self.view.recommended_for_app_panel.app_recommendations_cat.get_documents(self.db), [])
505
panel.app_recommendations_cat.get_documents(self.db), [])
587
508
if __name__ == "__main__":
589
logging.basicConfig(level=logging.DEBUG)