aboutsummaryrefslogtreecommitdiff
path: root/tests/test_util.py
blob: 533460f185629db928453c1d52f660fb3cbeebdb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
"""Unit tests for oauth2client.util."""

import mock
import unittest2

from oauth2client import util


__author__ = 'jcgregorio@google.com (Joe Gregorio)'


class PositionalTests(unittest2.TestCase):

    def test_usage(self):
        util.positional_parameters_enforcement = util.POSITIONAL_EXCEPTION

        # 1 positional arg, 1 keyword-only arg.
        @util.positional(1)
        def fn(pos, kwonly=None):
            return True

        self.assertTrue(fn(1))
        self.assertTrue(fn(1, kwonly=2))
        with self.assertRaises(TypeError):
            fn(1, 2)

        # No positional, but a required keyword arg.
        @util.positional(0)
        def fn2(required_kw):
            return True

        self.assertTrue(fn2(required_kw=1))
        with self.assertRaises(TypeError):
            fn2(1)

        # Unspecified positional, should automatically figure out 1 positional
        # 1 keyword-only (same as first case above).
        @util.positional
        def fn3(pos, kwonly=None):
            return True

        self.assertTrue(fn3(1))
        self.assertTrue(fn3(1, kwonly=2))
        with self.assertRaises(TypeError):
            fn3(1, 2)

    @mock.patch('oauth2client.util.logger')
    def test_enforcement_warning(self, mock_logger):
        util.positional_parameters_enforcement = util.POSITIONAL_WARNING

        @util.positional(1)
        def fn(pos, kwonly=None):
            return True

        self.assertTrue(fn(1, 2))
        self.assertTrue(mock_logger.warning.called)

    @mock.patch('oauth2client.util.logger')
    def test_enforcement_ignore(self, mock_logger):
        util.positional_parameters_enforcement = util.POSITIONAL_IGNORE

        @util.positional(1)
        def fn(pos, kwonly=None):
            return True

        self.assertTrue(fn(1, 2))
        self.assertFalse(mock_logger.warning.called)


class ScopeToStringTests(unittest2.TestCase):

    def test_iterables(self):
        cases = [
            ('', ''),
            ('', ()),
            ('', []),
            ('', ('',)),
            ('', ['', ]),
            ('a', ('a',)),
            ('b', ['b', ]),
            ('a b', ['a', 'b']),
            ('a b', ('a', 'b')),
            ('a b', 'a b'),
            ('a b', (s for s in ['a', 'b'])),
        ]
        for expected, case in cases:
            self.assertEqual(expected, util.scopes_to_string(case))


class StringToScopeTests(unittest2.TestCase):

    def test_conversion(self):
        cases = [
            (['a', 'b'], ['a', 'b']),
            ('', []),
            ('a', ['a']),
            ('a b c d e f', ['a', 'b', 'c', 'd', 'e', 'f']),
        ]

        for case, expected in cases:
            self.assertEqual(expected, util.string_to_scopes(case))


class AddQueryParameterTests(unittest2.TestCase):

    def test__add_query_parameter(self):
        self.assertEqual(
            util._add_query_parameter('/action', 'a', None),
            '/action')
        self.assertEqual(
            util._add_query_parameter('/action', 'a', 'b'),
            '/action?a=b')
        self.assertEqual(
            util._add_query_parameter('/action?a=b', 'a', 'c'),
            '/action?a=c')
        # Order is non-deterministic.
        self.assertIn(
            util._add_query_parameter('/action?a=b', 'c', 'd'),
            ['/action?a=b&c=d', '/action?c=d&a=b'])
        self.assertEqual(
            util._add_query_parameter('/action', 'a', ' ='),
            '/action?a=+%3D')