~aaronp/software-center/enhance-usefulness

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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#!/usr/bin/python

import apt
import glib
import gtk
import logging
import os
import subprocess
import sys
import time
import unittest

from mock import Mock

# this needs to be set very early to ensure that when this is run as root we
# use the right pathes (update-software-center-agent will be run with sudo -u)
if os.getuid() == 0:
    os.environ["XDG_CACHE_HOME"] = "/home/%s/.cache" % os.environ["SUDO_USER"]

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

from softwarecenter.app import SoftwareCenterApp
from softwarecenter.paths import XAPIAN_BASE_PATH
from softwarecenter.view.appview import AppStore
from softwarecenter.db.application import Application

from softwarecenter.backend import get_install_backend

#import softwarecenter.log
#softwarecenter.log.root.setLevel(logging.DEBUG)

class SCBuySomething(unittest.TestCase):
    
    def setUp(self):
        if os.getuid() == 0:
            p = "/etc/apt/sources.list.d/private-ppa.launchpad.net_mvo_private-test_ubuntu.list"
            if os.path.exists(p):
                os.remove(p)
            subprocess.call(["dpkg", "-r", "hellox", "hello"])
        # get the software from staging
        os.environ["SOFTWARE_CENTER_BUY_HOST"]="https://sc.staging.ubuntu.com"
        os.environ["PYTHONPATH"]=os.path.abspath("..")
        if os.getuid() == 0:
            cmd = ["sudo", "-E", "-u", os.environ["SUDO_USER"]]
        else:
            cmd = []
        cmd += ["../utils/update-software-center-agent",
                "--ignore-etag"]
        res = subprocess.call(cmd, env=os.environ)
        print cmd, res

        apt.apt_pkg.config.set("Dir::log::history", "/tmp")
        #apt.apt_pkg.config.set("Dir::state::lists", "/tmp")
        # mock options
        mock_options = Mock()
        mock_options.enable_lp = False
        mock_options.enable_buy = True
        self.app = SoftwareCenterApp("../data", XAPIAN_BASE_PATH, mock_options)
        self.app.window_main.show_all()
        self._p()
	self._finished = False

    def _p(self):
        while gtk.events_pending():
            gtk.main_iteration()


    def assertFirstPkgInModel(self, model, needle):
        pkgname_from_row = model[0][AppStore.COL_PKGNAME]
        self.assertEqual(
            pkgname_from_row, needle, "excpeted row '%s' got '%s'" % (
                needle, pkgname_from_row))

    def _run_search(self, search_text):
        logging.info("_run_search", search_text)
        self.app.available_pane.searchentry.delete_text(0, -1)
        self.app.available_pane.searchentry.insert_text(search_text)
        self._p()
        time.sleep(1)
        self._p()
        return self.app.available_pane.app_view.get_model()

    def test_buy_something_gui(self):
        # assert we find the right package
        model = self._run_search("hellox")
        treeview = self.app.available_pane.app_view
        self.assertFirstPkgInModel(model, "hellox")
        treeview.row_activated(model.get_path(model.get_iter_root()),
                               treeview.get_column(0))
        self.assertEqual(
            self.app.available_pane.app_details_view.pkg_statusbar.button.get_label(),
            u"Buy\u2026")
        # click the "Buy" button to initiate a purchase
        self.app.available_pane.app_details_view.pkg_statusbar.button.clicked()
        self._p()
        time.sleep(1)
        # check that the purchase pane is displayed
        self.assertEqual(str(self.app.available_pane.navigation_bar.get_parts()),
                         "[Get Software, Search Results, Hello X Adventure, Buy]")
        self._p()
        time.sleep(1)
        self._p()
        # simulate a successful purchase in the UI by firing a purchase-succeeded
        self.app.available_pane.purchase_view.emit("purchase-succeeded")
        self._p()
        time.sleep(1)
        self._p()
        time.sleep(1)
        self._p()
        # check that the purchase pane is removed
        self.assertEqual(
            str(self.app.available_pane.navigation_bar.get_parts()),
            "[Get Software, Search Results, Hello X Adventure]")
        
        # done with the simulated purchase process, now pretend we install
        # something
        deb_line = "deb https://mvo:nopassyet@private-ppa.launchpad.net/mvo/private-test/ubuntu maverick main"
        signing_key_id = "0EB12F05"
        app = Application("Hello X Adventure", "hellox")
        # install only when runnig as root, as we require polkit promtps
        # otherwise
        # FIXME: provide InstallBackendSimulate()
        if os.getuid() == 0:
            backend = get_install_backend()
            backend.connect("transaction-finished", 
                            self._on_transaction_finished)
            # simulate repos becomes available for the public 40 s later
            glib.timeout_add_seconds(20, self._add_pw_to_commercial_repo)
            # run it
            appdetails = app.get_details(self.app.db)
            backend.add_repo_add_key_and_install_app(deb_line,
                                                     signing_key_id,
                                                     app,
                                                     appdetails.icon)
            self._p()
            # wait until the pkg is installed
            while not self._finished:
		while gtk.events_pending():
			gtk.main_iteration()
		time.sleep(0.1)
        #time.sleep(10)
        
    def _add_pw_to_commercial_repo(self):
        print "making pw available now"
        path="/etc/apt/sources.list.d/private-ppa.launchpad.net_mvo_private-test_ubuntu.list"
        content= open(path).read()
        passw = os.environ.get("SC_PASS") or "pass"
        content = content.replace("nopassyet", passw)
        open(path, "w").write(content)

    def _on_transaction_finished(self, backend, result):
        print "_on_transaction_finished", result
        if not result.pkgname:
            return
        print "done", result.pkgname
        self._finished = True
        self.assertTrue(result.success)

if __name__ == "__main__":
    unittest.main()