OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/env python |
| 2 # |
| 3 # Copyright 2010 Google Inc. |
| 4 # |
| 5 # Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 # you may not use this file except in compliance with the License. |
| 7 # You may obtain a copy of the License at |
| 8 # |
| 9 # http://www.apache.org/licenses/LICENSE-2.0 |
| 10 # |
| 11 # Unless required by applicable law or agreed to in writing, software |
| 12 # distributed under the License is distributed on an "AS IS" BASIS, |
| 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 # See the License for the specific language governing permissions and |
| 15 # limitations under the License. |
| 16 # |
| 17 |
| 18 """Tests for apitools.base.protorpclite.util.""" |
| 19 import datetime |
| 20 import sys |
| 21 import types |
| 22 import unittest |
| 23 |
| 24 import six |
| 25 |
| 26 from apitools.base.protorpclite import test_util |
| 27 from apitools.base.protorpclite import util |
| 28 |
| 29 |
| 30 class ModuleInterfaceTest(test_util.ModuleInterfaceTest, |
| 31 test_util.TestCase): |
| 32 |
| 33 MODULE = util |
| 34 |
| 35 |
| 36 class UtilTest(test_util.TestCase): |
| 37 |
| 38 def testDecoratedFunction_LengthZero(self): |
| 39 @util.positional(0) |
| 40 def fn(kwonly=1): |
| 41 return [kwonly] |
| 42 self.assertEquals([1], fn()) |
| 43 self.assertEquals([2], fn(kwonly=2)) |
| 44 self.assertRaisesWithRegexpMatch(TypeError, |
| 45 r'fn\(\) takes at most 0 positional ' |
| 46 r'arguments \(1 given\)', |
| 47 fn, 1) |
| 48 |
| 49 def testDecoratedFunction_LengthOne(self): |
| 50 @util.positional(1) |
| 51 def fn(pos, kwonly=1): |
| 52 return [pos, kwonly] |
| 53 self.assertEquals([1, 1], fn(1)) |
| 54 self.assertEquals([2, 2], fn(2, kwonly=2)) |
| 55 self.assertRaisesWithRegexpMatch(TypeError, |
| 56 r'fn\(\) takes at most 1 positional ' |
| 57 r'argument \(2 given\)', |
| 58 fn, 2, 3) |
| 59 |
| 60 def testDecoratedFunction_LengthTwoWithDefault(self): |
| 61 @util.positional(2) |
| 62 def fn(pos1, pos2=1, kwonly=1): |
| 63 return [pos1, pos2, kwonly] |
| 64 self.assertEquals([1, 1, 1], fn(1)) |
| 65 self.assertEquals([2, 2, 1], fn(2, 2)) |
| 66 self.assertEquals([2, 3, 4], fn(2, 3, kwonly=4)) |
| 67 self.assertRaisesWithRegexpMatch(TypeError, |
| 68 r'fn\(\) takes at most 2 positional ' |
| 69 r'arguments \(3 given\)', |
| 70 fn, 2, 3, 4) |
| 71 |
| 72 def testDecoratedMethod(self): |
| 73 class MyClass(object): |
| 74 |
| 75 @util.positional(2) |
| 76 def meth(self, pos1, kwonly=1): |
| 77 return [pos1, kwonly] |
| 78 self.assertEquals([1, 1], MyClass().meth(1)) |
| 79 self.assertEquals([2, 2], MyClass().meth(2, kwonly=2)) |
| 80 self.assertRaisesWithRegexpMatch( |
| 81 TypeError, |
| 82 r'meth\(\) takes at most 2 positional arguments \(3 given\)', |
| 83 MyClass().meth, 2, 3) |
| 84 |
| 85 def testDefaultDecoration(self): |
| 86 @util.positional |
| 87 def fn(a, b, c=None): |
| 88 return a, b, c |
| 89 self.assertEquals((1, 2, 3), fn(1, 2, c=3)) |
| 90 self.assertEquals((3, 4, None), fn(3, b=4)) |
| 91 self.assertRaisesWithRegexpMatch(TypeError, |
| 92 r'fn\(\) takes at most 2 positional ' |
| 93 r'arguments \(3 given\)', |
| 94 fn, 2, 3, 4) |
| 95 |
| 96 def testDefaultDecorationNoKwdsFails(self): |
| 97 def fn(a): |
| 98 return a |
| 99 self.assertRaisesRegexp( |
| 100 ValueError, |
| 101 ('Functions with no keyword arguments must specify ' |
| 102 'max_positional_args'), |
| 103 util.positional, fn) |
| 104 |
| 105 def testDecoratedFunctionDocstring(self): |
| 106 @util.positional(0) |
| 107 def fn(kwonly=1): |
| 108 """fn docstring.""" |
| 109 return [kwonly] |
| 110 self.assertEquals('fn docstring.', fn.__doc__) |
| 111 |
| 112 |
| 113 class GetPackageForModuleTest(test_util.TestCase): |
| 114 |
| 115 def setUp(self): |
| 116 self.original_modules = dict(sys.modules) |
| 117 |
| 118 def tearDown(self): |
| 119 sys.modules.clear() |
| 120 sys.modules.update(self.original_modules) |
| 121 |
| 122 def CreateModule(self, name, file_name=None): |
| 123 if file_name is None: |
| 124 file_name = '%s.py' % name |
| 125 module = types.ModuleType(name) |
| 126 sys.modules[name] = module |
| 127 return module |
| 128 |
| 129 def assertPackageEquals(self, expected, actual): |
| 130 self.assertEquals(expected, actual) |
| 131 if actual is not None: |
| 132 self.assertTrue(isinstance(actual, six.text_type)) |
| 133 |
| 134 def testByString(self): |
| 135 module = self.CreateModule('service_module') |
| 136 module.package = 'my_package' |
| 137 self.assertPackageEquals('my_package', |
| 138 util.get_package_for_module('service_module')) |
| 139 |
| 140 def testModuleNameNotInSys(self): |
| 141 self.assertPackageEquals(None, |
| 142 util.get_package_for_module('service_module')) |
| 143 |
| 144 def testHasPackage(self): |
| 145 module = self.CreateModule('service_module') |
| 146 module.package = 'my_package' |
| 147 self.assertPackageEquals( |
| 148 'my_package', util.get_package_for_module(module)) |
| 149 |
| 150 def testHasModuleName(self): |
| 151 module = self.CreateModule('service_module') |
| 152 self.assertPackageEquals('service_module', |
| 153 util.get_package_for_module(module)) |
| 154 |
| 155 def testIsMain(self): |
| 156 module = self.CreateModule('__main__') |
| 157 module.__file__ = '/bing/blam/bloom/blarm/my_file.py' |
| 158 self.assertPackageEquals( |
| 159 'my_file', util.get_package_for_module(module)) |
| 160 |
| 161 def testIsMainCompiled(self): |
| 162 module = self.CreateModule('__main__') |
| 163 module.__file__ = '/bing/blam/bloom/blarm/my_file.pyc' |
| 164 self.assertPackageEquals( |
| 165 'my_file', util.get_package_for_module(module)) |
| 166 |
| 167 def testNoExtension(self): |
| 168 module = self.CreateModule('__main__') |
| 169 module.__file__ = '/bing/blam/bloom/blarm/my_file' |
| 170 self.assertPackageEquals( |
| 171 'my_file', util.get_package_for_module(module)) |
| 172 |
| 173 def testNoPackageAtAll(self): |
| 174 module = self.CreateModule('__main__') |
| 175 self.assertPackageEquals( |
| 176 '__main__', util.get_package_for_module(module)) |
| 177 |
| 178 |
| 179 class DateTimeTests(test_util.TestCase): |
| 180 |
| 181 def testDecodeDateTime(self): |
| 182 """Test that a RFC 3339 datetime string is decoded properly.""" |
| 183 for datetime_string, datetime_vals in ( |
| 184 ('2012-09-30T15:31:50.262', (2012, 9, 30, 15, 31, 50, 262000)), |
| 185 ('2012-09-30T15:31:50', (2012, 9, 30, 15, 31, 50, 0))): |
| 186 decoded = util.decode_datetime(datetime_string) |
| 187 expected = datetime.datetime(*datetime_vals) |
| 188 self.assertEquals(expected, decoded) |
| 189 |
| 190 def testDateTimeTimeZones(self): |
| 191 """Test that a datetime string with a timezone is decoded correctly.""" |
| 192 tests = ( |
| 193 ('2012-09-30T15:31:50.262-06:00', |
| 194 (2012, 9, 30, 15, 31, 50, 262000, util.TimeZoneOffset(-360))), |
| 195 ('2012-09-30T15:31:50.262+01:30', |
| 196 (2012, 9, 30, 15, 31, 50, 262000, util.TimeZoneOffset(90))), |
| 197 ('2012-09-30T15:31:50+00:05', |
| 198 (2012, 9, 30, 15, 31, 50, 0, util.TimeZoneOffset(5))), |
| 199 ('2012-09-30T15:31:50+00:00', |
| 200 (2012, 9, 30, 15, 31, 50, 0, util.TimeZoneOffset(0))), |
| 201 ('2012-09-30t15:31:50-00:00', |
| 202 (2012, 9, 30, 15, 31, 50, 0, util.TimeZoneOffset(0))), |
| 203 ('2012-09-30t15:31:50z', |
| 204 (2012, 9, 30, 15, 31, 50, 0, util.TimeZoneOffset(0))), |
| 205 ('2012-09-30T15:31:50-23:00', |
| 206 (2012, 9, 30, 15, 31, 50, 0, util.TimeZoneOffset(-1380)))) |
| 207 for datetime_string, datetime_vals in tests: |
| 208 decoded = util.decode_datetime(datetime_string) |
| 209 expected = datetime.datetime(*datetime_vals) |
| 210 self.assertEquals(expected, decoded) |
| 211 |
| 212 def testDecodeDateTimeInvalid(self): |
| 213 """Test that decoding malformed datetime strings raises execptions.""" |
| 214 for datetime_string in ('invalid', |
| 215 '2012-09-30T15:31:50.', |
| 216 '-08:00 2012-09-30T15:31:50.262', |
| 217 '2012-09-30T15:31', |
| 218 '2012-09-30T15:31Z', |
| 219 '2012-09-30T15:31:50ZZ', |
| 220 '2012-09-30T15:31:50.262 blah blah -08:00', |
| 221 '1000-99-99T25:99:99.999-99:99'): |
| 222 self.assertRaises( |
| 223 ValueError, util.decode_datetime, datetime_string) |
| 224 |
| 225 def testTimeZoneOffsetDelta(self): |
| 226 """Test that delta works with TimeZoneOffset.""" |
| 227 time_zone = util.TimeZoneOffset(datetime.timedelta(minutes=3)) |
| 228 epoch = time_zone.utcoffset(datetime.datetime.utcfromtimestamp(0)) |
| 229 self.assertEqual(180, util.total_seconds(epoch)) |
| 230 |
| 231 |
| 232 def main(): |
| 233 unittest.main() |
| 234 |
| 235 |
| 236 if __name__ == '__main__': |
| 237 main() |
OLD | NEW |