blob: 90c75efed898f7189b541be4126a01b1a918fc68 [file] [log] [blame]
Helen Koikede13e3b2018-04-26 16:05:16 -03001# Copyright 2015 Google Inc. All rights reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15"""Unit tests for googleapiclient._helpers."""
16
17import unittest
18
19import mock
20
21import six
22from six.moves import urllib
23
24from googleapiclient import _helpers
25
26
27class PositionalTests(unittest.TestCase):
Helen Koikede13e3b2018-04-26 16:05:16 -030028 def test_usage(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070029 _helpers.positional_parameters_enforcement = _helpers.POSITIONAL_EXCEPTION
Helen Koikede13e3b2018-04-26 16:05:16 -030030
31 # 1 positional arg, 1 keyword-only arg.
32 @_helpers.positional(1)
33 def function(pos, kwonly=None):
34 return True
35
36 self.assertTrue(function(1))
37 self.assertTrue(function(1, kwonly=2))
38 with self.assertRaises(TypeError):
39 function(1, 2)
40
41 # No positional, but a required keyword arg.
42 @_helpers.positional(0)
43 def function2(required_kw):
44 return True
45
46 self.assertTrue(function2(required_kw=1))
47 with self.assertRaises(TypeError):
48 function2(1)
49
50 # Unspecified positional, should automatically figure out 1 positional
51 # 1 keyword-only (same as first case above).
52 @_helpers.positional
53 def function3(pos, kwonly=None):
54 return True
55
56 self.assertTrue(function3(1))
57 self.assertTrue(function3(1, kwonly=2))
58 with self.assertRaises(TypeError):
59 function3(1, 2)
60
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070061 @mock.patch("googleapiclient._helpers.logger")
Helen Koikede13e3b2018-04-26 16:05:16 -030062 def test_enforcement_warning(self, mock_logger):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070063 _helpers.positional_parameters_enforcement = _helpers.POSITIONAL_WARNING
Helen Koikede13e3b2018-04-26 16:05:16 -030064
65 @_helpers.positional(1)
66 def function(pos, kwonly=None):
67 return True
68
69 self.assertTrue(function(1, 2))
70 self.assertTrue(mock_logger.warning.called)
71
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070072 @mock.patch("googleapiclient._helpers.logger")
Helen Koikede13e3b2018-04-26 16:05:16 -030073 def test_enforcement_ignore(self, mock_logger):
74 _helpers.positional_parameters_enforcement = _helpers.POSITIONAL_IGNORE
75
76 @_helpers.positional(1)
77 def function(pos, kwonly=None):
78 return True
79
80 self.assertTrue(function(1, 2))
81 self.assertFalse(mock_logger.warning.called)
82
83
84class AddQueryParameterTests(unittest.TestCase):
Helen Koikede13e3b2018-04-26 16:05:16 -030085 def test__add_query_parameter(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070086 self.assertEqual(_helpers._add_query_parameter("/action", "a", None), "/action")
Helen Koikede13e3b2018-04-26 16:05:16 -030087 self.assertEqual(
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070088 _helpers._add_query_parameter("/action", "a", "b"), "/action?a=b"
89 )
Helen Koikede13e3b2018-04-26 16:05:16 -030090 self.assertEqual(
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070091 _helpers._add_query_parameter("/action?a=b", "a", "c"), "/action?a=c"
92 )
Helen Koikede13e3b2018-04-26 16:05:16 -030093 # Order is non-deterministic.
94 self.assertIn(
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070095 _helpers._add_query_parameter("/action?a=b", "c", "d"),
96 ["/action?a=b&c=d", "/action?c=d&a=b"],
97 )
Helen Koikede13e3b2018-04-26 16:05:16 -030098 self.assertEqual(
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070099 _helpers._add_query_parameter("/action", "a", " ="), "/action?a=+%3D"
100 )
Helen Koikede13e3b2018-04-26 16:05:16 -0300101
102
103def assertUrisEqual(testcase, expected, actual):
104 """Test that URIs are the same, up to reordering of query parameters."""
105 expected = urllib.parse.urlparse(expected)
106 actual = urllib.parse.urlparse(actual)
107 testcase.assertEqual(expected.scheme, actual.scheme)
108 testcase.assertEqual(expected.netloc, actual.netloc)
109 testcase.assertEqual(expected.path, actual.path)
110 testcase.assertEqual(expected.params, actual.params)
111 testcase.assertEqual(expected.fragment, actual.fragment)
112 expected_query = urllib.parse.parse_qs(expected.query)
113 actual_query = urllib.parse.parse_qs(actual.query)
114 for name in expected_query.keys():
115 testcase.assertEqual(expected_query[name], actual_query[name])
116 for name in actual_query.keys():
117 testcase.assertEqual(expected_query[name], actual_query[name])
118
119
120class Test_update_query_params(unittest.TestCase):
Helen Koikede13e3b2018-04-26 16:05:16 -0300121 def test_update_query_params_no_params(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700122 uri = "http://www.google.com"
123 updated = _helpers.update_query_params(uri, {"a": "b"})
124 self.assertEqual(updated, uri + "?a=b")
Helen Koikede13e3b2018-04-26 16:05:16 -0300125
126 def test_update_query_params_existing_params(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700127 uri = "http://www.google.com?x=y"
128 updated = _helpers.update_query_params(uri, {"a": "b", "c": "d&"})
129 hardcoded_update = uri + "&a=b&c=d%26"
Helen Koikede13e3b2018-04-26 16:05:16 -0300130 assertUrisEqual(self, updated, hardcoded_update)
131
132 def test_update_query_params_replace_param(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700133 base_uri = "http://www.google.com"
134 uri = base_uri + "?x=a"
135 updated = _helpers.update_query_params(uri, {"x": "b", "y": "c"})
136 hardcoded_update = base_uri + "?x=b&y=c"
Helen Koikede13e3b2018-04-26 16:05:16 -0300137 assertUrisEqual(self, updated, hardcoded_update)
138
139 def test_update_query_params_repeated_params(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700140 uri = "http://www.google.com?x=a&x=b"
Helen Koikede13e3b2018-04-26 16:05:16 -0300141 with self.assertRaises(ValueError):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700142 _helpers.update_query_params(uri, {"a": "c"})
Helen Koikede13e3b2018-04-26 16:05:16 -0300143
144
145class Test_parse_unique_urlencoded(unittest.TestCase):
Helen Koikede13e3b2018-04-26 16:05:16 -0300146 def test_without_repeats(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700147 content = "a=b&c=d"
Helen Koikede13e3b2018-04-26 16:05:16 -0300148 result = _helpers.parse_unique_urlencoded(content)
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700149 self.assertEqual(result, {"a": "b", "c": "d"})
Helen Koikede13e3b2018-04-26 16:05:16 -0300150
151 def test_with_repeats(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700152 content = "a=b&a=d"
Helen Koikede13e3b2018-04-26 16:05:16 -0300153 with self.assertRaises(ValueError):
154 _helpers.parse_unique_urlencoded(content)