1"""Unit tests for oauth2client.util.""" 2 3import mock 4import unittest2 5 6from oauth2client import util 7 8 9__author__ = '[email protected] (Joe Gregorio)' 10 11 12class PositionalTests(unittest2.TestCase): 13 14 def test_usage(self): 15 util.positional_parameters_enforcement = util.POSITIONAL_EXCEPTION 16 17 # 1 positional arg, 1 keyword-only arg. 18 @util.positional(1) 19 def fn(pos, kwonly=None): 20 return True 21 22 self.assertTrue(fn(1)) 23 self.assertTrue(fn(1, kwonly=2)) 24 with self.assertRaises(TypeError): 25 fn(1, 2) 26 27 # No positional, but a required keyword arg. 28 @util.positional(0) 29 def fn2(required_kw): 30 return True 31 32 self.assertTrue(fn2(required_kw=1)) 33 with self.assertRaises(TypeError): 34 fn2(1) 35 36 # Unspecified positional, should automatically figure out 1 positional 37 # 1 keyword-only (same as first case above). 38 @util.positional 39 def fn3(pos, kwonly=None): 40 return True 41 42 self.assertTrue(fn3(1)) 43 self.assertTrue(fn3(1, kwonly=2)) 44 with self.assertRaises(TypeError): 45 fn3(1, 2) 46 47 @mock.patch('oauth2client.util.logger') 48 def test_enforcement_warning(self, mock_logger): 49 util.positional_parameters_enforcement = util.POSITIONAL_WARNING 50 51 @util.positional(1) 52 def fn(pos, kwonly=None): 53 return True 54 55 self.assertTrue(fn(1, 2)) 56 self.assertTrue(mock_logger.warning.called) 57 58 @mock.patch('oauth2client.util.logger') 59 def test_enforcement_ignore(self, mock_logger): 60 util.positional_parameters_enforcement = util.POSITIONAL_IGNORE 61 62 @util.positional(1) 63 def fn(pos, kwonly=None): 64 return True 65 66 self.assertTrue(fn(1, 2)) 67 self.assertFalse(mock_logger.warning.called) 68 69 70class ScopeToStringTests(unittest2.TestCase): 71 72 def test_iterables(self): 73 cases = [ 74 ('', ''), 75 ('', ()), 76 ('', []), 77 ('', ('',)), 78 ('', ['', ]), 79 ('a', ('a',)), 80 ('b', ['b', ]), 81 ('a b', ['a', 'b']), 82 ('a b', ('a', 'b')), 83 ('a b', 'a b'), 84 ('a b', (s for s in ['a', 'b'])), 85 ] 86 for expected, case in cases: 87 self.assertEqual(expected, util.scopes_to_string(case)) 88 89 90class StringToScopeTests(unittest2.TestCase): 91 92 def test_conversion(self): 93 cases = [ 94 (['a', 'b'], ['a', 'b']), 95 ('', []), 96 ('a', ['a']), 97 ('a b c d e f', ['a', 'b', 'c', 'd', 'e', 'f']), 98 ] 99 100 for case, expected in cases: 101 self.assertEqual(expected, util.string_to_scopes(case)) 102 103 104class AddQueryParameterTests(unittest2.TestCase): 105 106 def test__add_query_parameter(self): 107 self.assertEqual( 108 util._add_query_parameter('/action', 'a', None), 109 '/action') 110 self.assertEqual( 111 util._add_query_parameter('/action', 'a', 'b'), 112 '/action?a=b') 113 self.assertEqual( 114 util._add_query_parameter('/action?a=b', 'a', 'c'), 115 '/action?a=c') 116 # Order is non-deterministic. 117 self.assertIn( 118 util._add_query_parameter('/action?a=b', 'c', 'd'), 119 ['/action?a=b&c=d', '/action?c=d&a=b']) 120 self.assertEqual( 121 util._add_query_parameter('/action', 'a', ' ='), 122 '/action?a=+%3D') 123