Merge lp:~mvo/software-center/recagent-test-cleanup into lp:software-center
- recagent-test-cleanup
- Merge into trunk
Status: | Merged |
---|---|
Merged at revision: | 3133 |
Proposed branch: | lp:~mvo/software-center/recagent-test-cleanup |
Merge into: | lp:software-center |
Diff against target: |
229 lines (+77/-95) 2 files modified
softwarecenter/backend/recagent.py (+1/-1) tests/test_recagent.py (+76/-94) |
To merge this branch: | bzr merge lp:~mvo/software-center/recagent-test-cleanup |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Gary Lasker (community) | Approve | ||
Michael Vogt | Needs Resubmitting | ||
Review via email: mp+121559@code.launchpad.net |
Commit message
Description of the change
Small branch that consolidates code in test_recagent into common
functions
Gary Lasker (gary-lasker) wrote : | # |
Michael Vogt (mvo) wrote : | # |
On Wed, Aug 29, 2012 at 02:07:19AM -0000, Gary Lasker wrote:
> Hi Michael, this all seems good and the cleanup is great. I assume all of these tests are working for you now, but I am consistently getting 401 errors for three of the tests (see below). It's late though, we can look at this tomorrow.
Thanks, I guess we need to add skip decorators again for those, it
seems to be dependant on the account of maybe on the time the tests
are run :) I wonder if instead we should build a mock service but I
guess that is a bit too much work :/
> $ PYTHONPATH=. python tests/test_
> .No handlers could be found for logger "softwarecenter
> F.F..F..s
> =======
> FAIL: test_recagent_
> -------
> Traceback (most recent call last):
> File "tests/
> self.assertServ
> File "tests/
> self.assertFals
> AssertionError: got error: 'WARNING:
> '
>
> =======
> FAIL: test_recagent_
> -------
> Traceback (most recent call last):
> File "tests/
> self.assertServ
> File "tests/
> self.assertFals
> AssertionError: got error: 'WARNING:
> '
>
> ========...
- 3128. By Michael Vogt
-
add some skip() decorators, refactor to move the Mock test into its own test case and simply it as it does not really need all the complex loop magic
Michael Vogt (mvo) wrote : | # |
I added a bunch of skip() decorators now and also moved the mocked version into its own TestCase.
Gary Lasker (gary-lasker) wrote : | # |
Thanks Michael, all good now!
Preview Diff
1 | === modified file 'softwarecenter/backend/recagent.py' |
2 | --- softwarecenter/backend/recagent.py 2012-08-28 18:14:50 +0000 |
3 | +++ softwarecenter/backend/recagent.py 2012-08-29 14:48:17 +0000 |
4 | @@ -24,7 +24,7 @@ |
5 | import hashlib |
6 | |
7 | import softwarecenter.paths |
8 | -from spawn_helper import SpawnHelper |
9 | +from .spawn_helper import SpawnHelper |
10 | |
11 | from softwarecenter.config import get_config |
12 | from softwarecenter.db.utils import get_installed_apps_list |
13 | |
14 | === modified file 'tests/test_recagent.py' |
15 | --- tests/test_recagent.py 2012-06-11 14:50:53 +0000 |
16 | +++ tests/test_recagent.py 2012-08-29 14:48:17 +0000 |
17 | @@ -10,12 +10,30 @@ |
18 | ) |
19 | setup_test_env() |
20 | |
21 | +import softwarecenter |
22 | from softwarecenter.backend.recagent import RecommenderAgent |
23 | |
24 | |
25 | -class TestRecommenderAgent(unittest.TestCase): |
26 | +class MockTestRecommenderAgent(unittest.TestCase): |
27 | + |
28 | + @patch.object(softwarecenter.backend.recagent.SpawnHelper, |
29 | + 'run_generic_piston_helper') |
30 | + def test_mocked_recagent_post_submit_profile(self, mock_spawn_helper_run): |
31 | + recommender_agent = RecommenderAgent() |
32 | + recommender_agent._calc_profile_id = lambda profile: "i-am-random" |
33 | + db = get_test_db() |
34 | + recommender_agent.post_submit_profile(db) |
35 | + args, kwargs = mock_spawn_helper_run.call_args |
36 | + # ensure we have packages in the package list and the |
37 | + # kwargs have the names we expect |
38 | + self.assertNotEqual(kwargs['data'][0]['package_list'], []) |
39 | + |
40 | + |
41 | +class RealTestRecommenderAgent(unittest.TestCase): |
42 | """ tests the recommender agent """ |
43 | - |
44 | + |
45 | + @unittest.skipIf(os.getuid() == 0, |
46 | + "this is not supported running as root") |
47 | def setUp(self): |
48 | self.loop = GObject.MainLoop(GObject.main_context_default()) |
49 | self.error = False |
50 | @@ -27,117 +45,78 @@ |
51 | self.addCleanup(os.environ.pop, "SOFTWARE_CENTER_RECOMMENDER_HOST") |
52 | server = "https://rec.staging.ubuntu.com" |
53 | os.environ["SOFTWARE_CENTER_RECOMMENDER_HOST"] = server |
54 | - |
55 | - @patch('softwarecenter.backend.recagent.SpawnHelper' |
56 | - '.run_generic_piston_helper') |
57 | - def test_mocked_recagent_post_submit_profile(self, mock_spawn_helper_run): |
58 | - def _patched_on_submit_profile_data(*args, **kwargs): |
59 | - piston_submit_profile = {} |
60 | - recommender_agent.emit("submit-profile-finished", |
61 | - piston_submit_profile) |
62 | - mock_spawn_helper_run.side_effect = _patched_on_submit_profile_data |
63 | - recommender_agent = RecommenderAgent() |
64 | - recommender_agent.connect("submit-profile-finished", self.on_query_done) |
65 | - recommender_agent.connect("error", self.on_query_error) |
66 | - recommender_agent._calc_profile_id = lambda profile: "i-am-random" |
67 | - db = get_test_db() |
68 | - recommender_agent.post_submit_profile(db) |
69 | - self.assertFalse(self.error) |
70 | - args, kwargs = mock_spawn_helper_run.call_args |
71 | - self.assertNotEqual(kwargs['data'][0]['package_list'], []) |
72 | + # most tests need it |
73 | + self.recommender_agent = RecommenderAgent() |
74 | + self.recommender_agent.connect("error", self.on_query_error) |
75 | |
76 | def on_query_done(self, recagent, data): |
77 | - # print "query done, data: '%s'" % data |
78 | + #print "query done, data: '%s'" % data |
79 | self.loop.quit() |
80 | + self.error = False |
81 | + self.error_msg = "" |
82 | |
83 | def on_query_error(self, recagent, error): |
84 | - # print "query error received: ", error |
85 | + #print "query error received: ", error |
86 | self.loop.quit() |
87 | self.error = True |
88 | + self.error_msg = error |
89 | + |
90 | + def assertServerReturnsWithNoError(self): |
91 | + self.loop.run() |
92 | + self.assertFalse(self.error, "got error: '%s'" % self.error_msg) |
93 | |
94 | def test_recagent_query_server_status(self): |
95 | - # NOTE: This requires a working recommender host that is reachable |
96 | - recommender_agent = RecommenderAgent() |
97 | - recommender_agent.connect("server-status", self.on_query_done) |
98 | - recommender_agent.connect("error", self.on_query_error) |
99 | - recommender_agent.query_server_status() |
100 | - self.loop.run() |
101 | - self.assertFalse(self.error) |
102 | + self.recommender_agent.connect("server-status", self.on_query_done) |
103 | + self.recommender_agent.query_server_status() |
104 | + self.assertServerReturnsWithNoError() |
105 | |
106 | - # FIXME: disabled for now as the server is not quite working |
107 | - def disabled_test_recagent_post_submit_profile(self): |
108 | + @unittest.skip("server returns 401") |
109 | + def test_recagent_post_submit_profile(self): |
110 | # NOTE: This requires a working recommender host that is reachable |
111 | - recommender_agent = RecommenderAgent() |
112 | - recommender_agent.connect("submit-profile-finished", self.on_query_done) |
113 | - recommender_agent.connect("error", self.on_query_error) |
114 | db = get_test_db() |
115 | - recommender_agent.post_submit_profile(db) |
116 | - self.loop.run() |
117 | - self.assertFalse(self.error) |
118 | + self.recommender_agent.connect( |
119 | + "submit-profile-finished", self.on_query_done) |
120 | + self.recommender_agent.post_submit_profile(db) |
121 | + self.assertServerReturnsWithNoError() |
122 | #print mock_request._post |
123 | - |
124 | - # NOTE: this server call is currently not needed and not used |
125 | -# def disabled_test_recagent_query_submit_anon_profile(self): |
126 | -# # NOTE: This requires a working recommender host that is reachable |
127 | -# recommender_agent = RecommenderAgent() |
128 | -# recommender_agent.connect("submit-anon-profile", self.on_query_done) |
129 | -# recommender_agent.connect("error", self.on_query_error) |
130 | -# recommender_agent.query_submit_anon_profile( |
131 | -# uuid=recommender_uuid, |
132 | -# installed_packages=["pitivi", "fretsonfire"], |
133 | -# extra="") |
134 | -# self.loop.run() |
135 | -# self.assertFalse(self.error) |
136 | - |
137 | - # FIXME: disabled for now as the server is not quite working |
138 | - def disabled_test_recagent_query_profile(self): |
139 | - # NOTE: This requires a working recommender host that is reachable |
140 | - recommender_agent = RecommenderAgent() |
141 | - recommender_agent.connect("profile", self.on_query_done) |
142 | - recommender_agent.connect("error", self.on_query_error) |
143 | - recommender_agent.query_profile(pkgnames=["pitivi", "fretsonfire"]) |
144 | - self.loop.run() |
145 | - self.assertFalse(self.error) |
146 | - |
147 | - # FIXME: disabled for now as the server is not quite working |
148 | - def disabled_test_recagent_query_recommend_me(self): |
149 | - # NOTE: This requires a working recommender host that is reachable |
150 | - recommender_agent = RecommenderAgent() |
151 | - recommender_agent.connect("recommend-me", self.on_query_done) |
152 | - recommender_agent.connect("error", self.on_query_error) |
153 | - recommender_agent.query_recommend_me() |
154 | - self.loop.run() |
155 | - self.assertFalse(self.error) |
156 | + |
157 | + @unittest.skip("server returns 401") |
158 | + def test_recagent_query_submit_anon_profile(self): |
159 | + self.recommender_agent.connect( |
160 | + "submit-anon-profile-finished", self.on_query_done) |
161 | + self.recommender_agent.post_submit_anon_profile( |
162 | + uuid="xxxyyyzzz", |
163 | + installed_packages=["pitivi", "fretsonfire"], |
164 | + extra="") |
165 | + self.assertServerReturnsWithNoError() |
166 | + |
167 | + @unittest.skip("server returns 401") |
168 | + def test_recagent_query_profile(self): |
169 | + self.recommender_agent.connect("profile", self.on_query_done) |
170 | + self.recommender_agent.query_profile(pkgnames=["pitivi", "fretsonfire"]) |
171 | + self.assertServerReturnsWithNoError() |
172 | + |
173 | + @unittest.skip("server returns 401") |
174 | + def test_recagent_query_recommend_me(self): |
175 | + self.recommender_agent.connect("recommend-me", self.on_query_done) |
176 | + self.recommender_agent.query_recommend_me() |
177 | + self.assertServerReturnsWithNoError() |
178 | |
179 | def test_recagent_query_recommend_app(self): |
180 | - # NOTE: This requires a working recommender host that is reachable |
181 | - recommender_agent = RecommenderAgent() |
182 | - recommender_agent.connect("recommend-app", self.on_query_done) |
183 | - recommender_agent.connect("error", self.on_query_error) |
184 | - recommender_agent.query_recommend_app("pitivi") |
185 | - self.loop.run() |
186 | - self.assertFalse(self.error) |
187 | + self.recommender_agent.connect("recommend-app", self.on_query_done) |
188 | + self.recommender_agent.query_recommend_app("pitivi") |
189 | + self.assertServerReturnsWithNoError() |
190 | |
191 | - # disabled for now (2012-03-20) as the server is returning 504 |
192 | - def disabled_test_recagent_query_recommend_all_apps(self): |
193 | - # NOTE: This requires a working recommender host that is reachable |
194 | - recommender_agent = RecommenderAgent() |
195 | - recommender_agent.connect("recommend-all-apps", self.on_query_done) |
196 | - recommender_agent.connect("error", self.on_query_error) |
197 | - recommender_agent.query_recommend_all_apps() |
198 | - self.loop.run() |
199 | - self.assertFalse(self.error) |
200 | + def test_recagent_query_recommend_all_apps(self): |
201 | + self.recommender_agent.connect("recommend-all-apps", self.on_query_done) |
202 | + self.recommender_agent.query_recommend_all_apps() |
203 | + self.assertServerReturnsWithNoError() |
204 | |
205 | def test_recagent_query_recommend_top(self): |
206 | - # NOTE: This requires a working recommender host that is reachable |
207 | - recommender_agent = RecommenderAgent() |
208 | - recommender_agent.connect("recommend-top", self.on_query_done) |
209 | - recommender_agent.connect("error", self.on_query_error) |
210 | - recommender_agent.query_recommend_top() |
211 | - self.loop.run() |
212 | - self.assertFalse(self.error) |
213 | + self.recommender_agent.connect("recommend-top", self.on_query_done) |
214 | + self.recommender_agent.query_recommend_top() |
215 | + self.assertServerReturnsWithNoError() |
216 | |
217 | - @unittest.skip('Disabled, should be re-enabled ASAP') |
218 | def test_recagent_query_error(self): |
219 | # NOTE: This tests the error condition itself! it simply forces an error |
220 | # 'cuz there definitely isn't a server here :) |
221 | @@ -150,5 +129,8 @@ |
222 | self.loop.run() |
223 | self.assertTrue(self.error) |
224 | |
225 | + |
226 | if __name__ == "__main__": |
227 | + #import logging |
228 | + #logging.basicConfig(level=logging.DEBUG) |
229 | unittest.main() |
Hi Michael, this all seems good and the cleanup is great. I assume all of these tests are working for you now, but I am consistently getting 401 errors for three of the tests (see below). It's late though, we can look at this tomorrow.
$ PYTHONPATH=. python tests/test_ recagent. py .backend. spawn_helper" ======= ======= ======= ======= ======= ======= ======= ======= ======= post_submit_ profile (__main_ _.TestRecommend erAgent) ------- ------- ------- ------- ------- ------- ------- ------- ------- test_recagent. py", line 81, in test_recagent_ post_submit_ profile assertServerRet urnsWithNoError () test_recagent. py", line 68, in assertServerRet urnsWithNoError assertFalse( self.error, "got error: '%s'" % self.error_msg) __main_ _:401: {'status': '401', 'content-length': '22', 'via': '1.1 myrica. canonical. com:3128 (squid/ 2.7.STABLE7) ', 'x-cache': 'MISS from myrica. canonical. com', 'x-cache-lookup': 'MISS from myrica. canonical. com:3128' , 'expires': 'Wed, 29 Aug 2012 02:04:18 GMT', 'vary': 'Authorization, Accept- Encoding' , '-content- encoding' : 'gzip', 'server': 'Apache/2.2.22 (Ubuntu)', 'last-modified': 'Wed, 29 Aug 2012 02:04:18 GMT', 'etag': '"7e287fc885d9f dcf42da3a12f385 72c1"', 'strict- transport- security' : 'max-age=2592000', 'cache-control': 'max-age=0', 'date': 'Wed, 29 Aug 2012 02:04:18 GMT', 'content-type': 'text/html; charset=utf-8', 'www-authenticate': 'OAuth realm=" SoftwareCenter Agent"'}
.No handlers could be found for logger "softwarecenter
F.F..F..s
=======
FAIL: test_recagent_
-------
Traceback (most recent call last):
File "tests/
self.
File "tests/
self.
AssertionError: got error: 'WARNING:
'
======= ======= ======= ======= ======= ======= ======= ======= ======= ======= query_profile (__main_ _.TestRecommend erAgent) ------- ------- ------- ------- ------- ------- ------- ------- ------- test_recagent. py", line 97, in test_recagent_ query_profile assertServerRet urnsWithNoError () test_recagent. py", line 68, in assertServerRet urnsWithNoError assertFalse( self.error, "got error: '%s'" % self.error_msg) __main_ _:401: {'status': '401', 'content-length': '22', 'via': '1.1 myrica. canonical. com:3128 (squid/ 2.7.STABLE7) ', 'x-cache': 'MISS from myrica. canonical. com', 'x-cache-lookup': 'MISS from myrica. canonical. com:3128' , 'expires': 'Wed, 29 Aug 2012 02:04:24 GMT', 'vary': 'Authorization, Accept- Encoding' , '-content- encoding' : 'gzip', 'server': 'Apache/2.2.22 (Ubuntu)', 'last-modified': 'Wed, 29 Aug 2012 02:04:24 GMT', 'etag': '"7e287fc885d9f dcf42da3a12f385 72c1"', 'strict- transport- security' : 'max-age=2592000', 'cache-control': 'max-age=0', 'date': 'Wed, 29 Aug 2012 02:04:24 GMT', 'content-type': 'text/html; charset=utf-8', 'www-authenticate': 'OAuth realm=" SoftwareCenter Agent"'}
FAIL: test_recagent_
-------
Traceback (most recent call last):
File "tests/
self.
File "tests/
self.
AssertionError: got error: 'WARNING:
'
======= ======= ======= ======= ======= ======= ======= ======= ======= ======= query_recommend _me (__main_ _.TestRecommend erAgent) ------- ------- ------- ------- ------- ------- ------- ------- ------- test_recagent. py", line 102, in test_recagent_ query_recommend _me assertServerRet urnsWithNoErro. ..
FAIL: test_recagent_
-------
Traceback (most recent call last):
File "tests/
self.