Merge ~cjwatson/launchpad:webservice-for-person-anonymous into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: acd9d212c4ef9f78729fafdd6ff321e529f9d217
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:webservice-for-person-anonymous
Merge into: launchpad:master
Diff against target: 530 lines (+56/-105)
12 files modified
lib/lp/app/webservice/tests/test_marshallers.py (+4/-11)
lib/lp/blueprints/tests/test_webservice.py (+2/-8)
lib/lp/bugs/browser/tests/test_bugattachment_file_access.py (+2/-8)
lib/lp/bugs/tests/test_bug_messages_webservice.py (+2/-7)
lib/lp/buildmaster/tests/test_processor.py (+5/-11)
lib/lp/code/model/tests/test_branchset.py (+2/-4)
lib/lp/code/model/tests/test_gitrepository.py (+4/-10)
lib/lp/registry/browser/tests/test_person_webservice.py (+1/-3)
lib/lp/services/webhooks/tests/test_webservice.py (+4/-7)
lib/lp/snappy/tests/test_snap.py (+6/-14)
lib/lp/soyuz/browser/tests/test_archive_webservice.py (+7/-9)
lib/lp/testing/pages.py (+17/-13)
Reviewer Review Type Date Requested Status
Ioana Lasc (community) Approve
Review via email: mp+400966@code.launchpad.net

Commit message

Extend webservice_for_person to support anonymous login

Description of the change

This simplifies some tests of anonymous webservice behaviour, and allows those tests to look more like nearby tests that authenticate as a real user.

