~mmcg069/software-center/Bug625443

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/usr/bin/python

import apt
import glib
import gtk
import logging
from mock import Mock
import os
import subprocess
import sys
import time
import unittest

sys.path.insert(0, "..")

from softwarecenter.app import SoftwareCenterApp
from softwarecenter.enums import XAPIAN_BASE_PATH
from softwarecenter.view.appview import AppStore
from softwarecenter.view.availablepane import AvailablePane
from softwarecenter.db.application import Application
from softwarecenter.view.catview import get_category_by_name
from softwarecenter.backend import get_install_backend

# we make app global as its relatively expensive to create
# and in setUp it would be created and destroyed for each
# test
apt.apt_pkg.config.set("Dir::log::history", "/tmp")
#apt.apt_pkg.config.set("Dir::state::lists", "/tmp")
mock_options = Mock()
mock_options.enable_lp = False
mock_options.enable_buy = True
app = SoftwareCenterApp("../data", XAPIAN_BASE_PATH, mock_options)
app.window_main.show_all()

class TestGUIWithMainLoop(unittest.TestCase):

    def setUp(self):
        self.app = app
    
    def _trigger_channel_change(self):
        # reset
        self.app.available_pane.on_navigation_category(None, None)
        self._p()
        # navigate to first app
        self._navigate_to_first_app()
        # trigger channels changed signal
        self.app.backend.emit("channels-changed", True)
        self._p()
        # we just add bools here and do the asserts in the test_ function,
        # otherwise unittest gets confused
        # make sure we stay on the same page
        self._on_the_right_page = (self.app.available_pane.notebook.get_current_page() == self.app.available_pane.PAGE_APP_DETAILS)
        # there was a bug that makes the actionbar appear in the details
        # view, make sure this does not happen again
        self._action_bar_hidden = (self.app.available_pane.action_bar.get_property("visible") == False)
        # done
        self.app.on_menuitem_close_activate(None)

    def test_action_bar_visible_in_details_on_channel_change(self):
        glib.timeout_add_seconds(1, self._trigger_channel_change)
        gtk.main()
        self.assertTrue(self._on_the_right_page)
        self.assertTrue(self._action_bar_hidden)

    def _trigger_test_channel_view(self, condition):
        # reset
        self.app.available_pane.on_navigation_category(None, None)
        self._p()
        # go to the second channel
        column = self.app.view_switcher.get_column(0)
        self.app.view_switcher.set_cursor((0,1), column)
        self._p()
        # activate first app
        column = self.app.channel_pane.app_view.get_column(0)
        self.app.channel_pane.app_view.row_activated((0,), column)
        self._p()
        # now simulate a the condition
        if condition == "channels-changed":
            self.app.backend.emit("channels-changed", True)
        elif condition == "db-reopen":
            self.app.db.emit("reopen")
        elif condition == "cache-ready":
            self.app.cache.emit("cache-ready")
        else:
            self.assertNotReached("unknown condition")
        self._p()
        # we just add bools here and do the asserts in the test_ function,
        # make sure we stay on the same page
        self._on_the_right_channel_view_page = (self.app.channel_pane.notebook.get_current_page() == self.app.channel_pane.PAGE_APP_DETAILS)
        # done
        self.app.on_menuitem_close_activate(None)

    def test_channel_view(self):
        glib.timeout_add_seconds(1, self._trigger_test_channel_view, "channels-changed")
        gtk.main()
        self.assertTrue(self._on_the_right_channel_view_page)

    def test_channel_view_on_db_reopen(self):
        glib.timeout_add_seconds(1, self._trigger_test_channel_view, "db-reopen")
        gtk.main()
        self.assertTrue(self._on_the_right_channel_view_page)

    def test_channel_view_on_cache_ready(self):
        glib.timeout_add_seconds(1, self._trigger_test_channel_view, "cache-ready")
        gtk.main()
        self.assertTrue(self._on_the_right_channel_view_page)

    def _navigate_to_first_app(self):
        # go to first category
        cat = self.app.available_pane.cat_view.categories[0]
        self.app.available_pane.cat_view.emit("category-selected", cat)
        self._p()
        # go to first app
        column = self.app.available_pane.app_view.get_column(0)
        self.app.available_pane.app_view.row_activated((0,), column)

    def _p(self):
        """ process gtk events """
        while gtk.events_pending():
            gtk.main_iteration()

if __name__ == "__main__":
    if len(sys.argv) > 1 and sys.argv[1] == "-v":
        from softwarecenter.log import root
        root.setLevel(level=logging.DEBUG)
    unittest.main()