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
1=== modified file 'ssoclient/tests/test_v2.py'
2--- ssoclient/tests/test_v2.py 2016-07-29 15:19:25 +0000
3+++ ssoclient/tests/test_v2.py 2018-01-24 13:48:34 +0000
4@@ -267,6 +267,36 @@
5 'token_secret': 'YcQgfuhpajCphDCnfNNceggfolHsXqdsXWSRufbzqeRJvEP',
6 }
7
8+ def unparsed_account_details_bulk(self, expand=False):
9+ """Unparsed bulk account details as how parse_response returns them."""
10+ # For brevity, don't bother including all the fields here.
11+ result = {
12+ 'FeAQLWE': {
13+ 'email': 'foo@foo.com',
14+ 'emails': [
15+ {'href': '/api/v2/emails/foo@foo.com', 'verified': False},
16+ ],
17+ 'href': '/api/v2/accounts/FeAQLWE',
18+ },
19+ 'fzlFGM0': {
20+ 'email': 'bar@foo.com',
21+ 'emails': [
22+ {'href': '/api/v2/emails/bar@foo.com', 'verified': False},
23+ ],
24+ 'href': '/api/v2/accounts/fzlFGM0',
25+ },
26+ }
27+ if expand:
28+ result['FeAQLWE']['emails'][0].update({
29+ 'email': 'foo@foo.com',
30+ 'date_created': '2013-09-12T18:23:51.019',
31+ })
32+ result['fzlFGM0']['emails'][0].update({
33+ 'email': 'bar@foo.com',
34+ 'date_created': '2014-09-12T18:23:51.019',
35+ })
36+ return result
37+
38 def assert_unicode_credentials(self, credentials):
39 self.mock_oauth.assert_called_once_with(
40 credentials['consumer_key'], credentials['consumer_secret'],
41@@ -618,6 +648,47 @@
42 )
43 self.assertEqual(response, content)
44
45+ def test_account_details_bulk(self):
46+ content = self.unparsed_account_details_bulk()
47+ self.mock_request.return_value = mock_response(
48+ status_code=200, content=content)
49+ response = self.client.account_details_bulk(
50+ ['FeAQLWE', 'fzlFGM0'], self.credentials)
51+ self.assert_unicode_credentials(self.credentials)
52+
53+ oauth1 = self.mock_oauth.return_value
54+ self.assert_request_called_with(
55+ 'POST', 'http://foo.com/accounts-bulk',
56+ auth=oauth1, headers={'Content-Type': 'application/json'},
57+ data={'openids': ['FeAQLWE', 'fzlFGM0'], 'expand': False},
58+ )
59+
60+ self.assertEqual(response, content)
61+
62+ def test_account_details_bulk_expanded(self):
63+ content = self.unparsed_account_details_bulk(expand=True)
64+ self.mock_request.return_value = mock_response(
65+ status_code=200, content=content)
66+ response = self.client.account_details_bulk(
67+ ['FeAQLWE', 'fzlFGM0'], self.credentials, expand=True)
68+ self.assert_unicode_credentials(self.credentials)
69+
70+ oauth1 = self.mock_oauth.return_value
71+ self.assert_request_called_with(
72+ 'POST', 'http://foo.com/accounts-bulk',
73+ auth=oauth1, headers={'Content-Type': 'application/json'},
74+ data={'openids': ['FeAQLWE', 'fzlFGM0'], 'expand': True},
75+ )
76+
77+ expected = content.copy()
78+ # dates are parsed
79+ e = expected['FeAQLWE']['emails'][0]
80+ e['date_created'] = datetime(2013, 9, 12, 18, 23, 51, 19000)
81+ e = expected['fzlFGM0']['emails'][0]
82+ e['date_created'] = datetime(2014, 9, 12, 18, 23, 51, 19000)
83+
84+ self.assertEqual(response, expected)
85+
86
87 class EmailsV2ClientApiTestCase(V2ClientApiTestCase):
88
89
90=== modified file 'ssoclient/v2/client.py'
91--- ssoclient/v2/client.py 2016-07-29 15:19:25 +0000
92+++ ssoclient/v2/client.py 2018-01-24 13:48:34 +0000
93@@ -46,7 +46,7 @@
94
95
96 class V2ApiClient(object):
97- """High-level client for theV2.0 API SSO resources."""
98+ """High-level client for the V2.0 API SSO resources."""
99
100 def __init__(self, endpoint):
101 self.session = ApiSession(endpoint)
102@@ -107,6 +107,17 @@
103 result = parse_datetimes(response.content)
104 return result
105
106+ def account_details_bulk(self, openids, token, expand=False):
107+ oauth = self._unicode_credentials(token)
108+ data = {
109+ 'openids': [str(openid) for openid in openids],
110+ 'expand': expand,
111+ }
112+
113+ response = self.session.post('/accounts-bulk', data=data, auth=oauth)
114+ result = parse_datetimes(response.content)
115+ return result
116+
117 def email_delete(self, email, credentials):
118 oauth = self._unicode_credentials(credentials)
119 response = self.session.delete('/emails/%s' % email, auth=oauth)

Subscribers

People subscribed via source and target branches