Loading of client_secrets JSON file backed by a cache.
Contributed by crhyme.
Reviwed in http://codereview.appspot.com/6349087/.
diff --git a/tests/test_oauth2client_clientsecrets.py b/tests/test_oauth2client_clientsecrets.py
index 20cdf14..f69fb36 100644
--- a/tests/test_oauth2client_clientsecrets.py
+++ b/tests/test_oauth2client_clientsecrets.py
@@ -26,6 +26,11 @@
from oauth2client import clientsecrets
+DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
+VALID_FILE = os.path.join(DATA_DIR, 'client_secrets.json')
+INVALID_FILE = os.path.join(DATA_DIR, 'unfilled_client_secrets.json')
+NONEXISTENT_FILE = os.path.join(__file__, '..', 'afilethatisntthere.json')
+
class OAuth2CredentialsTests(unittest.TestCase):
def setUp(self):
@@ -69,12 +74,72 @@
def test_load_by_filename(self):
try:
- clientsecrets.loadfile(os.path.join(__file__, '..',
- 'afilethatisntthere.json'))
+ clientsecrets._loadfile(NONEXISTENT_FILE)
self.fail('should fail to load a missing client_secrets file.')
except clientsecrets.InvalidClientSecretsError, e:
self.assertTrue(str(e).startswith('File'))
+class CachedClientsecretsTests(unittest.TestCase):
+
+ class CacheMock(object):
+ def __init__(self):
+ self.cache = {}
+ self.last_get_ns = None
+ self.last_set_ns = None
+
+ def get(self, key, namespace=''):
+ # ignoring namespace for easier testing
+ self.last_get_ns = namespace
+ return self.cache.get(key, None)
+
+ def set(self, key, value, namespace=''):
+ # ignoring namespace for easier testing
+ self.last_set_ns = namespace
+ self.cache[key] = value
+
+ def setUp(self):
+ self.cache_mock = self.CacheMock()
+
+ def test_cache_miss(self):
+ client_type, client_info = clientsecrets.loadfile(
+ VALID_FILE, cache=self.cache_mock)
+ self.assertEquals('web', client_type)
+ self.assertEquals('foo_client_secret', client_info['client_secret'])
+
+ cached = self.cache_mock.cache[VALID_FILE]
+ self.assertEquals({client_type: client_info}, cached)
+
+ # make sure we're using non-empty namespace
+ ns = self.cache_mock.last_set_ns
+ self.assertTrue(bool(ns))
+ # make sure they're equal
+ self.assertEquals(ns, self.cache_mock.last_get_ns)
+
+ def test_cache_hit(self):
+ self.cache_mock.cache[NONEXISTENT_FILE] = { 'web': 'secret info' }
+
+ client_type, client_info = clientsecrets.loadfile(
+ NONEXISTENT_FILE, cache=self.cache_mock)
+ self.assertEquals('web', client_type)
+ self.assertEquals('secret info', client_info)
+ # make sure we didn't do any set() RPCs
+ self.assertEqual(None, self.cache_mock.last_set_ns)
+
+ def test_validation(self):
+ try:
+ clientsecrets.loadfile(INVALID_FILE, cache=self.cache_mock)
+ self.fail('Expected InvalidClientSecretsError to be raised '
+ 'while loading %s' % INVALID_FILE)
+ except clientsecrets.InvalidClientSecretsError:
+ pass
+
+ def test_without_cache(self):
+ # this also ensures loadfile() is backward compatible
+ client_type, client_info = clientsecrets.loadfile(VALID_FILE)
+ self.assertEquals('web', client_type)
+ self.assertEquals('foo_client_secret', client_info['client_secret'])
+
+
if __name__ == '__main__':
unittest.main()