To post a comment you must log in.
Revision history for this message
Ioana Lasc (ilasc) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/app/webservice/tests/test_marshallers.py b/lib/lp/app/webservice/tests/test_marshallers.py
2index e689d96..08c2068 100644
3--- a/lib/lp/app/webservice/tests/test_marshallers.py
4+++ b/lib/lp/app/webservice/tests/test_marshallers.py
5@@ -30,16 +30,12 @@ from lp.services.job.interfaces.job import JobStatus
6 from lp.services.webapp.publisher import canonical_url
7 from lp.services.webapp.servers import WebServiceTestRequest
8 from lp.testing import (
9- logout,
10 person_logged_in,
11 TestCaseWithFactory,
12 )
13 from lp.testing.fixture import ZopeAdapterFixture
14 from lp.testing.layers import DatabaseFunctionalLayer
15-from lp.testing.pages import (
16- LaunchpadWebServiceCaller,
17- webservice_for_person,
18- )
19+from lp.testing.pages import webservice_for_person
20
21
22 def ws_url(bug):
23@@ -90,8 +86,7 @@ class TestWebServiceObfuscation(TestCaseWithFactory):
24 def test_email_address_obfuscated(self):
25 # Email addresses are obfuscated for anonymous users.
26 bug = self._makeBug()
27- logout()
28- webservice = LaunchpadWebServiceCaller()
29+ webservice = webservice_for_person(None)
30 result = webservice(ws_url(bug)).jsonBody()
31 self.assertEqual(
32 self.bug_title % self.email_address_obfuscated,
33@@ -125,8 +120,7 @@ class TestWebServiceObfuscation(TestCaseWithFactory):
34 # Email addresses are obfuscated in the XML representation for
35 # anonymous users.
36 bug = self._makeBug()
37- logout()
38- webservice = LaunchpadWebServiceCaller()
39+ webservice = webservice_for_person(None)
40 result = webservice(
41 ws_url(bug), headers={'Accept': 'application/xhtml+xml'})
42 self.assertNotIn(self.email_address.encode('UTF-8'), result.body)
43@@ -146,8 +140,7 @@ class TestWebServiceObfuscation(TestCaseWithFactory):
44 user = self.factory.makePerson()
45 webservice = webservice_for_person(user)
46 etag_logged_in = webservice(ws_url(bug)).getheader('etag')
47- logout()
48- webservice = LaunchpadWebServiceCaller()
49+ webservice = webservice_for_person(None)
50 etag_logged_out = webservice(ws_url(bug)).getheader('etag')
51 self.assertNotEqual(etag_logged_in, etag_logged_out)
52
53diff --git a/lib/lp/blueprints/tests/test_webservice.py b/lib/lp/blueprints/tests/test_webservice.py
54index 7ff1ce7..39f1b92 100644
55--- a/lib/lp/blueprints/tests/test_webservice.py
56+++ b/lib/lp/blueprints/tests/test_webservice.py
57@@ -28,15 +28,11 @@ from lp.testing import (
58 admin_logged_in,
59 api_url,
60 login,
61- logout,
62 person_logged_in,
63 TestCaseWithFactory,
64 )
65 from lp.testing.layers import DatabaseFunctionalLayer
66-from lp.testing.pages import (
67- LaunchpadWebServiceCaller,
68- webservice_for_person,
69- )
70+from lp.testing.pages import webservice_for_person
71
72
73 class SpecificationWebserviceTests(TestCaseWithFactory):
74@@ -424,9 +420,7 @@ class IHasSpecificationsTests(TestCaseWithFactory):
75 self.factory.makeSpecification(product=product, name="spec1")
76 self.factory.makeSpecification(product=product, name="spec2")
77 product_url = api_url(product)
78- logout()
79- webservice = LaunchpadWebServiceCaller(
80- "test", "", default_api_version="devel")
81+ webservice = webservice_for_person(None, default_api_version="devel")
82 response = webservice.get(product_url)
83 self.assertEqual(200, response.status)
84 response = webservice.get(
85diff --git a/lib/lp/bugs/browser/tests/test_bugattachment_file_access.py b/lib/lp/bugs/browser/tests/test_bugattachment_file_access.py
86index 4faa851..a517d97 100644
87--- a/lib/lp/bugs/browser/tests/test_bugattachment_file_access.py
88+++ b/lib/lp/bugs/browser/tests/test_bugattachment_file_access.py
89@@ -31,14 +31,10 @@ from lp.services.webapp.servers import LaunchpadTestRequest
90 from lp.testing import (
91 api_url,
92 login_person,
93- logout,
94 TestCaseWithFactory,
95 )
96 from lp.testing.layers import LaunchpadFunctionalLayer
97-from lp.testing.pages import (
98- LaunchpadWebServiceCaller,
99- webservice_for_person,
100- )
101+from lp.testing.pages import webservice_for_person
102
103
104 class TestAccessToBugAttachmentFiles(TestCaseWithFactory):
105@@ -138,9 +134,7 @@ class TestWebserviceAccessToBugAttachmentFiles(TestCaseWithFactory):
106
107 def test_anon_access_to_public_bug_attachment(self):
108 # Attachments of public bugs can be accessed by anonymous users.
109- logout()
110- webservice = LaunchpadWebServiceCaller(
111- 'test', '', default_api_version='devel')
112+ webservice = webservice_for_person(None, default_api_version='devel')
113 ws_bug = self.getWebserviceJSON(webservice, self.bug_url)
114 ws_bug_attachment = self.getWebserviceJSON(
115 webservice, ws_bug['attachments_collection_link'])['entries'][0]
116diff --git a/lib/lp/bugs/tests/test_bug_messages_webservice.py b/lib/lp/bugs/tests/test_bug_messages_webservice.py
117index 5faae0e..dbd3507 100644
118--- a/lib/lp/bugs/tests/test_bug_messages_webservice.py
119+++ b/lib/lp/bugs/tests/test_bug_messages_webservice.py
120@@ -21,7 +21,6 @@ from lp.testing import (
121 api_url,
122 launchpadlib_for,
123 login_celebrity,
124- logout,
125 person_logged_in,
126 TestCaseWithFactory,
127 )
128@@ -29,10 +28,7 @@ from lp.testing.layers import (
129 DatabaseFunctionalLayer,
130 LaunchpadFunctionalLayer,
131 )
132-from lp.testing.pages import (
133- LaunchpadWebServiceCaller,
134- webservice_for_person,
135- )
136+from lp.testing.pages import webservice_for_person
137
138
139 class TestMessageTraversal(TestCaseWithFactory):
140@@ -104,9 +100,8 @@ class TestBugMessage(TestCaseWithFactory):
141 self.factory.makeBugAttachment(bug).id for i in range(3))
142 bug_url = api_url(bug)
143 self.assertThat(created_attachment_ids, HasLength(3))
144- logout()
145
146- webservice = LaunchpadWebServiceCaller('test', None)
147+ webservice = webservice_for_person(None)
148 bug_attachments = webservice.get(
149 bug_url + '/attachments').jsonBody()['entries']
150 bug_attachment_ids = set(
151diff --git a/lib/lp/buildmaster/tests/test_processor.py b/lib/lp/buildmaster/tests/test_processor.py
152index a639b7a..7bd8269 100644
153--- a/lib/lp/buildmaster/tests/test_processor.py
154+++ b/lib/lp/buildmaster/tests/test_processor.py
155@@ -16,11 +16,10 @@ from lp.buildmaster.model.processor import Processor
156 from lp.services.database.interfaces import IStore
157 from lp.testing import (
158 ExpectedException,
159- logout,
160 TestCaseWithFactory,
161 )
162 from lp.testing.layers import DatabaseFunctionalLayer
163-from lp.testing.pages import LaunchpadWebServiceCaller
164+from lp.testing.pages import webservice_for_person
165
166
167 class ProcessorSetTests(TestCaseWithFactory):
168@@ -59,15 +58,11 @@ class ProcessorSetTests(TestCaseWithFactory):
169 class ProcessorSetWebServiceTests(TestCaseWithFactory):
170 layer = DatabaseFunctionalLayer
171
172- def setUp(self):
173- super(ProcessorSetWebServiceTests, self).setUp()
174- self.webservice = LaunchpadWebServiceCaller()
175-
176 def test_getByName(self):
177 self.factory.makeProcessor(name='transmeta')
178- logout()
179
180- processor = self.webservice.named_get(
181+ webservice = webservice_for_person(None)
182+ processor = webservice.named_get(
183 '/+processors', 'getByName', name='transmeta',
184 api_version='devel').jsonBody()
185 self.assertEqual('transmeta', processor['name'])
186@@ -80,9 +75,8 @@ class ProcessorSetWebServiceTests(TestCaseWithFactory):
187 self.factory.makeProcessor(name='i686')
188 self.factory.makeProcessor(name='g4')
189
190- logout()
191-
192- collection = self.webservice.get(
193+ webservice = webservice_for_person(None)
194+ collection = webservice.get(
195 '/+processors?ws.size=10', api_version='devel').jsonBody()
196 self.assertEqual(
197 ['g4', 'i686', 'q1'],
198diff --git a/lib/lp/code/model/tests/test_branchset.py b/lib/lp/code/model/tests/test_branchset.py
199index 9de4d0a..6f742eb 100644
200--- a/lib/lp/code/model/tests/test_branchset.py
201+++ b/lib/lp/code/model/tests/test_branchset.py
202@@ -23,13 +23,12 @@ from lp.code.model.branch import BranchSet
203 from lp.services.propertycache import clear_property_cache
204 from lp.testing import (
205 login_person,
206- logout,
207 RequestTimelineCollector,
208 TestCaseWithFactory,
209 )
210 from lp.testing.layers import DatabaseFunctionalLayer
211 from lp.testing.matchers import HasQueryCount
212-from lp.testing.pages import LaunchpadWebServiceCaller
213+from lp.testing.pages import webservice_for_person
214
215
216 class TestBranchSet(TestCaseWithFactory):
217@@ -101,14 +100,13 @@ class TestBranchSet(TestCaseWithFactory):
218 None, order_by=BranchListingSort.MOST_RECENTLY_CHANGED_FIRST)))
219
220 def test_api_branches_query_count(self):
221- webservice = LaunchpadWebServiceCaller()
222+ webservice = webservice_for_person(None)
223 collector = RequestTimelineCollector()
224 collector.register()
225 self.addCleanup(collector.unregister)
226 # Get 'all' of the 50 branches this collection is limited to - rather
227 # than the default in-test-suite pagination size of 5.
228 url = "/branches?ws.size=50"
229- logout()
230 response = webservice.get(url,
231 headers={'User-Agent': 'AnonNeedsThis'})
232 self.assertEqual(response.status, 200,
233diff --git a/lib/lp/code/model/tests/test_gitrepository.py b/lib/lp/code/model/tests/test_gitrepository.py
234index 6cec839..5790338 100644
235--- a/lib/lp/code/model/tests/test_gitrepository.py
236+++ b/lib/lp/code/model/tests/test_gitrepository.py
237@@ -174,7 +174,6 @@ from lp.testing import (
238 api_url,
239 celebrity_logged_in,
240 login_person,
241- logout,
242 person_logged_in,
243 record_two_runs,
244 StormStatementRecorder,
245@@ -192,10 +191,7 @@ from lp.testing.matchers import (
246 DoesNotSnapshot,
247 HasQueryCount,
248 )
249-from lp.testing.pages import (
250- LaunchpadWebServiceCaller,
251- webservice_for_person,
252- )
253+from lp.testing.pages import webservice_for_person
254 from lp.xmlrpc import faults
255 from lp.xmlrpc.interfaces import IPrivateApplication
256
257@@ -4582,8 +4578,8 @@ class TestGitRepositoryWebservice(TestCaseWithFactory):
258 with person_logged_in(requester):
259 repository_url = api_url(repository)
260 webservice = webservice_for_person(
261- requester, permission=OAuthPermission.WRITE_PUBLIC)
262- webservice.default_api_version = "devel"
263+ requester, permission=OAuthPermission.WRITE_PUBLIC,
264+ default_api_version="devel")
265 response = webservice.named_post(repository_url, "issueAccessToken")
266 self.assertEqual(200, response.status)
267 macaroon = Macaroon.deserialize(response.jsonBody())
268@@ -4606,9 +4602,7 @@ class TestGitRepositoryWebservice(TestCaseWithFactory):
269 repository = self.factory.makeGitRepository()
270 with person_logged_in(repository.owner):
271 repository_url = api_url(repository)
272- logout()
273- webservice = LaunchpadWebServiceCaller()
274- webservice.default_api_version = "devel"
275+ webservice = webservice_for_person(None, default_api_version="devel")
276 response = webservice.named_post(repository_url, "issueAccessToken")
277 self.assertEqual(401, response.status)
278 self.assertEqual(
279diff --git a/lib/lp/registry/browser/tests/test_person_webservice.py b/lib/lp/registry/browser/tests/test_person_webservice.py
280index d9633f9..e59c87d 100644
281--- a/lib/lp/registry/browser/tests/test_person_webservice.py
282+++ b/lib/lp/registry/browser/tests/test_person_webservice.py
283@@ -33,7 +33,6 @@ from lp.testing import (
284 api_url,
285 launchpadlib_for,
286 login,
287- logout,
288 person_logged_in,
289 record_two_runs,
290 TestCaseWithFactory,
291@@ -252,8 +251,7 @@ class PersonSetWebServiceTests(TestCaseWithFactory):
292
293 def setUp(self):
294 super(PersonSetWebServiceTests, self).setUp()
295- self.webservice = LaunchpadWebServiceCaller('test', None)
296- logout()
297+ self.webservice = webservice_for_person(None)
298
299 def assertReturnsPeople(self, expected_names, path):
300 self.assertEqual(
301diff --git a/lib/lp/services/webhooks/tests/test_webservice.py b/lib/lp/services/webhooks/tests/test_webservice.py
302index 4c90b0e..42408d5 100644
303--- a/lib/lp/services/webhooks/tests/test_webservice.py
304+++ b/lib/lp/services/webhooks/tests/test_webservice.py
305@@ -39,10 +39,7 @@ from lp.testing import (
306 )
307 from lp.testing.layers import DatabaseFunctionalLayer
308 from lp.testing.matchers import HasQueryCount
309-from lp.testing.pages import (
310- LaunchpadWebServiceCaller,
311- webservice_for_person,
312- )
313+from lp.testing.pages import webservice_for_person
314
315
316 class TestWebhook(TestCaseWithFactory):
317@@ -124,7 +121,7 @@ class TestWebhook(TestCaseWithFactory):
318 u'hg:push:0.1').encode('ASCII')))
319
320 def test_anon_forbidden(self):
321- response = LaunchpadWebServiceCaller().get(
322+ response = webservice_for_person(None).get(
323 self.webhook_url, api_version='devel')
324 self.assertEqual(401, response.status)
325 self.assertIn(b'launchpad.View', response.body)
326@@ -292,7 +289,7 @@ class TestWebhookTargetBase:
327 [entry['delivery_url'] for entry in representation['entries']])
328
329 def test_webhooks_permissions(self):
330- webservice = LaunchpadWebServiceCaller()
331+ webservice = webservice_for_person(None)
332 response = webservice.get(
333 self.target_url + '/webhooks', api_version='devel')
334 self.assertEqual(401, response.status)
335@@ -347,7 +344,7 @@ class TestWebhookTargetBase:
336
337 def test_newWebhook_permissions(self):
338 self.useFixture(FeatureFixture({'webhooks.new.enabled': 'true'}))
339- webservice = LaunchpadWebServiceCaller()
340+ webservice = webservice_for_person(None)
341 response = webservice.named_post(
342 self.target_url, 'newWebhook',
343 delivery_url='http://example.com/ep',
344diff --git a/lib/lp/snappy/tests/test_snap.py b/lib/lp/snappy/tests/test_snap.py
345index f827970..be338d7 100644
346--- a/lib/lp/snappy/tests/test_snap.py
347+++ b/lib/lp/snappy/tests/test_snap.py
348@@ -163,10 +163,7 @@ from lp.testing.matchers import (
349 DoesNotSnapshot,
350 HasQueryCount,
351 )
352-from lp.testing.pages import (
353- LaunchpadWebServiceCaller,
354- webservice_for_person,
355- )
356+from lp.testing.pages import webservice_for_person
357
358
359 class TestSnapFeatureFlag(TestCaseWithFactory):
360@@ -3078,10 +3075,9 @@ class TestSnapWebservice(TestCaseWithFactory):
361 self.webservice.getAbsoluteUrl(api_url(snap))
362 for snap in snaps]
363 admin = getUtility(ILaunchpadCelebrities).admin.teamowner
364- logout()
365
366 # Anonymous requests can only see public snaps.
367- anon_webservice = LaunchpadWebServiceCaller("test", "")
368+ anon_webservice = webservice_for_person(None)
369 response = anon_webservice.named_get(
370 "/+snaps", "findByOwner", owner=person_urls[0],
371 api_version="devel")
372@@ -3145,10 +3141,9 @@ class TestSnapWebservice(TestCaseWithFactory):
373 self.webservice.getAbsoluteUrl(api_url(snap))
374 for snap in snaps]
375 admin = getUtility(ILaunchpadCelebrities).admin.teamowner
376- logout()
377
378 # Anonymous requests can only see public snaps.
379- anon_webservice = LaunchpadWebServiceCaller("test", "")
380+ anon_webservice = webservice_for_person(None)
381 response = anon_webservice.named_get(
382 "/+snaps", "findByURL", url=urls[0], api_version="devel")
383 self.assertEqual(200, response.status)
384@@ -3222,11 +3217,10 @@ class TestSnapWebservice(TestCaseWithFactory):
385 self.webservice.getAbsoluteUrl(api_url(snap))
386 for snap in snaps]
387 admin = getUtility(ILaunchpadCelebrities).admin.teamowner
388- logout()
389 prefix = "https://git.example.org/foo/"
390
391 # Anonymous requests can only see public snaps.
392- anon_webservice = LaunchpadWebServiceCaller("test", "")
393+ anon_webservice = webservice_for_person(None)
394 response = anon_webservice.named_get(
395 "/+snaps", "findByURLPrefix", url_prefix=prefix,
396 api_version="devel")
397@@ -3305,12 +3299,11 @@ class TestSnapWebservice(TestCaseWithFactory):
398 self.webservice.getAbsoluteUrl(api_url(snap))
399 for snap in snaps]
400 admin = getUtility(ILaunchpadCelebrities).admin.teamowner
401- logout()
402 prefixes = [
403 "https://git.example.org/foo/", "https://git.example.org/bar/"]
404
405 # Anonymous requests can only see public snaps.
406- anon_webservice = LaunchpadWebServiceCaller("test", "")
407+ anon_webservice = webservice_for_person(None)
408 response = anon_webservice.named_get(
409 "/+snaps", "findByURLPrefixes", url_prefixes=prefixes,
410 api_version="devel")
411@@ -3381,10 +3374,9 @@ class TestSnapWebservice(TestCaseWithFactory):
412 self.webservice.getAbsoluteUrl(api_url(snap))
413 for snap in snaps]
414 admin = getUtility(ILaunchpadCelebrities).admin.teamowner
415- logout()
416
417 # Anonymous requests can only see public snaps.
418- anon_webservice = LaunchpadWebServiceCaller("test", "")
419+ anon_webservice = webservice_for_person(None)
420 response = anon_webservice.named_get(
421 "/+snaps", "findByStoreName", store_name=store_names[0],
422 api_version="devel")
423diff --git a/lib/lp/soyuz/browser/tests/test_archive_webservice.py b/lib/lp/soyuz/browser/tests/test_archive_webservice.py
424index a0511d9..cf0e850 100644
425--- a/lib/lp/soyuz/browser/tests/test_archive_webservice.py
426+++ b/lib/lp/soyuz/browser/tests/test_archive_webservice.py
427@@ -46,10 +46,7 @@ from lp.testing import (
428 from lp.testing.gpgkeys import gpgkeysdir
429 from lp.testing.layers import DatabaseFunctionalLayer
430 from lp.testing.matchers import HasQueryCount
431-from lp.testing.pages import (
432- LaunchpadWebServiceCaller,
433- webservice_for_person,
434- )
435+from lp.testing.pages import webservice_for_person
436
437
438 class TestArchiveWebservice(TestCaseWithFactory):
439@@ -727,6 +724,7 @@ class TestGetPublishedBinaries(TestCaseWithFactory):
440 # getPublishedBinaries has a query count constant in the number of
441 # packages returned.
442 archive_url = api_url(self.archive)
443+ webservice = webservice_for_person(None)
444
445 def create_bpph():
446 with admin_logged_in():
447@@ -734,7 +732,7 @@ class TestGetPublishedBinaries(TestCaseWithFactory):
448 archive=self.archive)
449
450 def get_binaries():
451- LaunchpadWebServiceCaller('consumer', '').named_get(
452+ webservice.named_get(
453 archive_url, 'getPublishedBinaries').jsonBody()
454
455 recorder1, recorder2 = record_two_runs(get_binaries, create_bpph, 1)
456@@ -814,7 +812,7 @@ class TestArchiveSet(TestCaseWithFactory):
457
458 def test_getByReference(self):
459 random = self.factory.makePerson()
460- body = LaunchpadWebServiceCaller('consumer', '').named_get(
461+ body = webservice_for_person(None).named_get(
462 '/archives', 'getByReference', reference='ubuntu',
463 api_version='devel').jsonBody()
464 self.assertEqual(body['reference'], 'ubuntu')
465@@ -824,13 +822,13 @@ class TestArchiveSet(TestCaseWithFactory):
466 self.assertEqual(body['reference'], 'ubuntu')
467
468 def test_getByReference_ppa(self):
469- body = LaunchpadWebServiceCaller('consumer', '').named_get(
470+ body = webservice_for_person(None).named_get(
471 '/archives', 'getByReference', reference='~cprov/ubuntu/ppa',
472 api_version='devel').jsonBody()
473 self.assertEqual(body['reference'], '~cprov/ubuntu/ppa')
474
475 def test_getByReference_invalid(self):
476- body = LaunchpadWebServiceCaller('consumer', '').named_get(
477+ body = webservice_for_person(None).named_get(
478 '/archives', 'getByReference', reference='~cprov/ubuntu',
479 api_version='devel').jsonBody()
480 self.assertIs(None, body)
481@@ -841,7 +839,7 @@ class TestArchiveSet(TestCaseWithFactory):
482 owner = archive.owner
483 reference = archive.reference
484 random = self.factory.makePerson()
485- body = LaunchpadWebServiceCaller('consumer', '').named_get(
486+ body = webservice_for_person(None).named_get(
487 '/archives', 'getByReference', reference=reference,
488 api_version='devel').jsonBody()
489 self.assertIs(None, body)
490diff --git a/lib/lp/testing/pages.py b/lib/lp/testing/pages.py
491index 8e54faa..2e2dc6e 100644
492--- a/lib/lp/testing/pages.py
493+++ b/lib/lp/testing/pages.py
494@@ -750,20 +750,24 @@ def webservice_for_person(person, consumer_key=u'launchpad-library',
495 Use this method to create a way to test the webservice that doesn't depend
496 on sample data.
497 """
498- if person.is_team:
499- raise AssertionError('This cannot be used with teams.')
500- login(ANONYMOUS)
501- oacs = getUtility(IOAuthConsumerSet)
502- consumer = oacs.getByKey(consumer_key)
503- if consumer is None:
504- consumer = oacs.new(consumer_key)
505- request_token, _ = consumer.newRequestToken()
506- request_token.review(person, permission, context)
507- access_token, access_secret = request_token.createAccessToken()
508+ kwargs = {}
509+ if person is not None:
510+ if person.is_team:
511+ raise AssertionError('This cannot be used with teams.')
512+ login(ANONYMOUS)
513+ oacs = getUtility(IOAuthConsumerSet)
514+ consumer = oacs.getByKey(consumer_key)
515+ if consumer is None:
516+ consumer = oacs.new(consumer_key)
517+ request_token, _ = consumer.newRequestToken()
518+ request_token.review(person, permission, context)
519+ access_token, access_secret = request_token.createAccessToken()
520+ kwargs['oauth_consumer_key'] = consumer_key
521+ kwargs['oauth_access_key'] = access_token.key
522+ kwargs['oauth_access_secret'] = access_secret
523+ kwargs['default_api_version'] = default_api_version
524 logout()
525- service = LaunchpadWebServiceCaller(
526- consumer_key, access_token.key, access_secret,
527- default_api_version=default_api_version)
528+ service = LaunchpadWebServiceCaller(**kwargs)
529 service.user = person
530 return service
531

Subscribers

People subscribed via source and target branches

to status/vote changes: