Mercurial > summit-idp
changeset 68:5c3f592522ea
Added 'rev' property to get response and 'since_rev' queryarg option to get requests
author | Atul Varma <avarma@mozilla.com> |
---|---|
date | Tue, 29 Jun 2010 21:18:44 -0700 |
parents | 8be999c3d066 |
children | 4b260d4ca1d4 |
files | summitidp/app.py tests/test_app.py |
diffstat | 2 files changed, 58 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/summitidp/app.py Tue Jun 29 20:26:18 2010 -0700 +++ b/summitidp/app.py Tue Jun 29 21:18:44 2010 -0700 @@ -91,19 +91,38 @@ return self.__tokens[token]['contents'] class ProfileStore(object): - def __init__(self, mapping=None): + def __init__(self, mapping=None, rev_mapping=None): if mapping is None: mapping = {} + if rev_mapping is None: + rev_mapping = {} + self.__rev_mapping = rev_mapping self.__profiles = mapping + all_revs = [self.__rev_mapping[rev] + for rev in self.__rev_mapping] + if all_revs: + latest_rev = max(all_revs) + else: + latest_rev = 0 + self.__latest_rev = latest_rev def set(self, user_id, contents): - self.__profiles[str(user_id)] = contents + user_id = str(user_id) + self.__profiles[user_id] = contents + self.__latest_rev += 1 + self.__rev_mapping[user_id] = self.__latest_rev - def get(self): - everything = {} - for user_id in self.__profiles: - everything[user_id] = self.__profiles[user_id] - return everything + def get(self, since_rev=0): + result = {} + user_ids = [user_id for user_id in self.__profiles + if self.__rev_mapping.get(user_id, 0) > since_rev] + for user_id in user_ids: + result[user_id] = self.__profiles[user_id] + return result + + @property + def rev(self): + return self.__latest_rev class Server(object): request_challenge_path = '/challenge/request' @@ -181,9 +200,17 @@ '400 Bad Request', {'error': 'invalid or expired token'} ) - profile = self.profiles.get() + try: + since_rev = int(req.qargs.get('since_rev', 0)) + except ValueError: + return req.json_response( + '400 Bad Request', + {'error': 'invalid since_rev value'} + ) + profile = self.profiles.get(since_rev) return req.json_response('200 OK', - {'contents': profile}) + {'rev': self.profiles.rev, + 'contents': profile}) elif req.method == 'POST': body = req.get_body() if body and 'token' in body and 'contents' in body:
--- a/tests/test_app.py Tue Jun 29 20:26:18 2010 -0700 +++ b/tests/test_app.py Tue Jun 29 21:18:44 2010 -0700 @@ -164,6 +164,15 @@ status=400) @apptest +def test_get_profile_with_invalid_since_rev(): + token = server.auth_tokens.create(email='bob@foo.com', + user_id=0) + resp = app.get('%s?token=%s&since_rev=foo' % + (server.profile_path, token), + status=400) + assert resp.json == {"error": "invalid since_rev value"} + +@apptest def test_set_and_get_profile(): token = server.auth_tokens.create(email='bob@foo.com', user_id=0) @@ -171,7 +180,8 @@ {'token': token, 'contents': {'name': 'bob jones'}}) resp = app.get('%s?token=%s' % (server.profile_path, token)) - assert resp.json == {"contents": {"0": {"name": "bob jones"}}} + assert resp.json == {"rev": 1, + "contents": {"0": {"name": "bob jones"}}} # Make sure it works twice. @@ -179,7 +189,8 @@ {'token': token, 'contents': {'alias': 'blah'}}) resp = app.get('%s?token=%s' % (server.profile_path, token)) - assert resp.json == {"contents": {"0": {"alias": "blah"}}} + assert resp.json == {"rev": 2, + "contents": {"0": {"alias": "blah"}}} # Add another user's profile. @@ -189,5 +200,13 @@ {'token': token2, 'contents': {'name': 'jane person'}}) resp = app.get('%s?token=%s' % (server.profile_path, token2)) - assert resp.json == {"contents": {"0": {"alias": "blah"}, + assert resp.json == {"rev": 3, + "contents": {"0": {"alias": "blah"}, "1": {"name": "jane person"}}} + + # Ensure since_rev works. + + resp = app.get('%s?token=%s&since_rev=2' % + (server.profile_path, token2)) + assert resp.json == {"rev": 3, + "contents": {"1": {"name": "jane person"}}}