14
sys.path.insert(0, "..")
16
from softwarecenter.app import SoftwareCenterApp
17
from softwarecenter.paths import XAPIAN_BASE_PATH
18
from softwarecenter.ui.gtk.appview import AppStore
19
from softwarecenter.ui.gtk.availablepane import AvailablePane
20
from softwarecenter.db.application import Application
21
from softwarecenter.ui.gtk.catview_gtk import get_category_by_name
22
from softwarecenter.backend import get_install_backend
24
# needed for the install test
26
subprocess.call(["dpkg", "-r", "4g8"])
28
# we make app global as its relatively expensive to create
29
# and in setUp it would be created and destroyed for each
31
apt.apt_pkg.config.set("Dir::log::history", "/tmp")
32
#apt.apt_pkg.config.set("Dir::state::lists", "/tmp")
34
mock_options.enable_lp = False
35
mock_options.enable_buy = True
36
mock_options.disable_apt_xapian_index = False
37
app = SoftwareCenterApp("../data", XAPIAN_BASE_PATH, mock_options)
38
app.window_main.show_all()
40
class TestGUI(unittest.TestCase):
46
def test_supported_only(self):
47
""" test if clicking on the "supported only" menuitems
48
really makes the the amount of items smaller
51
items_all = self.app.label_status.get_text()
52
self.app.menuitem_view_supported_only.activate()
53
items_supported = self.app.label_status.get_text()
54
self.assertNotEqual(items_all, items_supported)
55
len_all = int(items_all.split()[0])
56
len_supported = int(items_supported.split()[0])
57
self.assertTrue(len_all > len_supported)
59
def test_categories_and_back_forward(self):
62
# find games, ensure its there and select it
63
self.assertEqual(self.app.available_pane.notebook.get_current_page(),
64
AvailablePane.PAGE_CATEGORY)
65
cat = get_category_by_name(self.app.available_pane.cat_view.categories,
67
self.assertNotEqual(cat, None)
68
self.app.available_pane.cat_view.emit("category-selected", cat)
70
# we have a subcategory, ensure we really see it
71
cat = get_category_by_name(self.app.available_pane.subcategories_view.categories,
73
self.assertNotEqual(cat, None)
74
self.assertEqual(self.app.available_pane.notebook.get_current_page(),
75
AvailablePane.PAGE_SUBCATEGORY)
76
# click on the subcategory and ensure we get a list
77
self.app.available_pane.subcategories_view.emit("category-selected", cat)
79
self.assertEqual(self.app.available_pane.notebook.get_current_page(),
80
AvailablePane.PAGE_APPLIST)
82
treeview = self.app.available_pane.app_view
83
model = treeview.get_model()
84
treeview.row_activated(model.get_path(model.get_iter_root()),
85
treeview.get_column(0))
87
self.assertEqual(self.app.available_pane.notebook.get_current_page(),
88
AvailablePane.PAGE_APP_DETAILS)
90
# NOW test the back-foward
91
self.app.available_pane.back_forward.emit("left-clicked", None)
93
self.assertEqual(self.app.available_pane.notebook.get_current_page(),
94
AvailablePane.PAGE_APPLIST)
95
self.app.available_pane.back_forward.emit("right-clicked", None)
97
self.assertEqual(self.app.available_pane.notebook.get_current_page(),
98
AvailablePane.PAGE_APP_DETAILS)
99
# and more back/forward
101
self.app.available_pane.back_forward.emit("left-clicked", None)
103
self.assertEqual(self.app.available_pane.notebook.get_current_page(),
104
AvailablePane.PAGE_CATEGORY)
105
self.app.available_pane.back_forward.emit("right-clicked", None)
109
self.assertEqual(self.app.available_pane.notebook.get_current_page(),
110
AvailablePane.PAGE_SUBCATEGORY)
112
def test_select_featured_and_back_forward(self):
115
app = Application("Cheese","cheese")
116
self.app.available_pane.cat_view.emit("application-activated", app)
118
self.assertEqual(self.app.available_pane.notebook.get_current_page(),
119
AvailablePane.PAGE_APP_DETAILS)
120
self.app.available_pane.back_forward.emit("left-clicked", None)
122
self.assertEqual(self.app.available_pane.notebook.get_current_page(),
123
AvailablePane.PAGE_CATEGORY)
124
self.app.available_pane.back_forward.emit("right-clicked", None)
126
self.assertEqual(self.app.available_pane.notebook.get_current_page(),
127
AvailablePane.PAGE_APP_DETAILS)
130
def test_search_suggestions(self):
133
self._run_search("apt")
134
self.assertFalse(self.app.available_pane.label_app_list_header.flags() & gtk.VISIBLE)
136
self._run_search("aptz")
137
self.assertTrue(self.app.available_pane.label_app_list_header.flags() & gtk.VISIBLE)
140
def test_install_the_4g8_package(self):
143
# assert we find the right package
144
model = self._run_search("4g8")
145
treeview = self.app.available_pane.app_view
146
self.assertFirstPkgInModel(model, "4g8")
147
treeview.row_activated(model.get_path(model.get_iter_root()),
148
treeview.get_column(0))
151
self.app.available_pane.app_details_view.pkg_statusbar.button.get_label(),
154
# install only when runnig as root, as we require polkit promtps
156
# FIXME: provide InstallBackendSimulate()
158
backend = get_install_backend()
159
backend.connect("transaction-finished",
160
self._on_transaction_finished)
161
self._install_done = False
162
# now simulate a click, the UI will block until the glib timeout
163
# from the previous line hits
164
self.app.available_pane.app_details_view.pkgstatus_bar.button.clicked()
166
self.assertEqual(self.app.available_pane.app_details_view.pkgstatus_bar.label.get_text(),
168
self.assertFalse(self.app.available_pane.app_details_view.pkgstatus_bar.button.get_property("visible"))
169
glib.timeout_add_seconds(2, self._test_for_progress)
170
while not self._install_done:
171
while gtk.events_pending():
174
self.app.available_pane.searchentry.delete_text(0, -1)
176
def test_show_unavailable(self):
177
# make sure that certain UI elements are hidden when showing
178
# packages that are not available
179
self.app.show_available_packages(["i-dont-exit"])
181
self.assertFalse(self.app.available_pane.app_details_view.screenshot.get_property("visible"))
182
self.assertFalse(self.app.available_pane.app_details_view.info_vb.get_property("visible"))
183
self.assertEqual(self.app.available_pane.app_details_view.desc.description.order, [])
185
def _monkey_sso_login(self):
186
#print "monkey_sso_login"
187
token = { "token": "the_token",
188
"consumer_key":"the_consumer_key" }
189
self.app.sso.emit("login-successful", token)
191
def _monkey_query_available_for_me(self, t, c):
192
#print "_monkey_query_available_for_me(self, t, c)", t,c
195
package_name = "foopkg"
196
description = "foodescr\n long desc"
198
self.app.scagent.emit("available-for-me", [MockApp()])
200
def test_previous_purchase(self):
203
self.app._create_dbus_sso_if_needed()
204
self.app.sso.login = self._monkey_sso_login
205
self.app._create_scagent_if_needed()
206
self.app.scagent.query_available_for_me = self._monkey_query_available_for_me
207
self.app.on_menuitem_reinstall_purchases_activate(None)
209
# ensure we are at the right place and show the right stuff
210
self.assertTrue(self.app.available_pane.get_visible())
211
self.assertTrue(self.app.available_pane.get_visible())
212
self.assertEqual(self.app.available_pane.navigation_bar.get_active().label, "Previous Purchases")
213
model = self.app.available_pane.app_view.get_model()
214
self.assertFirstPkgInModel(model, "foopkg")
218
""" process gtk events """
219
while gtk.events_pending():
221
# for debugging the steps
222
#print "press [ENTER]"
223
#sys.stdin.readline()
226
self.app.available_pane.navigation_bar.remove_all(animate=False)
231
def assertFirstPkgInModel(self, model, needle):
232
pkgname_from_row = model[0][AppStore.COL_PKGNAME]
234
pkgname_from_row, needle, "excpeted row '%s' got '%s'" % (
235
needle, pkgname_from_row))
237
def _run_search(self, search_text):
238
logging.info("_run_search", search_text)
239
self.app.available_pane.searchentry.delete_text(0, -1)
240
self.app.available_pane.searchentry.insert_text(search_text)
244
return self.app.available_pane.app_view.get_model()
246
def _test_for_progress(self):
247
self.assertTrue(self.app.available_pane.app_details_view.pkgstatus_bar.progress.get_property("visible"))
250
def _on_transaction_finished(self, *args, **kwargs):
251
print "_on_transaction_finished", args
252
self._install_done = True
254
if __name__ == "__main__":