Merge lp:~cjwatson/canonical-identity-provider/ssoclient-accounts-bulk into lp:~canonical-isd-hackers/canonical-identity-provider/ssoclient

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: no longer in the source branch.
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: lp:~cjwatson/canonical-identity-provider/ssoclient-accounts-bulk
Merge into: lp:~canonical-isd-hackers/canonical-identity-provider/ssoclient
Diff against target: 119 lines (+83/-1)
2 files modified
ssoclient/tests/test_v2.py (+71/-0)
ssoclient/v2/client.py (+12/-1)
To merge this branch: bzr merge lp:~cjwatson/canonical-identity-provider/ssoclient-accounts-bulk
Reviewer Review Type Date Requested Status
Natalia Bidart (community) Approve
Review via email: mp+336536@code.launchpad.net

Commit message

Add support for the accounts-bulk API.

To post a comment you must log in.
Revision history for this message
Natalia Bidart (nataliabidart) wrote :

Looks great, thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'ssoclient/tests/test_v2.py'
--- ssoclient/tests/test_v2.py 2016-07-29 15:19:25 +0000
+++ ssoclient/tests/test_v2.py 2018-01-24 13:48:34 +0000
@@ -267,6 +267,36 @@
267 'token_secret': 'YcQgfuhpajCphDCnfNNceggfolHsXqdsXWSRufbzqeRJvEP',267 'token_secret': 'YcQgfuhpajCphDCnfNNceggfolHsXqdsXWSRufbzqeRJvEP',
268 }268 }
269269
270 def unparsed_account_details_bulk(self, expand=False):
271 """Unparsed bulk account details as how parse_response returns them."""
272 # For brevity, don't bother including all the fields here.
273 result = {
274 'FeAQLWE': {
275 'email': 'foo@foo.com',
276 'emails': [
277 {'href': '/api/v2/emails/foo@foo.com', 'verified': False},
278 ],
279 'href': '/api/v2/accounts/FeAQLWE',
280 },
281 'fzlFGM0': {
282 'email': 'bar@foo.com',
283 'emails': [
284 {'href': '/api/v2/emails/bar@foo.com', 'verified': False},
285 ],
286 'href': '/api/v2/accounts/fzlFGM0',
287 },
288 }
289 if expand:
290 result['FeAQLWE']['emails'][0].update({
291 'email': 'foo@foo.com',
292 'date_created': '2013-09-12T18:23:51.019',
293 })
294 result['fzlFGM0']['emails'][0].update({
295 'email': 'bar@foo.com',
296 'date_created': '2014-09-12T18:23:51.019',
297 })
298 return result
299
270 def assert_unicode_credentials(self, credentials):300 def assert_unicode_credentials(self, credentials):
271 self.mock_oauth.assert_called_once_with(301 self.mock_oauth.assert_called_once_with(
272 credentials['consumer_key'], credentials['consumer_secret'],302 credentials['consumer_key'], credentials['consumer_secret'],
@@ -618,6 +648,47 @@
618 )648 )
619 self.assertEqual(response, content)649 self.assertEqual(response, content)
620650
651 def test_account_details_bulk(self):
652 content = self.unparsed_account_details_bulk()
653 self.mock_request.return_value = mock_response(
654 status_code=200, content=content)
655 response = self.client.account_details_bulk(
656 ['FeAQLWE', 'fzlFGM0'], self.credentials)
657 self.assert_unicode_credentials(self.credentials)
658
659 oauth1 = self.mock_oauth.return_value
660 self.assert_request_called_with(
661 'POST', 'http://foo.com/accounts-bulk',
662 auth=oauth1, headers={'Content-Type': 'application/json'},
663 data={'openids': ['FeAQLWE', 'fzlFGM0'], 'expand': False},
664 )
665
666 self.assertEqual(response, content)
667
668 def test_account_details_bulk_expanded(self):
669 content = self.unparsed_account_details_bulk(expand=True)
670 self.mock_request.return_value = mock_response(
671 status_code=200, content=content)
672 response = self.client.account_details_bulk(
673 ['FeAQLWE', 'fzlFGM0'], self.credentials, expand=True)
674 self.assert_unicode_credentials(self.credentials)
675
676 oauth1 = self.mock_oauth.return_value
677 self.assert_request_called_with(
678 'POST', 'http://foo.com/accounts-bulk',
679 auth=oauth1, headers={'Content-Type': 'application/json'},
680 data={'openids': ['FeAQLWE', 'fzlFGM0'], 'expand': True},
681 )
682
683 expected = content.copy()
684 # dates are parsed
685 e = expected['FeAQLWE']['emails'][0]
686 e['date_created'] = datetime(2013, 9, 12, 18, 23, 51, 19000)
687 e = expected['fzlFGM0']['emails'][0]
688 e['date_created'] = datetime(2014, 9, 12, 18, 23, 51, 19000)
689
690 self.assertEqual(response, expected)
691
621692
622class EmailsV2ClientApiTestCase(V2ClientApiTestCase):693class EmailsV2ClientApiTestCase(V2ClientApiTestCase):
623694
624695
=== modified file 'ssoclient/v2/client.py'
--- ssoclient/v2/client.py 2016-07-29 15:19:25 +0000
+++ ssoclient/v2/client.py 2018-01-24 13:48:34 +0000
@@ -46,7 +46,7 @@
4646
4747
48class V2ApiClient(object):48class V2ApiClient(object):
49 """High-level client for theV2.0 API SSO resources."""49 """High-level client for the V2.0 API SSO resources."""
5050
51 def __init__(self, endpoint):51 def __init__(self, endpoint):
52 self.session = ApiSession(endpoint)52 self.session = ApiSession(endpoint)
@@ -107,6 +107,17 @@
107 result = parse_datetimes(response.content)107 result = parse_datetimes(response.content)
108 return result108 return result
109109
110 def account_details_bulk(self, openids, token, expand=False):
111 oauth = self._unicode_credentials(token)
112 data = {
113 'openids': [str(openid) for openid in openids],
114 'expand': expand,
115 }
116
117 response = self.session.post('/accounts-bulk', data=data, auth=oauth)
118 result = parse_datetimes(response.content)
119 return result
120
110 def email_delete(self, email, credentials):121 def email_delete(self, email, credentials):
111 oauth = self._unicode_credentials(credentials)122 oauth = self._unicode_credentials(credentials)
112 response = self.session.delete('/emails/%s' % email, auth=oauth)123 response = self.session.delete('/emails/%s' % email, auth=oauth)

Subscribers

People subscribed via source and target branches