diff options
Diffstat (limited to 'mock/tests/testmagicmethods.py')
-rw-r--r-- | mock/tests/testmagicmethods.py | 200 |
1 files changed, 122 insertions, 78 deletions
diff --git a/mock/tests/testmagicmethods.py b/mock/tests/testmagicmethods.py index e1f1ee0..f6c25fb 100644 --- a/mock/tests/testmagicmethods.py +++ b/mock/tests/testmagicmethods.py @@ -1,11 +1,29 @@ +# Copyright (C) 2007-2012 Michael Foord & the mock team +# E-mail: fuzzyman AT voidspace DOT org DOT uk +# http://www.voidspace.org.uk/python/mock/ + +from __future__ import division + +try: + unicode +except NameError: + # Python 3 + unicode = str + long = int + import math -import unittest import os -from mock import AsyncMock, Mock, MagicMock -from mock.backports import iscoroutinefunction +import sys +import textwrap +import unittest + +import six + +from mock import Mock, MagicMock from mock.mock import _magics + class TestMockingMagicMethods(unittest.TestCase): def test_deleting_magic_methods(self): @@ -69,6 +87,15 @@ class TestMockingMagicMethods(unittest.TestCase): self.assertEqual(str(mock), 'foo') + @unittest.skipIf(six.PY3, "no unicode in Python 3") + def test_unicode(self): + mock = Mock() + self.assertEqual(unicode(mock), unicode(str(mock))) + + mock.__unicode__ = lambda s: unicode('foo') + self.assertEqual(unicode(mock), unicode('foo')) + + def test_dict_methods(self): mock = Mock() @@ -140,13 +167,16 @@ class TestMockingMagicMethods(unittest.TestCase): self.assertEqual(mock.value, 16) del mock.__truediv__ - def itruediv(mock): - mock /= 4 - self.assertRaises(TypeError, itruediv, mock) - mock.__itruediv__ = truediv - mock /= 8 - self.assertEqual(mock, original) - self.assertEqual(mock.value, 2) + if six.PY3: + def itruediv(mock): + mock /= 4 + self.assertRaises(TypeError, itruediv, mock) + mock.__itruediv__ = truediv + mock /= 8 + self.assertEqual(mock, original) + self.assertEqual(mock.value, 2) + else: + mock.value = 2 self.assertRaises(TypeError, lambda: 8 / mock) mock.__rtruediv__ = truediv @@ -168,7 +198,12 @@ class TestMockingMagicMethods(unittest.TestCase): m = Mock() self.assertTrue(bool(m)) - m.__bool__ = lambda s: False + nonzero = lambda s: False + if six.PY2: + m.__nonzero__ = nonzero + else: + m.__bool__ = nonzero + self.assertFalse(bool(m)) @@ -182,18 +217,25 @@ class TestMockingMagicMethods(unittest.TestCase): self. assertTrue(mock <= 3) self. assertTrue(mock >= 3) - self.assertRaises(TypeError, lambda: MagicMock() < object()) - self.assertRaises(TypeError, lambda: object() < MagicMock()) - self.assertRaises(TypeError, lambda: MagicMock() < MagicMock()) - self.assertRaises(TypeError, lambda: MagicMock() > object()) - self.assertRaises(TypeError, lambda: object() > MagicMock()) - self.assertRaises(TypeError, lambda: MagicMock() > MagicMock()) - self.assertRaises(TypeError, lambda: MagicMock() <= object()) - self.assertRaises(TypeError, lambda: object() <= MagicMock()) - self.assertRaises(TypeError, lambda: MagicMock() <= MagicMock()) - self.assertRaises(TypeError, lambda: MagicMock() >= object()) - self.assertRaises(TypeError, lambda: object() >= MagicMock()) - self.assertRaises(TypeError, lambda: MagicMock() >= MagicMock()) + if six.PY2: + # incomparable in Python 3 + self.assertEqual(Mock() < 3, object() < 3) + self.assertEqual(Mock() > 3, object() > 3) + self.assertEqual(Mock() <= 3, object() <= 3) + self.assertEqual(Mock() >= 3, object() >= 3) + else: + self.assertRaises(TypeError, lambda: MagicMock() < object()) + self.assertRaises(TypeError, lambda: object() < MagicMock()) + self.assertRaises(TypeError, lambda: MagicMock() < MagicMock()) + self.assertRaises(TypeError, lambda: MagicMock() > object()) + self.assertRaises(TypeError, lambda: object() > MagicMock()) + self.assertRaises(TypeError, lambda: MagicMock() > MagicMock()) + self.assertRaises(TypeError, lambda: MagicMock() <= object()) + self.assertRaises(TypeError, lambda: object() <= MagicMock()) + self.assertRaises(TypeError, lambda: MagicMock() <= MagicMock()) + self.assertRaises(TypeError, lambda: MagicMock() >= object()) + self.assertRaises(TypeError, lambda: object() >= MagicMock()) + self.assertRaises(TypeError, lambda: MagicMock() >= MagicMock()) def test_equality(self): @@ -251,8 +293,12 @@ class TestMockingMagicMethods(unittest.TestCase): mock.__iter__.return_value = iter([1, 2, 3]) self.assertEqual(list(mock), [1, 2, 3]) - getattr(mock, '__bool__').return_value = False - self.assertFalse(hasattr(mock, '__nonzero__')) + name = '__nonzero__' + other = '__bool__' + if six.PY3: + name, other = other, name + getattr(mock, name).return_value = False + self.assertFalse(hasattr(mock, other)) self.assertFalse(bool(mock)) for entry in _magics: @@ -270,66 +316,61 @@ class TestMockingMagicMethods(unittest.TestCase): self.assertEqual(mock == mock, True) self.assertEqual(mock != mock, False) - def test_asyncmock_defaults(self): - mock = AsyncMock() - self.assertEqual(int(mock), 1) - self.assertEqual(complex(mock), 1j) - self.assertEqual(float(mock), 1.0) - self.assertNotIn(object(), mock) - self.assertEqual(len(mock), 0) - self.assertEqual(list(mock), []) - self.assertEqual(hash(mock), object.__hash__(mock)) - self.assertEqual(str(mock), object.__str__(mock)) - self.assertTrue(bool(mock)) - self.assertEqual(round(mock), mock.__round__()) - self.assertEqual(math.trunc(mock), mock.__trunc__()) - self.assertEqual(math.floor(mock), mock.__floor__()) - self.assertEqual(math.ceil(mock), mock.__ceil__()) - self.assertTrue(iscoroutinefunction(mock.__aexit__)) - self.assertTrue(iscoroutinefunction(mock.__aenter__)) - self.assertIsInstance(mock.__aenter__, AsyncMock) - self.assertIsInstance(mock.__aexit__, AsyncMock) - - # in Python 3 oct and hex use __index__ - # so these tests are for __index__ in py3k - self.assertEqual(oct(mock), '0o1') - self.assertEqual(hex(mock), '0x1') - # how to test __sizeof__ ? def test_magicmock_defaults(self): mock = MagicMock() self.assertEqual(int(mock), 1) self.assertEqual(complex(mock), 1j) self.assertEqual(float(mock), 1.0) + self.assertEqual(long(mock), long(1)) self.assertNotIn(object(), mock) self.assertEqual(len(mock), 0) self.assertEqual(list(mock), []) self.assertEqual(hash(mock), object.__hash__(mock)) self.assertEqual(str(mock), object.__str__(mock)) + self.assertEqual(unicode(mock), object.__str__(mock)) + self.assertIsInstance(unicode(mock), unicode) self.assertTrue(bool(mock)) - self.assertEqual(round(mock), mock.__round__()) self.assertEqual(math.trunc(mock), mock.__trunc__()) - self.assertEqual(math.floor(mock), mock.__floor__()) - self.assertEqual(math.ceil(mock), mock.__ceil__()) - self.assertTrue(iscoroutinefunction(mock.__aexit__)) - self.assertTrue(iscoroutinefunction(mock.__aenter__)) - self.assertIsInstance(mock.__aenter__, AsyncMock) - self.assertIsInstance(mock.__aexit__, AsyncMock) - - # in Python 3 oct and hex use __index__ - # so these tests are for __index__ in py3k - self.assertEqual(oct(mock), '0o1') + if six.PY2: + # These fall back to __float__ in Python 2: + self.assertEqual(round(mock), 1.0) + self.assertEqual(math.floor(mock), 1.0) + self.assertEqual(math.ceil(mock), 1.0) + else: + self.assertEqual(round(mock), mock.__round__()) + self.assertEqual(math.floor(mock), mock.__floor__()) + self.assertEqual(math.ceil(mock), mock.__ceil__()) + if six.PY2: + self.assertEqual(oct(mock), '1') + else: + # in Python 3 oct and hex use __index__ + # so these tests are for __index__ in py3k + self.assertEqual(oct(mock), '0o1') self.assertEqual(hex(mock), '0x1') # how to test __sizeof__ ? - def test_magic_methods_fspath(self): + @unittest.skipIf(six.PY3, "no __cmp__ in Python 3") + def test_non_default_magic_methods(self): mock = MagicMock() - expected_path = mock.__fspath__() - mock.reset_mock() + self.assertRaises(AttributeError, lambda: mock.__cmp__) + + mock = Mock() + mock.__cmp__ = lambda s, o: 0 + + self.assertEqual(mock, object()) - self.assertEqual(os.fspath(mock), expected_path) - mock.__fspath__.assert_called_once() + + def test_magic_methods_fspath(self): + mock = MagicMock() + if sys.version_info < (3, 6): + self.assertRaises(AttributeError, lambda: mock.__fspath__) + else: + expected_path = mock.__fspath__() + mock.reset_mock() + self.assertEqual(os.fspath(mock), expected_path) + mock.__fspath__.assert_called_once() def test_magic_methods_and_spec(self): @@ -384,7 +425,7 @@ class TestMockingMagicMethods(unittest.TestCase): mock = MagicMock() def set_setattr(): mock.__setattr__ = lambda self, name: None - self.assertRaisesRegex(AttributeError, + self.assertRaisesRegexp(AttributeError, "Attempting to set unsupported magic method '__setattr__'.", set_setattr ) @@ -418,7 +459,6 @@ class TestMockingMagicMethods(unittest.TestCase): mock.reset_mock() self.assertFalse(mock.__str__.called) - def test_dir(self): # overriding the default implementation for mock in Mock(), MagicMock(): @@ -428,6 +468,7 @@ class TestMockingMagicMethods(unittest.TestCase): self.assertEqual(dir(mock), ['foo']) + @unittest.skipIf('PyPy' in sys.version, "This fails differently on pypy") def test_bound_methods(self): m = Mock() @@ -463,17 +504,20 @@ class TestMockingMagicMethods(unittest.TestCase): self.assertEqual(list(m), [4, 5, 6]) self.assertEqual(list(m), []) - + @unittest.skipIf(sys.version_info < (3, 5), "@ added in Python 3.5") def test_matmul(self): - m = MagicMock() - self.assertIsInstance(m @ 1, MagicMock) - m.__matmul__.return_value = 42 - m.__rmatmul__.return_value = 666 - m.__imatmul__.return_value = 24 - self.assertEqual(m @ 1, 42) - self.assertEqual(1 @ m, 666) - m @= 24 - self.assertEqual(m, 24) + src = textwrap.dedent("""\ + m = MagicMock() + self.assertIsInstance(m @ 1, MagicMock) + m.__matmul__.return_value = 42 + m.__rmatmul__.return_value = 666 + m.__imatmul__.return_value = 24 + self.assertEqual(m @ 1, 42) + self.assertEqual(1 @ m, 666) + m @= 24 + self.assertEqual(m, 24) + """) + exec(src) def test_divmod_and_rdivmod(self): m = MagicMock() |