blob: ab0bd4bdb38f05bb1d74015d08b7d5fd22723227 [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
Anthonios Partheniou9f7b4102021-07-23 12:18:25 -040018import urllib
Helen Koikede13e3b2018-04-26 16:05:16 -030019
20import mock
Helen Koikede13e3b2018-04-26 16:05:16 -030021from googleapiclient import _helpers
22
23
24class PositionalTests(unittest.TestCase):
Helen Koikede13e3b2018-04-26 16:05:16 -030025 def test_usage(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070026 _helpers.positional_parameters_enforcement = _helpers.POSITIONAL_EXCEPTION
Helen Koikede13e3b2018-04-26 16:05:16 -030027
28 # 1 positional arg, 1 keyword-only arg.
29 @_helpers.positional(1)
30 def function(pos, kwonly=None):
31 return True
32
33 self.assertTrue(function(1))
34 self.assertTrue(function(1, kwonly=2))
35 with self.assertRaises(TypeError):
36 function(1, 2)
37
38 # No positional, but a required keyword arg.
39 @_helpers.positional(0)
40 def function2(required_kw):
41 return True
42
43 self.assertTrue(function2(required_kw=1))
44 with self.assertRaises(TypeError):
45 function2(1)
46
47 # Unspecified positional, should automatically figure out 1 positional
48 # 1 keyword-only (same as first case above).
49 @_helpers.positional
50 def function3(pos, kwonly=None):
51 return True
52
53 self.assertTrue(function3(1))
54 self.assertTrue(function3(1, kwonly=2))
55 with self.assertRaises(TypeError):
56 function3(1, 2)
57
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070058 @mock.patch("googleapiclient._helpers.logger")
Helen Koikede13e3b2018-04-26 16:05:16 -030059 def test_enforcement_warning(self, mock_logger):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070060 _helpers.positional_parameters_enforcement = _helpers.POSITIONAL_WARNING
Helen Koikede13e3b2018-04-26 16:05:16 -030061
62 @_helpers.positional(1)
63 def function(pos, kwonly=None):
64 return True
65
66 self.assertTrue(function(1, 2))
67 self.assertTrue(mock_logger.warning.called)
68
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070069 @mock.patch("googleapiclient._helpers.logger")
Helen Koikede13e3b2018-04-26 16:05:16 -030070 def test_enforcement_ignore(self, mock_logger):
71 _helpers.positional_parameters_enforcement = _helpers.POSITIONAL_IGNORE
72
73 @_helpers.positional(1)
74 def function(pos, kwonly=None):
75 return True
76
77 self.assertTrue(function(1, 2))
78 self.assertFalse(mock_logger.warning.called)
79
80
81class AddQueryParameterTests(unittest.TestCase):
Helen Koikede13e3b2018-04-26 16:05:16 -030082 def test__add_query_parameter(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070083 self.assertEqual(_helpers._add_query_parameter("/action", "a", None), "/action")
Helen Koikede13e3b2018-04-26 16:05:16 -030084 self.assertEqual(
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070085 _helpers._add_query_parameter("/action", "a", "b"), "/action?a=b"
86 )
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", "a", "c"), "/action?a=c"
89 )
Helen Koikede13e3b2018-04-26 16:05:16 -030090 # Order is non-deterministic.
91 self.assertIn(
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070092 _helpers._add_query_parameter("/action?a=b", "c", "d"),
93 ["/action?a=b&c=d", "/action?c=d&a=b"],
94 )
Helen Koikede13e3b2018-04-26 16:05:16 -030095 self.assertEqual(
Bu Sun Kim66bb32c2019-10-30 10:11:58 -070096 _helpers._add_query_parameter("/action", "a", " ="), "/action?a=+%3D"
97 )
Helen Koikede13e3b2018-04-26 16:05:16 -030098
99
100def assertUrisEqual(testcase, expected, actual):
101 """Test that URIs are the same, up to reordering of query parameters."""
102 expected = urllib.parse.urlparse(expected)
103 actual = urllib.parse.urlparse(actual)
104 testcase.assertEqual(expected.scheme, actual.scheme)
105 testcase.assertEqual(expected.netloc, actual.netloc)
106 testcase.assertEqual(expected.path, actual.path)
107 testcase.assertEqual(expected.params, actual.params)
108 testcase.assertEqual(expected.fragment, actual.fragment)
109 expected_query = urllib.parse.parse_qs(expected.query)
110 actual_query = urllib.parse.parse_qs(actual.query)
111 for name in expected_query.keys():
112 testcase.assertEqual(expected_query[name], actual_query[name])
113 for name in actual_query.keys():
114 testcase.assertEqual(expected_query[name], actual_query[name])
115
116
117class Test_update_query_params(unittest.TestCase):
Helen Koikede13e3b2018-04-26 16:05:16 -0300118 def test_update_query_params_no_params(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700119 uri = "http://www.google.com"
120 updated = _helpers.update_query_params(uri, {"a": "b"})
121 self.assertEqual(updated, uri + "?a=b")
Helen Koikede13e3b2018-04-26 16:05:16 -0300122
123 def test_update_query_params_existing_params(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700124 uri = "http://www.google.com?x=y"
125 updated = _helpers.update_query_params(uri, {"a": "b", "c": "d&"})
126 hardcoded_update = uri + "&a=b&c=d%26"
Helen Koikede13e3b2018-04-26 16:05:16 -0300127 assertUrisEqual(self, updated, hardcoded_update)
128
129 def test_update_query_params_replace_param(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700130 base_uri = "http://www.google.com"
131 uri = base_uri + "?x=a"
132 updated = _helpers.update_query_params(uri, {"x": "b", "y": "c"})
133 hardcoded_update = base_uri + "?x=b&y=c"
Helen Koikede13e3b2018-04-26 16:05:16 -0300134 assertUrisEqual(self, updated, hardcoded_update)
135
136 def test_update_query_params_repeated_params(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700137 uri = "http://www.google.com?x=a&x=b"
Helen Koikede13e3b2018-04-26 16:05:16 -0300138 with self.assertRaises(ValueError):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700139 _helpers.update_query_params(uri, {"a": "c"})
Helen Koikede13e3b2018-04-26 16:05:16 -0300140
141
142class Test_parse_unique_urlencoded(unittest.TestCase):
Helen Koikede13e3b2018-04-26 16:05:16 -0300143 def test_without_repeats(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700144 content = "a=b&c=d"
Helen Koikede13e3b2018-04-26 16:05:16 -0300145 result = _helpers.parse_unique_urlencoded(content)
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700146 self.assertEqual(result, {"a": "b", "c": "d"})
Helen Koikede13e3b2018-04-26 16:05:16 -0300147
148 def test_with_repeats(self):
Bu Sun Kim66bb32c2019-10-30 10:11:58 -0700149 content = "a=b&a=d"
Helen Koikede13e3b2018-04-26 16:05:16 -0300150 with self.assertRaises(ValueError):
151 _helpers.parse_unique_urlencoded(content)