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