17db96d56Sopenharmony_ci# Copyright (C) 2007-2012 Michael Foord & the mock team 27db96d56Sopenharmony_ci# E-mail: fuzzyman AT voidspace DOT org DOT uk 37db96d56Sopenharmony_ci# http://www.voidspace.org.uk/python/mock/ 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ciimport os 67db96d56Sopenharmony_ciimport sys 77db96d56Sopenharmony_cifrom collections import OrderedDict 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ciimport unittest 107db96d56Sopenharmony_cifrom unittest.test.testmock import support 117db96d56Sopenharmony_cifrom unittest.test.testmock.support import SomeClass, is_instance 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_cifrom test.test_importlib.util import uncache 147db96d56Sopenharmony_cifrom unittest.mock import ( 157db96d56Sopenharmony_ci NonCallableMock, CallableMixin, sentinel, 167db96d56Sopenharmony_ci MagicMock, Mock, NonCallableMagicMock, patch, _patch, 177db96d56Sopenharmony_ci DEFAULT, call, _get_target 187db96d56Sopenharmony_ci) 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_cibuiltin_string = 'builtins' 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ciPTModule = sys.modules[__name__] 247db96d56Sopenharmony_ciMODNAME = '%s.PTModule' % __name__ 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_cidef _get_proxy(obj, get_only=True): 287db96d56Sopenharmony_ci class Proxy(object): 297db96d56Sopenharmony_ci def __getattr__(self, name): 307db96d56Sopenharmony_ci return getattr(obj, name) 317db96d56Sopenharmony_ci if not get_only: 327db96d56Sopenharmony_ci def __setattr__(self, name, value): 337db96d56Sopenharmony_ci setattr(obj, name, value) 347db96d56Sopenharmony_ci def __delattr__(self, name): 357db96d56Sopenharmony_ci delattr(obj, name) 367db96d56Sopenharmony_ci Proxy.__setattr__ = __setattr__ 377db96d56Sopenharmony_ci Proxy.__delattr__ = __delattr__ 387db96d56Sopenharmony_ci return Proxy() 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ci# for use in the test 427db96d56Sopenharmony_cisomething = sentinel.Something 437db96d56Sopenharmony_cisomething_else = sentinel.SomethingElse 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ciclass Foo(object): 477db96d56Sopenharmony_ci def __init__(self, a): pass 487db96d56Sopenharmony_ci def f(self, a): pass 497db96d56Sopenharmony_ci def g(self): pass 507db96d56Sopenharmony_ci foo = 'bar' 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci @staticmethod 537db96d56Sopenharmony_ci def static_method(): pass 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_ci @classmethod 567db96d56Sopenharmony_ci def class_method(cls): pass 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci class Bar(object): 597db96d56Sopenharmony_ci def a(self): pass 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_cifoo_name = '%s.Foo' % __name__ 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_cidef function(a, b=Foo): pass 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ciclass Container(object): 687db96d56Sopenharmony_ci def __init__(self): 697db96d56Sopenharmony_ci self.values = {} 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci def __getitem__(self, name): 727db96d56Sopenharmony_ci return self.values[name] 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ci def __setitem__(self, name, value): 757db96d56Sopenharmony_ci self.values[name] = value 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_ci def __delitem__(self, name): 787db96d56Sopenharmony_ci del self.values[name] 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci def __iter__(self): 817db96d56Sopenharmony_ci return iter(self.values) 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ciclass PatchTest(unittest.TestCase): 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci def assertNotCallable(self, obj, magic=True): 887db96d56Sopenharmony_ci MockClass = NonCallableMagicMock 897db96d56Sopenharmony_ci if not magic: 907db96d56Sopenharmony_ci MockClass = NonCallableMock 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ci self.assertRaises(TypeError, obj) 937db96d56Sopenharmony_ci self.assertTrue(is_instance(obj, MockClass)) 947db96d56Sopenharmony_ci self.assertFalse(is_instance(obj, CallableMixin)) 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci def test_single_patchobject(self): 987db96d56Sopenharmony_ci class Something(object): 997db96d56Sopenharmony_ci attribute = sentinel.Original 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci @patch.object(Something, 'attribute', sentinel.Patched) 1027db96d56Sopenharmony_ci def test(): 1037db96d56Sopenharmony_ci self.assertEqual(Something.attribute, sentinel.Patched, "unpatched") 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci test() 1067db96d56Sopenharmony_ci self.assertEqual(Something.attribute, sentinel.Original, 1077db96d56Sopenharmony_ci "patch not restored") 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci def test_patchobject_with_string_as_target(self): 1107db96d56Sopenharmony_ci msg = "'Something' must be the actual object to be patched, not a str" 1117db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 1127db96d56Sopenharmony_ci patch.object('Something', 'do_something') 1137db96d56Sopenharmony_ci 1147db96d56Sopenharmony_ci def test_patchobject_with_none(self): 1157db96d56Sopenharmony_ci class Something(object): 1167db96d56Sopenharmony_ci attribute = sentinel.Original 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci @patch.object(Something, 'attribute', None) 1197db96d56Sopenharmony_ci def test(): 1207db96d56Sopenharmony_ci self.assertIsNone(Something.attribute, "unpatched") 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci test() 1237db96d56Sopenharmony_ci self.assertEqual(Something.attribute, sentinel.Original, 1247db96d56Sopenharmony_ci "patch not restored") 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci def test_multiple_patchobject(self): 1287db96d56Sopenharmony_ci class Something(object): 1297db96d56Sopenharmony_ci attribute = sentinel.Original 1307db96d56Sopenharmony_ci next_attribute = sentinel.Original2 1317db96d56Sopenharmony_ci 1327db96d56Sopenharmony_ci @patch.object(Something, 'attribute', sentinel.Patched) 1337db96d56Sopenharmony_ci @patch.object(Something, 'next_attribute', sentinel.Patched2) 1347db96d56Sopenharmony_ci def test(): 1357db96d56Sopenharmony_ci self.assertEqual(Something.attribute, sentinel.Patched, 1367db96d56Sopenharmony_ci "unpatched") 1377db96d56Sopenharmony_ci self.assertEqual(Something.next_attribute, sentinel.Patched2, 1387db96d56Sopenharmony_ci "unpatched") 1397db96d56Sopenharmony_ci 1407db96d56Sopenharmony_ci test() 1417db96d56Sopenharmony_ci self.assertEqual(Something.attribute, sentinel.Original, 1427db96d56Sopenharmony_ci "patch not restored") 1437db96d56Sopenharmony_ci self.assertEqual(Something.next_attribute, sentinel.Original2, 1447db96d56Sopenharmony_ci "patch not restored") 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci def test_object_lookup_is_quite_lazy(self): 1487db96d56Sopenharmony_ci global something 1497db96d56Sopenharmony_ci original = something 1507db96d56Sopenharmony_ci @patch('%s.something' % __name__, sentinel.Something2) 1517db96d56Sopenharmony_ci def test(): 1527db96d56Sopenharmony_ci pass 1537db96d56Sopenharmony_ci 1547db96d56Sopenharmony_ci try: 1557db96d56Sopenharmony_ci something = sentinel.replacement_value 1567db96d56Sopenharmony_ci test() 1577db96d56Sopenharmony_ci self.assertEqual(something, sentinel.replacement_value) 1587db96d56Sopenharmony_ci finally: 1597db96d56Sopenharmony_ci something = original 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci def test_patch(self): 1637db96d56Sopenharmony_ci @patch('%s.something' % __name__, sentinel.Something2) 1647db96d56Sopenharmony_ci def test(): 1657db96d56Sopenharmony_ci self.assertEqual(PTModule.something, sentinel.Something2, 1667db96d56Sopenharmony_ci "unpatched") 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ci test() 1697db96d56Sopenharmony_ci self.assertEqual(PTModule.something, sentinel.Something, 1707db96d56Sopenharmony_ci "patch not restored") 1717db96d56Sopenharmony_ci 1727db96d56Sopenharmony_ci @patch('%s.something' % __name__, sentinel.Something2) 1737db96d56Sopenharmony_ci @patch('%s.something_else' % __name__, sentinel.SomethingElse) 1747db96d56Sopenharmony_ci def test(): 1757db96d56Sopenharmony_ci self.assertEqual(PTModule.something, sentinel.Something2, 1767db96d56Sopenharmony_ci "unpatched") 1777db96d56Sopenharmony_ci self.assertEqual(PTModule.something_else, sentinel.SomethingElse, 1787db96d56Sopenharmony_ci "unpatched") 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ci self.assertEqual(PTModule.something, sentinel.Something, 1817db96d56Sopenharmony_ci "patch not restored") 1827db96d56Sopenharmony_ci self.assertEqual(PTModule.something_else, sentinel.SomethingElse, 1837db96d56Sopenharmony_ci "patch not restored") 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_ci # Test the patching and restoring works a second time 1867db96d56Sopenharmony_ci test() 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ci self.assertEqual(PTModule.something, sentinel.Something, 1897db96d56Sopenharmony_ci "patch not restored") 1907db96d56Sopenharmony_ci self.assertEqual(PTModule.something_else, sentinel.SomethingElse, 1917db96d56Sopenharmony_ci "patch not restored") 1927db96d56Sopenharmony_ci 1937db96d56Sopenharmony_ci mock = Mock() 1947db96d56Sopenharmony_ci mock.return_value = sentinel.Handle 1957db96d56Sopenharmony_ci @patch('%s.open' % builtin_string, mock) 1967db96d56Sopenharmony_ci def test(): 1977db96d56Sopenharmony_ci self.assertEqual(open('filename', 'r'), sentinel.Handle, 1987db96d56Sopenharmony_ci "open not patched") 1997db96d56Sopenharmony_ci test() 2007db96d56Sopenharmony_ci test() 2017db96d56Sopenharmony_ci 2027db96d56Sopenharmony_ci self.assertNotEqual(open, mock, "patch not restored") 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ci 2057db96d56Sopenharmony_ci def test_patch_class_attribute(self): 2067db96d56Sopenharmony_ci @patch('%s.SomeClass.class_attribute' % __name__, 2077db96d56Sopenharmony_ci sentinel.ClassAttribute) 2087db96d56Sopenharmony_ci def test(): 2097db96d56Sopenharmony_ci self.assertEqual(PTModule.SomeClass.class_attribute, 2107db96d56Sopenharmony_ci sentinel.ClassAttribute, "unpatched") 2117db96d56Sopenharmony_ci test() 2127db96d56Sopenharmony_ci 2137db96d56Sopenharmony_ci self.assertIsNone(PTModule.SomeClass.class_attribute, 2147db96d56Sopenharmony_ci "patch not restored") 2157db96d56Sopenharmony_ci 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci def test_patchobject_with_default_mock(self): 2187db96d56Sopenharmony_ci class Test(object): 2197db96d56Sopenharmony_ci something = sentinel.Original 2207db96d56Sopenharmony_ci something2 = sentinel.Original2 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci @patch.object(Test, 'something') 2237db96d56Sopenharmony_ci def test(mock): 2247db96d56Sopenharmony_ci self.assertEqual(mock, Test.something, 2257db96d56Sopenharmony_ci "Mock not passed into test function") 2267db96d56Sopenharmony_ci self.assertIsInstance(mock, MagicMock, 2277db96d56Sopenharmony_ci "patch with two arguments did not create a mock") 2287db96d56Sopenharmony_ci 2297db96d56Sopenharmony_ci test() 2307db96d56Sopenharmony_ci 2317db96d56Sopenharmony_ci @patch.object(Test, 'something') 2327db96d56Sopenharmony_ci @patch.object(Test, 'something2') 2337db96d56Sopenharmony_ci def test(this1, this2, mock1, mock2): 2347db96d56Sopenharmony_ci self.assertEqual(this1, sentinel.this1, 2357db96d56Sopenharmony_ci "Patched function didn't receive initial argument") 2367db96d56Sopenharmony_ci self.assertEqual(this2, sentinel.this2, 2377db96d56Sopenharmony_ci "Patched function didn't receive second argument") 2387db96d56Sopenharmony_ci self.assertEqual(mock1, Test.something2, 2397db96d56Sopenharmony_ci "Mock not passed into test function") 2407db96d56Sopenharmony_ci self.assertEqual(mock2, Test.something, 2417db96d56Sopenharmony_ci "Second Mock not passed into test function") 2427db96d56Sopenharmony_ci self.assertIsInstance(mock2, MagicMock, 2437db96d56Sopenharmony_ci "patch with two arguments did not create a mock") 2447db96d56Sopenharmony_ci self.assertIsInstance(mock2, MagicMock, 2457db96d56Sopenharmony_ci "patch with two arguments did not create a mock") 2467db96d56Sopenharmony_ci 2477db96d56Sopenharmony_ci # A hack to test that new mocks are passed the second time 2487db96d56Sopenharmony_ci self.assertNotEqual(outerMock1, mock1, "unexpected value for mock1") 2497db96d56Sopenharmony_ci self.assertNotEqual(outerMock2, mock2, "unexpected value for mock1") 2507db96d56Sopenharmony_ci return mock1, mock2 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_ci outerMock1 = outerMock2 = None 2537db96d56Sopenharmony_ci outerMock1, outerMock2 = test(sentinel.this1, sentinel.this2) 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_ci # Test that executing a second time creates new mocks 2567db96d56Sopenharmony_ci test(sentinel.this1, sentinel.this2) 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci 2597db96d56Sopenharmony_ci def test_patch_with_spec(self): 2607db96d56Sopenharmony_ci @patch('%s.SomeClass' % __name__, spec=SomeClass) 2617db96d56Sopenharmony_ci def test(MockSomeClass): 2627db96d56Sopenharmony_ci self.assertEqual(SomeClass, MockSomeClass) 2637db96d56Sopenharmony_ci self.assertTrue(is_instance(SomeClass.wibble, MagicMock)) 2647db96d56Sopenharmony_ci self.assertRaises(AttributeError, lambda: SomeClass.not_wibble) 2657db96d56Sopenharmony_ci 2667db96d56Sopenharmony_ci test() 2677db96d56Sopenharmony_ci 2687db96d56Sopenharmony_ci 2697db96d56Sopenharmony_ci def test_patchobject_with_spec(self): 2707db96d56Sopenharmony_ci @patch.object(SomeClass, 'class_attribute', spec=SomeClass) 2717db96d56Sopenharmony_ci def test(MockAttribute): 2727db96d56Sopenharmony_ci self.assertEqual(SomeClass.class_attribute, MockAttribute) 2737db96d56Sopenharmony_ci self.assertTrue(is_instance(SomeClass.class_attribute.wibble, 2747db96d56Sopenharmony_ci MagicMock)) 2757db96d56Sopenharmony_ci self.assertRaises(AttributeError, 2767db96d56Sopenharmony_ci lambda: SomeClass.class_attribute.not_wibble) 2777db96d56Sopenharmony_ci 2787db96d56Sopenharmony_ci test() 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci 2817db96d56Sopenharmony_ci def test_patch_with_spec_as_list(self): 2827db96d56Sopenharmony_ci @patch('%s.SomeClass' % __name__, spec=['wibble']) 2837db96d56Sopenharmony_ci def test(MockSomeClass): 2847db96d56Sopenharmony_ci self.assertEqual(SomeClass, MockSomeClass) 2857db96d56Sopenharmony_ci self.assertTrue(is_instance(SomeClass.wibble, MagicMock)) 2867db96d56Sopenharmony_ci self.assertRaises(AttributeError, lambda: SomeClass.not_wibble) 2877db96d56Sopenharmony_ci 2887db96d56Sopenharmony_ci test() 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci 2917db96d56Sopenharmony_ci def test_patchobject_with_spec_as_list(self): 2927db96d56Sopenharmony_ci @patch.object(SomeClass, 'class_attribute', spec=['wibble']) 2937db96d56Sopenharmony_ci def test(MockAttribute): 2947db96d56Sopenharmony_ci self.assertEqual(SomeClass.class_attribute, MockAttribute) 2957db96d56Sopenharmony_ci self.assertTrue(is_instance(SomeClass.class_attribute.wibble, 2967db96d56Sopenharmony_ci MagicMock)) 2977db96d56Sopenharmony_ci self.assertRaises(AttributeError, 2987db96d56Sopenharmony_ci lambda: SomeClass.class_attribute.not_wibble) 2997db96d56Sopenharmony_ci 3007db96d56Sopenharmony_ci test() 3017db96d56Sopenharmony_ci 3027db96d56Sopenharmony_ci 3037db96d56Sopenharmony_ci def test_nested_patch_with_spec_as_list(self): 3047db96d56Sopenharmony_ci # regression test for nested decorators 3057db96d56Sopenharmony_ci @patch('%s.open' % builtin_string) 3067db96d56Sopenharmony_ci @patch('%s.SomeClass' % __name__, spec=['wibble']) 3077db96d56Sopenharmony_ci def test(MockSomeClass, MockOpen): 3087db96d56Sopenharmony_ci self.assertEqual(SomeClass, MockSomeClass) 3097db96d56Sopenharmony_ci self.assertTrue(is_instance(SomeClass.wibble, MagicMock)) 3107db96d56Sopenharmony_ci self.assertRaises(AttributeError, lambda: SomeClass.not_wibble) 3117db96d56Sopenharmony_ci test() 3127db96d56Sopenharmony_ci 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci def test_patch_with_spec_as_boolean(self): 3157db96d56Sopenharmony_ci @patch('%s.SomeClass' % __name__, spec=True) 3167db96d56Sopenharmony_ci def test(MockSomeClass): 3177db96d56Sopenharmony_ci self.assertEqual(SomeClass, MockSomeClass) 3187db96d56Sopenharmony_ci # Should not raise attribute error 3197db96d56Sopenharmony_ci MockSomeClass.wibble 3207db96d56Sopenharmony_ci 3217db96d56Sopenharmony_ci self.assertRaises(AttributeError, lambda: MockSomeClass.not_wibble) 3227db96d56Sopenharmony_ci 3237db96d56Sopenharmony_ci test() 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ci def test_patch_object_with_spec_as_boolean(self): 3277db96d56Sopenharmony_ci @patch.object(PTModule, 'SomeClass', spec=True) 3287db96d56Sopenharmony_ci def test(MockSomeClass): 3297db96d56Sopenharmony_ci self.assertEqual(SomeClass, MockSomeClass) 3307db96d56Sopenharmony_ci # Should not raise attribute error 3317db96d56Sopenharmony_ci MockSomeClass.wibble 3327db96d56Sopenharmony_ci 3337db96d56Sopenharmony_ci self.assertRaises(AttributeError, lambda: MockSomeClass.not_wibble) 3347db96d56Sopenharmony_ci 3357db96d56Sopenharmony_ci test() 3367db96d56Sopenharmony_ci 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci def test_patch_class_acts_with_spec_is_inherited(self): 3397db96d56Sopenharmony_ci @patch('%s.SomeClass' % __name__, spec=True) 3407db96d56Sopenharmony_ci def test(MockSomeClass): 3417db96d56Sopenharmony_ci self.assertTrue(is_instance(MockSomeClass, MagicMock)) 3427db96d56Sopenharmony_ci instance = MockSomeClass() 3437db96d56Sopenharmony_ci self.assertNotCallable(instance) 3447db96d56Sopenharmony_ci # Should not raise attribute error 3457db96d56Sopenharmony_ci instance.wibble 3467db96d56Sopenharmony_ci 3477db96d56Sopenharmony_ci self.assertRaises(AttributeError, lambda: instance.not_wibble) 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci test() 3507db96d56Sopenharmony_ci 3517db96d56Sopenharmony_ci 3527db96d56Sopenharmony_ci def test_patch_with_create_mocks_non_existent_attributes(self): 3537db96d56Sopenharmony_ci @patch('%s.frooble' % builtin_string, sentinel.Frooble, create=True) 3547db96d56Sopenharmony_ci def test(): 3557db96d56Sopenharmony_ci self.assertEqual(frooble, sentinel.Frooble) 3567db96d56Sopenharmony_ci 3577db96d56Sopenharmony_ci test() 3587db96d56Sopenharmony_ci self.assertRaises(NameError, lambda: frooble) 3597db96d56Sopenharmony_ci 3607db96d56Sopenharmony_ci 3617db96d56Sopenharmony_ci def test_patchobject_with_create_mocks_non_existent_attributes(self): 3627db96d56Sopenharmony_ci @patch.object(SomeClass, 'frooble', sentinel.Frooble, create=True) 3637db96d56Sopenharmony_ci def test(): 3647db96d56Sopenharmony_ci self.assertEqual(SomeClass.frooble, sentinel.Frooble) 3657db96d56Sopenharmony_ci 3667db96d56Sopenharmony_ci test() 3677db96d56Sopenharmony_ci self.assertFalse(hasattr(SomeClass, 'frooble')) 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ci def test_patch_wont_create_by_default(self): 3717db96d56Sopenharmony_ci with self.assertRaises(AttributeError): 3727db96d56Sopenharmony_ci @patch('%s.frooble' % builtin_string, sentinel.Frooble) 3737db96d56Sopenharmony_ci def test(): pass 3747db96d56Sopenharmony_ci 3757db96d56Sopenharmony_ci test() 3767db96d56Sopenharmony_ci self.assertRaises(NameError, lambda: frooble) 3777db96d56Sopenharmony_ci 3787db96d56Sopenharmony_ci 3797db96d56Sopenharmony_ci def test_patchobject_wont_create_by_default(self): 3807db96d56Sopenharmony_ci with self.assertRaises(AttributeError): 3817db96d56Sopenharmony_ci @patch.object(SomeClass, 'ord', sentinel.Frooble) 3827db96d56Sopenharmony_ci def test(): pass 3837db96d56Sopenharmony_ci test() 3847db96d56Sopenharmony_ci self.assertFalse(hasattr(SomeClass, 'ord')) 3857db96d56Sopenharmony_ci 3867db96d56Sopenharmony_ci 3877db96d56Sopenharmony_ci def test_patch_builtins_without_create(self): 3887db96d56Sopenharmony_ci @patch(__name__+'.ord') 3897db96d56Sopenharmony_ci def test_ord(mock_ord): 3907db96d56Sopenharmony_ci mock_ord.return_value = 101 3917db96d56Sopenharmony_ci return ord('c') 3927db96d56Sopenharmony_ci 3937db96d56Sopenharmony_ci @patch(__name__+'.open') 3947db96d56Sopenharmony_ci def test_open(mock_open): 3957db96d56Sopenharmony_ci m = mock_open.return_value 3967db96d56Sopenharmony_ci m.read.return_value = 'abcd' 3977db96d56Sopenharmony_ci 3987db96d56Sopenharmony_ci fobj = open('doesnotexists.txt') 3997db96d56Sopenharmony_ci data = fobj.read() 4007db96d56Sopenharmony_ci fobj.close() 4017db96d56Sopenharmony_ci return data 4027db96d56Sopenharmony_ci 4037db96d56Sopenharmony_ci self.assertEqual(test_ord(), 101) 4047db96d56Sopenharmony_ci self.assertEqual(test_open(), 'abcd') 4057db96d56Sopenharmony_ci 4067db96d56Sopenharmony_ci 4077db96d56Sopenharmony_ci def test_patch_with_static_methods(self): 4087db96d56Sopenharmony_ci class Foo(object): 4097db96d56Sopenharmony_ci @staticmethod 4107db96d56Sopenharmony_ci def woot(): 4117db96d56Sopenharmony_ci return sentinel.Static 4127db96d56Sopenharmony_ci 4137db96d56Sopenharmony_ci @patch.object(Foo, 'woot', staticmethod(lambda: sentinel.Patched)) 4147db96d56Sopenharmony_ci def anonymous(): 4157db96d56Sopenharmony_ci self.assertEqual(Foo.woot(), sentinel.Patched) 4167db96d56Sopenharmony_ci anonymous() 4177db96d56Sopenharmony_ci 4187db96d56Sopenharmony_ci self.assertEqual(Foo.woot(), sentinel.Static) 4197db96d56Sopenharmony_ci 4207db96d56Sopenharmony_ci 4217db96d56Sopenharmony_ci def test_patch_local(self): 4227db96d56Sopenharmony_ci foo = sentinel.Foo 4237db96d56Sopenharmony_ci @patch.object(sentinel, 'Foo', 'Foo') 4247db96d56Sopenharmony_ci def anonymous(): 4257db96d56Sopenharmony_ci self.assertEqual(sentinel.Foo, 'Foo') 4267db96d56Sopenharmony_ci anonymous() 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_ci self.assertEqual(sentinel.Foo, foo) 4297db96d56Sopenharmony_ci 4307db96d56Sopenharmony_ci 4317db96d56Sopenharmony_ci def test_patch_slots(self): 4327db96d56Sopenharmony_ci class Foo(object): 4337db96d56Sopenharmony_ci __slots__ = ('Foo',) 4347db96d56Sopenharmony_ci 4357db96d56Sopenharmony_ci foo = Foo() 4367db96d56Sopenharmony_ci foo.Foo = sentinel.Foo 4377db96d56Sopenharmony_ci 4387db96d56Sopenharmony_ci @patch.object(foo, 'Foo', 'Foo') 4397db96d56Sopenharmony_ci def anonymous(): 4407db96d56Sopenharmony_ci self.assertEqual(foo.Foo, 'Foo') 4417db96d56Sopenharmony_ci anonymous() 4427db96d56Sopenharmony_ci 4437db96d56Sopenharmony_ci self.assertEqual(foo.Foo, sentinel.Foo) 4447db96d56Sopenharmony_ci 4457db96d56Sopenharmony_ci 4467db96d56Sopenharmony_ci def test_patchobject_class_decorator(self): 4477db96d56Sopenharmony_ci class Something(object): 4487db96d56Sopenharmony_ci attribute = sentinel.Original 4497db96d56Sopenharmony_ci 4507db96d56Sopenharmony_ci class Foo(object): 4517db96d56Sopenharmony_ci def test_method(other_self): 4527db96d56Sopenharmony_ci self.assertEqual(Something.attribute, sentinel.Patched, 4537db96d56Sopenharmony_ci "unpatched") 4547db96d56Sopenharmony_ci def not_test_method(other_self): 4557db96d56Sopenharmony_ci self.assertEqual(Something.attribute, sentinel.Original, 4567db96d56Sopenharmony_ci "non-test method patched") 4577db96d56Sopenharmony_ci 4587db96d56Sopenharmony_ci Foo = patch.object(Something, 'attribute', sentinel.Patched)(Foo) 4597db96d56Sopenharmony_ci 4607db96d56Sopenharmony_ci f = Foo() 4617db96d56Sopenharmony_ci f.test_method() 4627db96d56Sopenharmony_ci f.not_test_method() 4637db96d56Sopenharmony_ci 4647db96d56Sopenharmony_ci self.assertEqual(Something.attribute, sentinel.Original, 4657db96d56Sopenharmony_ci "patch not restored") 4667db96d56Sopenharmony_ci 4677db96d56Sopenharmony_ci 4687db96d56Sopenharmony_ci def test_patch_class_decorator(self): 4697db96d56Sopenharmony_ci class Something(object): 4707db96d56Sopenharmony_ci attribute = sentinel.Original 4717db96d56Sopenharmony_ci 4727db96d56Sopenharmony_ci class Foo(object): 4737db96d56Sopenharmony_ci 4747db96d56Sopenharmony_ci test_class_attr = 'whatever' 4757db96d56Sopenharmony_ci 4767db96d56Sopenharmony_ci def test_method(other_self, mock_something): 4777db96d56Sopenharmony_ci self.assertEqual(PTModule.something, mock_something, 4787db96d56Sopenharmony_ci "unpatched") 4797db96d56Sopenharmony_ci def not_test_method(other_self): 4807db96d56Sopenharmony_ci self.assertEqual(PTModule.something, sentinel.Something, 4817db96d56Sopenharmony_ci "non-test method patched") 4827db96d56Sopenharmony_ci Foo = patch('%s.something' % __name__)(Foo) 4837db96d56Sopenharmony_ci 4847db96d56Sopenharmony_ci f = Foo() 4857db96d56Sopenharmony_ci f.test_method() 4867db96d56Sopenharmony_ci f.not_test_method() 4877db96d56Sopenharmony_ci 4887db96d56Sopenharmony_ci self.assertEqual(Something.attribute, sentinel.Original, 4897db96d56Sopenharmony_ci "patch not restored") 4907db96d56Sopenharmony_ci self.assertEqual(PTModule.something, sentinel.Something, 4917db96d56Sopenharmony_ci "patch not restored") 4927db96d56Sopenharmony_ci 4937db96d56Sopenharmony_ci 4947db96d56Sopenharmony_ci def test_patchobject_twice(self): 4957db96d56Sopenharmony_ci class Something(object): 4967db96d56Sopenharmony_ci attribute = sentinel.Original 4977db96d56Sopenharmony_ci next_attribute = sentinel.Original2 4987db96d56Sopenharmony_ci 4997db96d56Sopenharmony_ci @patch.object(Something, 'attribute', sentinel.Patched) 5007db96d56Sopenharmony_ci @patch.object(Something, 'attribute', sentinel.Patched) 5017db96d56Sopenharmony_ci def test(): 5027db96d56Sopenharmony_ci self.assertEqual(Something.attribute, sentinel.Patched, "unpatched") 5037db96d56Sopenharmony_ci 5047db96d56Sopenharmony_ci test() 5057db96d56Sopenharmony_ci 5067db96d56Sopenharmony_ci self.assertEqual(Something.attribute, sentinel.Original, 5077db96d56Sopenharmony_ci "patch not restored") 5087db96d56Sopenharmony_ci 5097db96d56Sopenharmony_ci 5107db96d56Sopenharmony_ci def test_patch_dict(self): 5117db96d56Sopenharmony_ci foo = {'initial': object(), 'other': 'something'} 5127db96d56Sopenharmony_ci original = foo.copy() 5137db96d56Sopenharmony_ci 5147db96d56Sopenharmony_ci @patch.dict(foo) 5157db96d56Sopenharmony_ci def test(): 5167db96d56Sopenharmony_ci foo['a'] = 3 5177db96d56Sopenharmony_ci del foo['initial'] 5187db96d56Sopenharmony_ci foo['other'] = 'something else' 5197db96d56Sopenharmony_ci 5207db96d56Sopenharmony_ci test() 5217db96d56Sopenharmony_ci 5227db96d56Sopenharmony_ci self.assertEqual(foo, original) 5237db96d56Sopenharmony_ci 5247db96d56Sopenharmony_ci @patch.dict(foo, {'a': 'b'}) 5257db96d56Sopenharmony_ci def test(): 5267db96d56Sopenharmony_ci self.assertEqual(len(foo), 3) 5277db96d56Sopenharmony_ci self.assertEqual(foo['a'], 'b') 5287db96d56Sopenharmony_ci 5297db96d56Sopenharmony_ci test() 5307db96d56Sopenharmony_ci 5317db96d56Sopenharmony_ci self.assertEqual(foo, original) 5327db96d56Sopenharmony_ci 5337db96d56Sopenharmony_ci @patch.dict(foo, [('a', 'b')]) 5347db96d56Sopenharmony_ci def test(): 5357db96d56Sopenharmony_ci self.assertEqual(len(foo), 3) 5367db96d56Sopenharmony_ci self.assertEqual(foo['a'], 'b') 5377db96d56Sopenharmony_ci 5387db96d56Sopenharmony_ci test() 5397db96d56Sopenharmony_ci 5407db96d56Sopenharmony_ci self.assertEqual(foo, original) 5417db96d56Sopenharmony_ci 5427db96d56Sopenharmony_ci 5437db96d56Sopenharmony_ci def test_patch_dict_with_container_object(self): 5447db96d56Sopenharmony_ci foo = Container() 5457db96d56Sopenharmony_ci foo['initial'] = object() 5467db96d56Sopenharmony_ci foo['other'] = 'something' 5477db96d56Sopenharmony_ci 5487db96d56Sopenharmony_ci original = foo.values.copy() 5497db96d56Sopenharmony_ci 5507db96d56Sopenharmony_ci @patch.dict(foo) 5517db96d56Sopenharmony_ci def test(): 5527db96d56Sopenharmony_ci foo['a'] = 3 5537db96d56Sopenharmony_ci del foo['initial'] 5547db96d56Sopenharmony_ci foo['other'] = 'something else' 5557db96d56Sopenharmony_ci 5567db96d56Sopenharmony_ci test() 5577db96d56Sopenharmony_ci 5587db96d56Sopenharmony_ci self.assertEqual(foo.values, original) 5597db96d56Sopenharmony_ci 5607db96d56Sopenharmony_ci @patch.dict(foo, {'a': 'b'}) 5617db96d56Sopenharmony_ci def test(): 5627db96d56Sopenharmony_ci self.assertEqual(len(foo.values), 3) 5637db96d56Sopenharmony_ci self.assertEqual(foo['a'], 'b') 5647db96d56Sopenharmony_ci 5657db96d56Sopenharmony_ci test() 5667db96d56Sopenharmony_ci 5677db96d56Sopenharmony_ci self.assertEqual(foo.values, original) 5687db96d56Sopenharmony_ci 5697db96d56Sopenharmony_ci 5707db96d56Sopenharmony_ci def test_patch_dict_with_clear(self): 5717db96d56Sopenharmony_ci foo = {'initial': object(), 'other': 'something'} 5727db96d56Sopenharmony_ci original = foo.copy() 5737db96d56Sopenharmony_ci 5747db96d56Sopenharmony_ci @patch.dict(foo, clear=True) 5757db96d56Sopenharmony_ci def test(): 5767db96d56Sopenharmony_ci self.assertEqual(foo, {}) 5777db96d56Sopenharmony_ci foo['a'] = 3 5787db96d56Sopenharmony_ci foo['other'] = 'something else' 5797db96d56Sopenharmony_ci 5807db96d56Sopenharmony_ci test() 5817db96d56Sopenharmony_ci 5827db96d56Sopenharmony_ci self.assertEqual(foo, original) 5837db96d56Sopenharmony_ci 5847db96d56Sopenharmony_ci @patch.dict(foo, {'a': 'b'}, clear=True) 5857db96d56Sopenharmony_ci def test(): 5867db96d56Sopenharmony_ci self.assertEqual(foo, {'a': 'b'}) 5877db96d56Sopenharmony_ci 5887db96d56Sopenharmony_ci test() 5897db96d56Sopenharmony_ci 5907db96d56Sopenharmony_ci self.assertEqual(foo, original) 5917db96d56Sopenharmony_ci 5927db96d56Sopenharmony_ci @patch.dict(foo, [('a', 'b')], clear=True) 5937db96d56Sopenharmony_ci def test(): 5947db96d56Sopenharmony_ci self.assertEqual(foo, {'a': 'b'}) 5957db96d56Sopenharmony_ci 5967db96d56Sopenharmony_ci test() 5977db96d56Sopenharmony_ci 5987db96d56Sopenharmony_ci self.assertEqual(foo, original) 5997db96d56Sopenharmony_ci 6007db96d56Sopenharmony_ci 6017db96d56Sopenharmony_ci def test_patch_dict_with_container_object_and_clear(self): 6027db96d56Sopenharmony_ci foo = Container() 6037db96d56Sopenharmony_ci foo['initial'] = object() 6047db96d56Sopenharmony_ci foo['other'] = 'something' 6057db96d56Sopenharmony_ci 6067db96d56Sopenharmony_ci original = foo.values.copy() 6077db96d56Sopenharmony_ci 6087db96d56Sopenharmony_ci @patch.dict(foo, clear=True) 6097db96d56Sopenharmony_ci def test(): 6107db96d56Sopenharmony_ci self.assertEqual(foo.values, {}) 6117db96d56Sopenharmony_ci foo['a'] = 3 6127db96d56Sopenharmony_ci foo['other'] = 'something else' 6137db96d56Sopenharmony_ci 6147db96d56Sopenharmony_ci test() 6157db96d56Sopenharmony_ci 6167db96d56Sopenharmony_ci self.assertEqual(foo.values, original) 6177db96d56Sopenharmony_ci 6187db96d56Sopenharmony_ci @patch.dict(foo, {'a': 'b'}, clear=True) 6197db96d56Sopenharmony_ci def test(): 6207db96d56Sopenharmony_ci self.assertEqual(foo.values, {'a': 'b'}) 6217db96d56Sopenharmony_ci 6227db96d56Sopenharmony_ci test() 6237db96d56Sopenharmony_ci 6247db96d56Sopenharmony_ci self.assertEqual(foo.values, original) 6257db96d56Sopenharmony_ci 6267db96d56Sopenharmony_ci 6277db96d56Sopenharmony_ci def test_patch_dict_as_context_manager(self): 6287db96d56Sopenharmony_ci foo = {'a': 'b'} 6297db96d56Sopenharmony_ci with patch.dict(foo, a='c') as patched: 6307db96d56Sopenharmony_ci self.assertEqual(patched, {'a': 'c'}) 6317db96d56Sopenharmony_ci self.assertEqual(foo, {'a': 'b'}) 6327db96d56Sopenharmony_ci 6337db96d56Sopenharmony_ci 6347db96d56Sopenharmony_ci def test_name_preserved(self): 6357db96d56Sopenharmony_ci foo = {} 6367db96d56Sopenharmony_ci 6377db96d56Sopenharmony_ci @patch('%s.SomeClass' % __name__, object()) 6387db96d56Sopenharmony_ci @patch('%s.SomeClass' % __name__, object(), autospec=True) 6397db96d56Sopenharmony_ci @patch.object(SomeClass, object()) 6407db96d56Sopenharmony_ci @patch.dict(foo) 6417db96d56Sopenharmony_ci def some_name(): pass 6427db96d56Sopenharmony_ci 6437db96d56Sopenharmony_ci self.assertEqual(some_name.__name__, 'some_name') 6447db96d56Sopenharmony_ci 6457db96d56Sopenharmony_ci 6467db96d56Sopenharmony_ci def test_patch_with_exception(self): 6477db96d56Sopenharmony_ci foo = {} 6487db96d56Sopenharmony_ci 6497db96d56Sopenharmony_ci @patch.dict(foo, {'a': 'b'}) 6507db96d56Sopenharmony_ci def test(): 6517db96d56Sopenharmony_ci raise NameError('Konrad') 6527db96d56Sopenharmony_ci 6537db96d56Sopenharmony_ci with self.assertRaises(NameError): 6547db96d56Sopenharmony_ci test() 6557db96d56Sopenharmony_ci 6567db96d56Sopenharmony_ci self.assertEqual(foo, {}) 6577db96d56Sopenharmony_ci 6587db96d56Sopenharmony_ci 6597db96d56Sopenharmony_ci def test_patch_dict_with_string(self): 6607db96d56Sopenharmony_ci @patch.dict('os.environ', {'konrad_delong': 'some value'}) 6617db96d56Sopenharmony_ci def test(): 6627db96d56Sopenharmony_ci self.assertIn('konrad_delong', os.environ) 6637db96d56Sopenharmony_ci 6647db96d56Sopenharmony_ci test() 6657db96d56Sopenharmony_ci 6667db96d56Sopenharmony_ci 6677db96d56Sopenharmony_ci def test_patch_dict_decorator_resolution(self): 6687db96d56Sopenharmony_ci # bpo-35512: Ensure that patch with a string target resolves to 6697db96d56Sopenharmony_ci # the new dictionary during function call 6707db96d56Sopenharmony_ci original = support.target.copy() 6717db96d56Sopenharmony_ci 6727db96d56Sopenharmony_ci @patch.dict('unittest.test.testmock.support.target', {'bar': 'BAR'}) 6737db96d56Sopenharmony_ci def test(): 6747db96d56Sopenharmony_ci self.assertEqual(support.target, {'foo': 'BAZ', 'bar': 'BAR'}) 6757db96d56Sopenharmony_ci 6767db96d56Sopenharmony_ci try: 6777db96d56Sopenharmony_ci support.target = {'foo': 'BAZ'} 6787db96d56Sopenharmony_ci test() 6797db96d56Sopenharmony_ci self.assertEqual(support.target, {'foo': 'BAZ'}) 6807db96d56Sopenharmony_ci finally: 6817db96d56Sopenharmony_ci support.target = original 6827db96d56Sopenharmony_ci 6837db96d56Sopenharmony_ci 6847db96d56Sopenharmony_ci def test_patch_spec_set(self): 6857db96d56Sopenharmony_ci @patch('%s.SomeClass' % __name__, spec=SomeClass, spec_set=True) 6867db96d56Sopenharmony_ci def test(MockClass): 6877db96d56Sopenharmony_ci MockClass.z = 'foo' 6887db96d56Sopenharmony_ci 6897db96d56Sopenharmony_ci self.assertRaises(AttributeError, test) 6907db96d56Sopenharmony_ci 6917db96d56Sopenharmony_ci @patch.object(support, 'SomeClass', spec=SomeClass, spec_set=True) 6927db96d56Sopenharmony_ci def test(MockClass): 6937db96d56Sopenharmony_ci MockClass.z = 'foo' 6947db96d56Sopenharmony_ci 6957db96d56Sopenharmony_ci self.assertRaises(AttributeError, test) 6967db96d56Sopenharmony_ci @patch('%s.SomeClass' % __name__, spec_set=True) 6977db96d56Sopenharmony_ci def test(MockClass): 6987db96d56Sopenharmony_ci MockClass.z = 'foo' 6997db96d56Sopenharmony_ci 7007db96d56Sopenharmony_ci self.assertRaises(AttributeError, test) 7017db96d56Sopenharmony_ci 7027db96d56Sopenharmony_ci @patch.object(support, 'SomeClass', spec_set=True) 7037db96d56Sopenharmony_ci def test(MockClass): 7047db96d56Sopenharmony_ci MockClass.z = 'foo' 7057db96d56Sopenharmony_ci 7067db96d56Sopenharmony_ci self.assertRaises(AttributeError, test) 7077db96d56Sopenharmony_ci 7087db96d56Sopenharmony_ci 7097db96d56Sopenharmony_ci def test_spec_set_inherit(self): 7107db96d56Sopenharmony_ci @patch('%s.SomeClass' % __name__, spec_set=True) 7117db96d56Sopenharmony_ci def test(MockClass): 7127db96d56Sopenharmony_ci instance = MockClass() 7137db96d56Sopenharmony_ci instance.z = 'foo' 7147db96d56Sopenharmony_ci 7157db96d56Sopenharmony_ci self.assertRaises(AttributeError, test) 7167db96d56Sopenharmony_ci 7177db96d56Sopenharmony_ci 7187db96d56Sopenharmony_ci def test_patch_start_stop(self): 7197db96d56Sopenharmony_ci original = something 7207db96d56Sopenharmony_ci patcher = patch('%s.something' % __name__) 7217db96d56Sopenharmony_ci self.assertIs(something, original) 7227db96d56Sopenharmony_ci mock = patcher.start() 7237db96d56Sopenharmony_ci try: 7247db96d56Sopenharmony_ci self.assertIsNot(mock, original) 7257db96d56Sopenharmony_ci self.assertIs(something, mock) 7267db96d56Sopenharmony_ci finally: 7277db96d56Sopenharmony_ci patcher.stop() 7287db96d56Sopenharmony_ci self.assertIs(something, original) 7297db96d56Sopenharmony_ci 7307db96d56Sopenharmony_ci 7317db96d56Sopenharmony_ci def test_stop_without_start(self): 7327db96d56Sopenharmony_ci # bpo-36366: calling stop without start will return None. 7337db96d56Sopenharmony_ci patcher = patch(foo_name, 'bar', 3) 7347db96d56Sopenharmony_ci self.assertIsNone(patcher.stop()) 7357db96d56Sopenharmony_ci 7367db96d56Sopenharmony_ci 7377db96d56Sopenharmony_ci def test_stop_idempotent(self): 7387db96d56Sopenharmony_ci # bpo-36366: calling stop on an already stopped patch will return None. 7397db96d56Sopenharmony_ci patcher = patch(foo_name, 'bar', 3) 7407db96d56Sopenharmony_ci 7417db96d56Sopenharmony_ci patcher.start() 7427db96d56Sopenharmony_ci patcher.stop() 7437db96d56Sopenharmony_ci self.assertIsNone(patcher.stop()) 7447db96d56Sopenharmony_ci 7457db96d56Sopenharmony_ci 7467db96d56Sopenharmony_ci def test_patchobject_start_stop(self): 7477db96d56Sopenharmony_ci original = something 7487db96d56Sopenharmony_ci patcher = patch.object(PTModule, 'something', 'foo') 7497db96d56Sopenharmony_ci self.assertIs(something, original) 7507db96d56Sopenharmony_ci replaced = patcher.start() 7517db96d56Sopenharmony_ci try: 7527db96d56Sopenharmony_ci self.assertEqual(replaced, 'foo') 7537db96d56Sopenharmony_ci self.assertIs(something, replaced) 7547db96d56Sopenharmony_ci finally: 7557db96d56Sopenharmony_ci patcher.stop() 7567db96d56Sopenharmony_ci self.assertIs(something, original) 7577db96d56Sopenharmony_ci 7587db96d56Sopenharmony_ci 7597db96d56Sopenharmony_ci def test_patch_dict_start_stop(self): 7607db96d56Sopenharmony_ci d = {'foo': 'bar'} 7617db96d56Sopenharmony_ci original = d.copy() 7627db96d56Sopenharmony_ci patcher = patch.dict(d, [('spam', 'eggs')], clear=True) 7637db96d56Sopenharmony_ci self.assertEqual(d, original) 7647db96d56Sopenharmony_ci 7657db96d56Sopenharmony_ci patcher.start() 7667db96d56Sopenharmony_ci try: 7677db96d56Sopenharmony_ci self.assertEqual(d, {'spam': 'eggs'}) 7687db96d56Sopenharmony_ci finally: 7697db96d56Sopenharmony_ci patcher.stop() 7707db96d56Sopenharmony_ci self.assertEqual(d, original) 7717db96d56Sopenharmony_ci 7727db96d56Sopenharmony_ci 7737db96d56Sopenharmony_ci def test_patch_dict_stop_without_start(self): 7747db96d56Sopenharmony_ci d = {'foo': 'bar'} 7757db96d56Sopenharmony_ci original = d.copy() 7767db96d56Sopenharmony_ci patcher = patch.dict(d, [('spam', 'eggs')], clear=True) 7777db96d56Sopenharmony_ci self.assertFalse(patcher.stop()) 7787db96d56Sopenharmony_ci self.assertEqual(d, original) 7797db96d56Sopenharmony_ci 7807db96d56Sopenharmony_ci 7817db96d56Sopenharmony_ci def test_patch_dict_class_decorator(self): 7827db96d56Sopenharmony_ci this = self 7837db96d56Sopenharmony_ci d = {'spam': 'eggs'} 7847db96d56Sopenharmony_ci original = d.copy() 7857db96d56Sopenharmony_ci 7867db96d56Sopenharmony_ci class Test(object): 7877db96d56Sopenharmony_ci def test_first(self): 7887db96d56Sopenharmony_ci this.assertEqual(d, {'foo': 'bar'}) 7897db96d56Sopenharmony_ci def test_second(self): 7907db96d56Sopenharmony_ci this.assertEqual(d, {'foo': 'bar'}) 7917db96d56Sopenharmony_ci 7927db96d56Sopenharmony_ci Test = patch.dict(d, {'foo': 'bar'}, clear=True)(Test) 7937db96d56Sopenharmony_ci self.assertEqual(d, original) 7947db96d56Sopenharmony_ci 7957db96d56Sopenharmony_ci test = Test() 7967db96d56Sopenharmony_ci 7977db96d56Sopenharmony_ci test.test_first() 7987db96d56Sopenharmony_ci self.assertEqual(d, original) 7997db96d56Sopenharmony_ci 8007db96d56Sopenharmony_ci test.test_second() 8017db96d56Sopenharmony_ci self.assertEqual(d, original) 8027db96d56Sopenharmony_ci 8037db96d56Sopenharmony_ci test = Test() 8047db96d56Sopenharmony_ci 8057db96d56Sopenharmony_ci test.test_first() 8067db96d56Sopenharmony_ci self.assertEqual(d, original) 8077db96d56Sopenharmony_ci 8087db96d56Sopenharmony_ci test.test_second() 8097db96d56Sopenharmony_ci self.assertEqual(d, original) 8107db96d56Sopenharmony_ci 8117db96d56Sopenharmony_ci 8127db96d56Sopenharmony_ci def test_get_only_proxy(self): 8137db96d56Sopenharmony_ci class Something(object): 8147db96d56Sopenharmony_ci foo = 'foo' 8157db96d56Sopenharmony_ci class SomethingElse: 8167db96d56Sopenharmony_ci foo = 'foo' 8177db96d56Sopenharmony_ci 8187db96d56Sopenharmony_ci for thing in Something, SomethingElse, Something(), SomethingElse: 8197db96d56Sopenharmony_ci proxy = _get_proxy(thing) 8207db96d56Sopenharmony_ci 8217db96d56Sopenharmony_ci @patch.object(proxy, 'foo', 'bar') 8227db96d56Sopenharmony_ci def test(): 8237db96d56Sopenharmony_ci self.assertEqual(proxy.foo, 'bar') 8247db96d56Sopenharmony_ci test() 8257db96d56Sopenharmony_ci self.assertEqual(proxy.foo, 'foo') 8267db96d56Sopenharmony_ci self.assertEqual(thing.foo, 'foo') 8277db96d56Sopenharmony_ci self.assertNotIn('foo', proxy.__dict__) 8287db96d56Sopenharmony_ci 8297db96d56Sopenharmony_ci 8307db96d56Sopenharmony_ci def test_get_set_delete_proxy(self): 8317db96d56Sopenharmony_ci class Something(object): 8327db96d56Sopenharmony_ci foo = 'foo' 8337db96d56Sopenharmony_ci class SomethingElse: 8347db96d56Sopenharmony_ci foo = 'foo' 8357db96d56Sopenharmony_ci 8367db96d56Sopenharmony_ci for thing in Something, SomethingElse, Something(), SomethingElse: 8377db96d56Sopenharmony_ci proxy = _get_proxy(Something, get_only=False) 8387db96d56Sopenharmony_ci 8397db96d56Sopenharmony_ci @patch.object(proxy, 'foo', 'bar') 8407db96d56Sopenharmony_ci def test(): 8417db96d56Sopenharmony_ci self.assertEqual(proxy.foo, 'bar') 8427db96d56Sopenharmony_ci test() 8437db96d56Sopenharmony_ci self.assertEqual(proxy.foo, 'foo') 8447db96d56Sopenharmony_ci self.assertEqual(thing.foo, 'foo') 8457db96d56Sopenharmony_ci self.assertNotIn('foo', proxy.__dict__) 8467db96d56Sopenharmony_ci 8477db96d56Sopenharmony_ci 8487db96d56Sopenharmony_ci def test_patch_keyword_args(self): 8497db96d56Sopenharmony_ci kwargs = {'side_effect': KeyError, 'foo.bar.return_value': 33, 8507db96d56Sopenharmony_ci 'foo': MagicMock()} 8517db96d56Sopenharmony_ci 8527db96d56Sopenharmony_ci patcher = patch(foo_name, **kwargs) 8537db96d56Sopenharmony_ci mock = patcher.start() 8547db96d56Sopenharmony_ci patcher.stop() 8557db96d56Sopenharmony_ci 8567db96d56Sopenharmony_ci self.assertRaises(KeyError, mock) 8577db96d56Sopenharmony_ci self.assertEqual(mock.foo.bar(), 33) 8587db96d56Sopenharmony_ci self.assertIsInstance(mock.foo, MagicMock) 8597db96d56Sopenharmony_ci 8607db96d56Sopenharmony_ci 8617db96d56Sopenharmony_ci def test_patch_object_keyword_args(self): 8627db96d56Sopenharmony_ci kwargs = {'side_effect': KeyError, 'foo.bar.return_value': 33, 8637db96d56Sopenharmony_ci 'foo': MagicMock()} 8647db96d56Sopenharmony_ci 8657db96d56Sopenharmony_ci patcher = patch.object(Foo, 'f', **kwargs) 8667db96d56Sopenharmony_ci mock = patcher.start() 8677db96d56Sopenharmony_ci patcher.stop() 8687db96d56Sopenharmony_ci 8697db96d56Sopenharmony_ci self.assertRaises(KeyError, mock) 8707db96d56Sopenharmony_ci self.assertEqual(mock.foo.bar(), 33) 8717db96d56Sopenharmony_ci self.assertIsInstance(mock.foo, MagicMock) 8727db96d56Sopenharmony_ci 8737db96d56Sopenharmony_ci 8747db96d56Sopenharmony_ci def test_patch_dict_keyword_args(self): 8757db96d56Sopenharmony_ci original = {'foo': 'bar'} 8767db96d56Sopenharmony_ci copy = original.copy() 8777db96d56Sopenharmony_ci 8787db96d56Sopenharmony_ci patcher = patch.dict(original, foo=3, bar=4, baz=5) 8797db96d56Sopenharmony_ci patcher.start() 8807db96d56Sopenharmony_ci 8817db96d56Sopenharmony_ci try: 8827db96d56Sopenharmony_ci self.assertEqual(original, dict(foo=3, bar=4, baz=5)) 8837db96d56Sopenharmony_ci finally: 8847db96d56Sopenharmony_ci patcher.stop() 8857db96d56Sopenharmony_ci 8867db96d56Sopenharmony_ci self.assertEqual(original, copy) 8877db96d56Sopenharmony_ci 8887db96d56Sopenharmony_ci 8897db96d56Sopenharmony_ci def test_autospec(self): 8907db96d56Sopenharmony_ci class Boo(object): 8917db96d56Sopenharmony_ci def __init__(self, a): pass 8927db96d56Sopenharmony_ci def f(self, a): pass 8937db96d56Sopenharmony_ci def g(self): pass 8947db96d56Sopenharmony_ci foo = 'bar' 8957db96d56Sopenharmony_ci 8967db96d56Sopenharmony_ci class Bar(object): 8977db96d56Sopenharmony_ci def a(self): pass 8987db96d56Sopenharmony_ci 8997db96d56Sopenharmony_ci def _test(mock): 9007db96d56Sopenharmony_ci mock(1) 9017db96d56Sopenharmony_ci mock.assert_called_with(1) 9027db96d56Sopenharmony_ci self.assertRaises(TypeError, mock) 9037db96d56Sopenharmony_ci 9047db96d56Sopenharmony_ci def _test2(mock): 9057db96d56Sopenharmony_ci mock.f(1) 9067db96d56Sopenharmony_ci mock.f.assert_called_with(1) 9077db96d56Sopenharmony_ci self.assertRaises(TypeError, mock.f) 9087db96d56Sopenharmony_ci 9097db96d56Sopenharmony_ci mock.g() 9107db96d56Sopenharmony_ci mock.g.assert_called_with() 9117db96d56Sopenharmony_ci self.assertRaises(TypeError, mock.g, 1) 9127db96d56Sopenharmony_ci 9137db96d56Sopenharmony_ci self.assertRaises(AttributeError, getattr, mock, 'h') 9147db96d56Sopenharmony_ci 9157db96d56Sopenharmony_ci mock.foo.lower() 9167db96d56Sopenharmony_ci mock.foo.lower.assert_called_with() 9177db96d56Sopenharmony_ci self.assertRaises(AttributeError, getattr, mock.foo, 'bar') 9187db96d56Sopenharmony_ci 9197db96d56Sopenharmony_ci mock.Bar() 9207db96d56Sopenharmony_ci mock.Bar.assert_called_with() 9217db96d56Sopenharmony_ci 9227db96d56Sopenharmony_ci mock.Bar.a() 9237db96d56Sopenharmony_ci mock.Bar.a.assert_called_with() 9247db96d56Sopenharmony_ci self.assertRaises(TypeError, mock.Bar.a, 1) 9257db96d56Sopenharmony_ci 9267db96d56Sopenharmony_ci mock.Bar().a() 9277db96d56Sopenharmony_ci mock.Bar().a.assert_called_with() 9287db96d56Sopenharmony_ci self.assertRaises(TypeError, mock.Bar().a, 1) 9297db96d56Sopenharmony_ci 9307db96d56Sopenharmony_ci self.assertRaises(AttributeError, getattr, mock.Bar, 'b') 9317db96d56Sopenharmony_ci self.assertRaises(AttributeError, getattr, mock.Bar(), 'b') 9327db96d56Sopenharmony_ci 9337db96d56Sopenharmony_ci def function(mock): 9347db96d56Sopenharmony_ci _test(mock) 9357db96d56Sopenharmony_ci _test2(mock) 9367db96d56Sopenharmony_ci _test2(mock(1)) 9377db96d56Sopenharmony_ci self.assertIs(mock, Foo) 9387db96d56Sopenharmony_ci return mock 9397db96d56Sopenharmony_ci 9407db96d56Sopenharmony_ci test = patch(foo_name, autospec=True)(function) 9417db96d56Sopenharmony_ci 9427db96d56Sopenharmony_ci mock = test() 9437db96d56Sopenharmony_ci self.assertIsNot(Foo, mock) 9447db96d56Sopenharmony_ci # test patching a second time works 9457db96d56Sopenharmony_ci test() 9467db96d56Sopenharmony_ci 9477db96d56Sopenharmony_ci module = sys.modules[__name__] 9487db96d56Sopenharmony_ci test = patch.object(module, 'Foo', autospec=True)(function) 9497db96d56Sopenharmony_ci 9507db96d56Sopenharmony_ci mock = test() 9517db96d56Sopenharmony_ci self.assertIsNot(Foo, mock) 9527db96d56Sopenharmony_ci # test patching a second time works 9537db96d56Sopenharmony_ci test() 9547db96d56Sopenharmony_ci 9557db96d56Sopenharmony_ci 9567db96d56Sopenharmony_ci def test_autospec_function(self): 9577db96d56Sopenharmony_ci @patch('%s.function' % __name__, autospec=True) 9587db96d56Sopenharmony_ci def test(mock): 9597db96d56Sopenharmony_ci function.assert_not_called() 9607db96d56Sopenharmony_ci self.assertRaises(AssertionError, function.assert_called) 9617db96d56Sopenharmony_ci self.assertRaises(AssertionError, function.assert_called_once) 9627db96d56Sopenharmony_ci function(1) 9637db96d56Sopenharmony_ci self.assertRaises(AssertionError, function.assert_not_called) 9647db96d56Sopenharmony_ci function.assert_called_with(1) 9657db96d56Sopenharmony_ci function.assert_called() 9667db96d56Sopenharmony_ci function.assert_called_once() 9677db96d56Sopenharmony_ci function(2, 3) 9687db96d56Sopenharmony_ci function.assert_called_with(2, 3) 9697db96d56Sopenharmony_ci 9707db96d56Sopenharmony_ci self.assertRaises(TypeError, function) 9717db96d56Sopenharmony_ci self.assertRaises(AttributeError, getattr, function, 'foo') 9727db96d56Sopenharmony_ci 9737db96d56Sopenharmony_ci test() 9747db96d56Sopenharmony_ci 9757db96d56Sopenharmony_ci 9767db96d56Sopenharmony_ci def test_autospec_keywords(self): 9777db96d56Sopenharmony_ci @patch('%s.function' % __name__, autospec=True, 9787db96d56Sopenharmony_ci return_value=3) 9797db96d56Sopenharmony_ci def test(mock_function): 9807db96d56Sopenharmony_ci #self.assertEqual(function.abc, 'foo') 9817db96d56Sopenharmony_ci return function(1, 2) 9827db96d56Sopenharmony_ci 9837db96d56Sopenharmony_ci result = test() 9847db96d56Sopenharmony_ci self.assertEqual(result, 3) 9857db96d56Sopenharmony_ci 9867db96d56Sopenharmony_ci 9877db96d56Sopenharmony_ci def test_autospec_staticmethod(self): 9887db96d56Sopenharmony_ci with patch('%s.Foo.static_method' % __name__, autospec=True) as method: 9897db96d56Sopenharmony_ci Foo.static_method() 9907db96d56Sopenharmony_ci method.assert_called_once_with() 9917db96d56Sopenharmony_ci 9927db96d56Sopenharmony_ci 9937db96d56Sopenharmony_ci def test_autospec_classmethod(self): 9947db96d56Sopenharmony_ci with patch('%s.Foo.class_method' % __name__, autospec=True) as method: 9957db96d56Sopenharmony_ci Foo.class_method() 9967db96d56Sopenharmony_ci method.assert_called_once_with() 9977db96d56Sopenharmony_ci 9987db96d56Sopenharmony_ci 9997db96d56Sopenharmony_ci def test_autospec_staticmethod_signature(self): 10007db96d56Sopenharmony_ci # Patched methods which are decorated with @staticmethod should have the same signature 10017db96d56Sopenharmony_ci class Foo: 10027db96d56Sopenharmony_ci @staticmethod 10037db96d56Sopenharmony_ci def static_method(a, b=10, *, c): pass 10047db96d56Sopenharmony_ci 10057db96d56Sopenharmony_ci Foo.static_method(1, 2, c=3) 10067db96d56Sopenharmony_ci 10077db96d56Sopenharmony_ci with patch.object(Foo, 'static_method', autospec=True) as method: 10087db96d56Sopenharmony_ci method(1, 2, c=3) 10097db96d56Sopenharmony_ci self.assertRaises(TypeError, method) 10107db96d56Sopenharmony_ci self.assertRaises(TypeError, method, 1) 10117db96d56Sopenharmony_ci self.assertRaises(TypeError, method, 1, 2, 3, c=4) 10127db96d56Sopenharmony_ci 10137db96d56Sopenharmony_ci 10147db96d56Sopenharmony_ci def test_autospec_classmethod_signature(self): 10157db96d56Sopenharmony_ci # Patched methods which are decorated with @classmethod should have the same signature 10167db96d56Sopenharmony_ci class Foo: 10177db96d56Sopenharmony_ci @classmethod 10187db96d56Sopenharmony_ci def class_method(cls, a, b=10, *, c): pass 10197db96d56Sopenharmony_ci 10207db96d56Sopenharmony_ci Foo.class_method(1, 2, c=3) 10217db96d56Sopenharmony_ci 10227db96d56Sopenharmony_ci with patch.object(Foo, 'class_method', autospec=True) as method: 10237db96d56Sopenharmony_ci method(1, 2, c=3) 10247db96d56Sopenharmony_ci self.assertRaises(TypeError, method) 10257db96d56Sopenharmony_ci self.assertRaises(TypeError, method, 1) 10267db96d56Sopenharmony_ci self.assertRaises(TypeError, method, 1, 2, 3, c=4) 10277db96d56Sopenharmony_ci 10287db96d56Sopenharmony_ci 10297db96d56Sopenharmony_ci def test_autospec_with_new(self): 10307db96d56Sopenharmony_ci patcher = patch('%s.function' % __name__, new=3, autospec=True) 10317db96d56Sopenharmony_ci self.assertRaises(TypeError, patcher.start) 10327db96d56Sopenharmony_ci 10337db96d56Sopenharmony_ci module = sys.modules[__name__] 10347db96d56Sopenharmony_ci patcher = patch.object(module, 'function', new=3, autospec=True) 10357db96d56Sopenharmony_ci self.assertRaises(TypeError, patcher.start) 10367db96d56Sopenharmony_ci 10377db96d56Sopenharmony_ci 10387db96d56Sopenharmony_ci def test_autospec_with_object(self): 10397db96d56Sopenharmony_ci class Bar(Foo): 10407db96d56Sopenharmony_ci extra = [] 10417db96d56Sopenharmony_ci 10427db96d56Sopenharmony_ci patcher = patch(foo_name, autospec=Bar) 10437db96d56Sopenharmony_ci mock = patcher.start() 10447db96d56Sopenharmony_ci try: 10457db96d56Sopenharmony_ci self.assertIsInstance(mock, Bar) 10467db96d56Sopenharmony_ci self.assertIsInstance(mock.extra, list) 10477db96d56Sopenharmony_ci finally: 10487db96d56Sopenharmony_ci patcher.stop() 10497db96d56Sopenharmony_ci 10507db96d56Sopenharmony_ci 10517db96d56Sopenharmony_ci def test_autospec_inherits(self): 10527db96d56Sopenharmony_ci FooClass = Foo 10537db96d56Sopenharmony_ci patcher = patch(foo_name, autospec=True) 10547db96d56Sopenharmony_ci mock = patcher.start() 10557db96d56Sopenharmony_ci try: 10567db96d56Sopenharmony_ci self.assertIsInstance(mock, FooClass) 10577db96d56Sopenharmony_ci self.assertIsInstance(mock(3), FooClass) 10587db96d56Sopenharmony_ci finally: 10597db96d56Sopenharmony_ci patcher.stop() 10607db96d56Sopenharmony_ci 10617db96d56Sopenharmony_ci 10627db96d56Sopenharmony_ci def test_autospec_name(self): 10637db96d56Sopenharmony_ci patcher = patch(foo_name, autospec=True) 10647db96d56Sopenharmony_ci mock = patcher.start() 10657db96d56Sopenharmony_ci 10667db96d56Sopenharmony_ci try: 10677db96d56Sopenharmony_ci self.assertIn(" name='Foo'", repr(mock)) 10687db96d56Sopenharmony_ci self.assertIn(" name='Foo.f'", repr(mock.f)) 10697db96d56Sopenharmony_ci self.assertIn(" name='Foo()'", repr(mock(None))) 10707db96d56Sopenharmony_ci self.assertIn(" name='Foo().f'", repr(mock(None).f)) 10717db96d56Sopenharmony_ci finally: 10727db96d56Sopenharmony_ci patcher.stop() 10737db96d56Sopenharmony_ci 10747db96d56Sopenharmony_ci 10757db96d56Sopenharmony_ci def test_tracebacks(self): 10767db96d56Sopenharmony_ci @patch.object(Foo, 'f', object()) 10777db96d56Sopenharmony_ci def test(): 10787db96d56Sopenharmony_ci raise AssertionError 10797db96d56Sopenharmony_ci try: 10807db96d56Sopenharmony_ci test() 10817db96d56Sopenharmony_ci except: 10827db96d56Sopenharmony_ci err = sys.exc_info() 10837db96d56Sopenharmony_ci 10847db96d56Sopenharmony_ci result = unittest.TextTestResult(None, None, 0) 10857db96d56Sopenharmony_ci traceback = result._exc_info_to_string(err, self) 10867db96d56Sopenharmony_ci self.assertIn('raise AssertionError', traceback) 10877db96d56Sopenharmony_ci 10887db96d56Sopenharmony_ci 10897db96d56Sopenharmony_ci def test_new_callable_patch(self): 10907db96d56Sopenharmony_ci patcher = patch(foo_name, new_callable=NonCallableMagicMock) 10917db96d56Sopenharmony_ci 10927db96d56Sopenharmony_ci m1 = patcher.start() 10937db96d56Sopenharmony_ci patcher.stop() 10947db96d56Sopenharmony_ci m2 = patcher.start() 10957db96d56Sopenharmony_ci patcher.stop() 10967db96d56Sopenharmony_ci 10977db96d56Sopenharmony_ci self.assertIsNot(m1, m2) 10987db96d56Sopenharmony_ci for mock in m1, m2: 10997db96d56Sopenharmony_ci self.assertNotCallable(m1) 11007db96d56Sopenharmony_ci 11017db96d56Sopenharmony_ci 11027db96d56Sopenharmony_ci def test_new_callable_patch_object(self): 11037db96d56Sopenharmony_ci patcher = patch.object(Foo, 'f', new_callable=NonCallableMagicMock) 11047db96d56Sopenharmony_ci 11057db96d56Sopenharmony_ci m1 = patcher.start() 11067db96d56Sopenharmony_ci patcher.stop() 11077db96d56Sopenharmony_ci m2 = patcher.start() 11087db96d56Sopenharmony_ci patcher.stop() 11097db96d56Sopenharmony_ci 11107db96d56Sopenharmony_ci self.assertIsNot(m1, m2) 11117db96d56Sopenharmony_ci for mock in m1, m2: 11127db96d56Sopenharmony_ci self.assertNotCallable(m1) 11137db96d56Sopenharmony_ci 11147db96d56Sopenharmony_ci 11157db96d56Sopenharmony_ci def test_new_callable_keyword_arguments(self): 11167db96d56Sopenharmony_ci class Bar(object): 11177db96d56Sopenharmony_ci kwargs = None 11187db96d56Sopenharmony_ci def __init__(self, **kwargs): 11197db96d56Sopenharmony_ci Bar.kwargs = kwargs 11207db96d56Sopenharmony_ci 11217db96d56Sopenharmony_ci patcher = patch(foo_name, new_callable=Bar, arg1=1, arg2=2) 11227db96d56Sopenharmony_ci m = patcher.start() 11237db96d56Sopenharmony_ci try: 11247db96d56Sopenharmony_ci self.assertIs(type(m), Bar) 11257db96d56Sopenharmony_ci self.assertEqual(Bar.kwargs, dict(arg1=1, arg2=2)) 11267db96d56Sopenharmony_ci finally: 11277db96d56Sopenharmony_ci patcher.stop() 11287db96d56Sopenharmony_ci 11297db96d56Sopenharmony_ci 11307db96d56Sopenharmony_ci def test_new_callable_spec(self): 11317db96d56Sopenharmony_ci class Bar(object): 11327db96d56Sopenharmony_ci kwargs = None 11337db96d56Sopenharmony_ci def __init__(self, **kwargs): 11347db96d56Sopenharmony_ci Bar.kwargs = kwargs 11357db96d56Sopenharmony_ci 11367db96d56Sopenharmony_ci patcher = patch(foo_name, new_callable=Bar, spec=Bar) 11377db96d56Sopenharmony_ci patcher.start() 11387db96d56Sopenharmony_ci try: 11397db96d56Sopenharmony_ci self.assertEqual(Bar.kwargs, dict(spec=Bar)) 11407db96d56Sopenharmony_ci finally: 11417db96d56Sopenharmony_ci patcher.stop() 11427db96d56Sopenharmony_ci 11437db96d56Sopenharmony_ci patcher = patch(foo_name, new_callable=Bar, spec_set=Bar) 11447db96d56Sopenharmony_ci patcher.start() 11457db96d56Sopenharmony_ci try: 11467db96d56Sopenharmony_ci self.assertEqual(Bar.kwargs, dict(spec_set=Bar)) 11477db96d56Sopenharmony_ci finally: 11487db96d56Sopenharmony_ci patcher.stop() 11497db96d56Sopenharmony_ci 11507db96d56Sopenharmony_ci 11517db96d56Sopenharmony_ci def test_new_callable_create(self): 11527db96d56Sopenharmony_ci non_existent_attr = '%s.weeeee' % foo_name 11537db96d56Sopenharmony_ci p = patch(non_existent_attr, new_callable=NonCallableMock) 11547db96d56Sopenharmony_ci self.assertRaises(AttributeError, p.start) 11557db96d56Sopenharmony_ci 11567db96d56Sopenharmony_ci p = patch(non_existent_attr, new_callable=NonCallableMock, 11577db96d56Sopenharmony_ci create=True) 11587db96d56Sopenharmony_ci m = p.start() 11597db96d56Sopenharmony_ci try: 11607db96d56Sopenharmony_ci self.assertNotCallable(m, magic=False) 11617db96d56Sopenharmony_ci finally: 11627db96d56Sopenharmony_ci p.stop() 11637db96d56Sopenharmony_ci 11647db96d56Sopenharmony_ci 11657db96d56Sopenharmony_ci def test_new_callable_incompatible_with_new(self): 11667db96d56Sopenharmony_ci self.assertRaises( 11677db96d56Sopenharmony_ci ValueError, patch, foo_name, new=object(), new_callable=MagicMock 11687db96d56Sopenharmony_ci ) 11697db96d56Sopenharmony_ci self.assertRaises( 11707db96d56Sopenharmony_ci ValueError, patch.object, Foo, 'f', new=object(), 11717db96d56Sopenharmony_ci new_callable=MagicMock 11727db96d56Sopenharmony_ci ) 11737db96d56Sopenharmony_ci 11747db96d56Sopenharmony_ci 11757db96d56Sopenharmony_ci def test_new_callable_incompatible_with_autospec(self): 11767db96d56Sopenharmony_ci self.assertRaises( 11777db96d56Sopenharmony_ci ValueError, patch, foo_name, new_callable=MagicMock, 11787db96d56Sopenharmony_ci autospec=True 11797db96d56Sopenharmony_ci ) 11807db96d56Sopenharmony_ci self.assertRaises( 11817db96d56Sopenharmony_ci ValueError, patch.object, Foo, 'f', new_callable=MagicMock, 11827db96d56Sopenharmony_ci autospec=True 11837db96d56Sopenharmony_ci ) 11847db96d56Sopenharmony_ci 11857db96d56Sopenharmony_ci 11867db96d56Sopenharmony_ci def test_new_callable_inherit_for_mocks(self): 11877db96d56Sopenharmony_ci class MockSub(Mock): 11887db96d56Sopenharmony_ci pass 11897db96d56Sopenharmony_ci 11907db96d56Sopenharmony_ci MockClasses = ( 11917db96d56Sopenharmony_ci NonCallableMock, NonCallableMagicMock, MagicMock, Mock, MockSub 11927db96d56Sopenharmony_ci ) 11937db96d56Sopenharmony_ci for Klass in MockClasses: 11947db96d56Sopenharmony_ci for arg in 'spec', 'spec_set': 11957db96d56Sopenharmony_ci kwargs = {arg: True} 11967db96d56Sopenharmony_ci p = patch(foo_name, new_callable=Klass, **kwargs) 11977db96d56Sopenharmony_ci m = p.start() 11987db96d56Sopenharmony_ci try: 11997db96d56Sopenharmony_ci instance = m.return_value 12007db96d56Sopenharmony_ci self.assertRaises(AttributeError, getattr, instance, 'x') 12017db96d56Sopenharmony_ci finally: 12027db96d56Sopenharmony_ci p.stop() 12037db96d56Sopenharmony_ci 12047db96d56Sopenharmony_ci 12057db96d56Sopenharmony_ci def test_new_callable_inherit_non_mock(self): 12067db96d56Sopenharmony_ci class NotAMock(object): 12077db96d56Sopenharmony_ci def __init__(self, spec): 12087db96d56Sopenharmony_ci self.spec = spec 12097db96d56Sopenharmony_ci 12107db96d56Sopenharmony_ci p = patch(foo_name, new_callable=NotAMock, spec=True) 12117db96d56Sopenharmony_ci m = p.start() 12127db96d56Sopenharmony_ci try: 12137db96d56Sopenharmony_ci self.assertTrue(is_instance(m, NotAMock)) 12147db96d56Sopenharmony_ci self.assertRaises(AttributeError, getattr, m, 'return_value') 12157db96d56Sopenharmony_ci finally: 12167db96d56Sopenharmony_ci p.stop() 12177db96d56Sopenharmony_ci 12187db96d56Sopenharmony_ci self.assertEqual(m.spec, Foo) 12197db96d56Sopenharmony_ci 12207db96d56Sopenharmony_ci 12217db96d56Sopenharmony_ci def test_new_callable_class_decorating(self): 12227db96d56Sopenharmony_ci test = self 12237db96d56Sopenharmony_ci original = Foo 12247db96d56Sopenharmony_ci class SomeTest(object): 12257db96d56Sopenharmony_ci 12267db96d56Sopenharmony_ci def _test(self, mock_foo): 12277db96d56Sopenharmony_ci test.assertIsNot(Foo, original) 12287db96d56Sopenharmony_ci test.assertIs(Foo, mock_foo) 12297db96d56Sopenharmony_ci test.assertIsInstance(Foo, SomeClass) 12307db96d56Sopenharmony_ci 12317db96d56Sopenharmony_ci def test_two(self, mock_foo): 12327db96d56Sopenharmony_ci self._test(mock_foo) 12337db96d56Sopenharmony_ci def test_one(self, mock_foo): 12347db96d56Sopenharmony_ci self._test(mock_foo) 12357db96d56Sopenharmony_ci 12367db96d56Sopenharmony_ci SomeTest = patch(foo_name, new_callable=SomeClass)(SomeTest) 12377db96d56Sopenharmony_ci SomeTest().test_one() 12387db96d56Sopenharmony_ci SomeTest().test_two() 12397db96d56Sopenharmony_ci self.assertIs(Foo, original) 12407db96d56Sopenharmony_ci 12417db96d56Sopenharmony_ci 12427db96d56Sopenharmony_ci def test_patch_multiple(self): 12437db96d56Sopenharmony_ci original_foo = Foo 12447db96d56Sopenharmony_ci original_f = Foo.f 12457db96d56Sopenharmony_ci original_g = Foo.g 12467db96d56Sopenharmony_ci 12477db96d56Sopenharmony_ci patcher1 = patch.multiple(foo_name, f=1, g=2) 12487db96d56Sopenharmony_ci patcher2 = patch.multiple(Foo, f=1, g=2) 12497db96d56Sopenharmony_ci 12507db96d56Sopenharmony_ci for patcher in patcher1, patcher2: 12517db96d56Sopenharmony_ci patcher.start() 12527db96d56Sopenharmony_ci try: 12537db96d56Sopenharmony_ci self.assertIs(Foo, original_foo) 12547db96d56Sopenharmony_ci self.assertEqual(Foo.f, 1) 12557db96d56Sopenharmony_ci self.assertEqual(Foo.g, 2) 12567db96d56Sopenharmony_ci finally: 12577db96d56Sopenharmony_ci patcher.stop() 12587db96d56Sopenharmony_ci 12597db96d56Sopenharmony_ci self.assertIs(Foo, original_foo) 12607db96d56Sopenharmony_ci self.assertEqual(Foo.f, original_f) 12617db96d56Sopenharmony_ci self.assertEqual(Foo.g, original_g) 12627db96d56Sopenharmony_ci 12637db96d56Sopenharmony_ci 12647db96d56Sopenharmony_ci @patch.multiple(foo_name, f=3, g=4) 12657db96d56Sopenharmony_ci def test(): 12667db96d56Sopenharmony_ci self.assertIs(Foo, original_foo) 12677db96d56Sopenharmony_ci self.assertEqual(Foo.f, 3) 12687db96d56Sopenharmony_ci self.assertEqual(Foo.g, 4) 12697db96d56Sopenharmony_ci 12707db96d56Sopenharmony_ci test() 12717db96d56Sopenharmony_ci 12727db96d56Sopenharmony_ci 12737db96d56Sopenharmony_ci def test_patch_multiple_no_kwargs(self): 12747db96d56Sopenharmony_ci self.assertRaises(ValueError, patch.multiple, foo_name) 12757db96d56Sopenharmony_ci self.assertRaises(ValueError, patch.multiple, Foo) 12767db96d56Sopenharmony_ci 12777db96d56Sopenharmony_ci 12787db96d56Sopenharmony_ci def test_patch_multiple_create_mocks(self): 12797db96d56Sopenharmony_ci original_foo = Foo 12807db96d56Sopenharmony_ci original_f = Foo.f 12817db96d56Sopenharmony_ci original_g = Foo.g 12827db96d56Sopenharmony_ci 12837db96d56Sopenharmony_ci @patch.multiple(foo_name, f=DEFAULT, g=3, foo=DEFAULT) 12847db96d56Sopenharmony_ci def test(f, foo): 12857db96d56Sopenharmony_ci self.assertIs(Foo, original_foo) 12867db96d56Sopenharmony_ci self.assertIs(Foo.f, f) 12877db96d56Sopenharmony_ci self.assertEqual(Foo.g, 3) 12887db96d56Sopenharmony_ci self.assertIs(Foo.foo, foo) 12897db96d56Sopenharmony_ci self.assertTrue(is_instance(f, MagicMock)) 12907db96d56Sopenharmony_ci self.assertTrue(is_instance(foo, MagicMock)) 12917db96d56Sopenharmony_ci 12927db96d56Sopenharmony_ci test() 12937db96d56Sopenharmony_ci self.assertEqual(Foo.f, original_f) 12947db96d56Sopenharmony_ci self.assertEqual(Foo.g, original_g) 12957db96d56Sopenharmony_ci 12967db96d56Sopenharmony_ci 12977db96d56Sopenharmony_ci def test_patch_multiple_create_mocks_different_order(self): 12987db96d56Sopenharmony_ci original_f = Foo.f 12997db96d56Sopenharmony_ci original_g = Foo.g 13007db96d56Sopenharmony_ci 13017db96d56Sopenharmony_ci patcher = patch.object(Foo, 'f', 3) 13027db96d56Sopenharmony_ci patcher.attribute_name = 'f' 13037db96d56Sopenharmony_ci 13047db96d56Sopenharmony_ci other = patch.object(Foo, 'g', DEFAULT) 13057db96d56Sopenharmony_ci other.attribute_name = 'g' 13067db96d56Sopenharmony_ci patcher.additional_patchers = [other] 13077db96d56Sopenharmony_ci 13087db96d56Sopenharmony_ci @patcher 13097db96d56Sopenharmony_ci def test(g): 13107db96d56Sopenharmony_ci self.assertIs(Foo.g, g) 13117db96d56Sopenharmony_ci self.assertEqual(Foo.f, 3) 13127db96d56Sopenharmony_ci 13137db96d56Sopenharmony_ci test() 13147db96d56Sopenharmony_ci self.assertEqual(Foo.f, original_f) 13157db96d56Sopenharmony_ci self.assertEqual(Foo.g, original_g) 13167db96d56Sopenharmony_ci 13177db96d56Sopenharmony_ci 13187db96d56Sopenharmony_ci def test_patch_multiple_stacked_decorators(self): 13197db96d56Sopenharmony_ci original_foo = Foo 13207db96d56Sopenharmony_ci original_f = Foo.f 13217db96d56Sopenharmony_ci original_g = Foo.g 13227db96d56Sopenharmony_ci 13237db96d56Sopenharmony_ci @patch.multiple(foo_name, f=DEFAULT) 13247db96d56Sopenharmony_ci @patch.multiple(foo_name, foo=DEFAULT) 13257db96d56Sopenharmony_ci @patch(foo_name + '.g') 13267db96d56Sopenharmony_ci def test1(g, **kwargs): 13277db96d56Sopenharmony_ci _test(g, **kwargs) 13287db96d56Sopenharmony_ci 13297db96d56Sopenharmony_ci @patch.multiple(foo_name, f=DEFAULT) 13307db96d56Sopenharmony_ci @patch(foo_name + '.g') 13317db96d56Sopenharmony_ci @patch.multiple(foo_name, foo=DEFAULT) 13327db96d56Sopenharmony_ci def test2(g, **kwargs): 13337db96d56Sopenharmony_ci _test(g, **kwargs) 13347db96d56Sopenharmony_ci 13357db96d56Sopenharmony_ci @patch(foo_name + '.g') 13367db96d56Sopenharmony_ci @patch.multiple(foo_name, f=DEFAULT) 13377db96d56Sopenharmony_ci @patch.multiple(foo_name, foo=DEFAULT) 13387db96d56Sopenharmony_ci def test3(g, **kwargs): 13397db96d56Sopenharmony_ci _test(g, **kwargs) 13407db96d56Sopenharmony_ci 13417db96d56Sopenharmony_ci def _test(g, **kwargs): 13427db96d56Sopenharmony_ci f = kwargs.pop('f') 13437db96d56Sopenharmony_ci foo = kwargs.pop('foo') 13447db96d56Sopenharmony_ci self.assertFalse(kwargs) 13457db96d56Sopenharmony_ci 13467db96d56Sopenharmony_ci self.assertIs(Foo, original_foo) 13477db96d56Sopenharmony_ci self.assertIs(Foo.f, f) 13487db96d56Sopenharmony_ci self.assertIs(Foo.g, g) 13497db96d56Sopenharmony_ci self.assertIs(Foo.foo, foo) 13507db96d56Sopenharmony_ci self.assertTrue(is_instance(f, MagicMock)) 13517db96d56Sopenharmony_ci self.assertTrue(is_instance(g, MagicMock)) 13527db96d56Sopenharmony_ci self.assertTrue(is_instance(foo, MagicMock)) 13537db96d56Sopenharmony_ci 13547db96d56Sopenharmony_ci test1() 13557db96d56Sopenharmony_ci test2() 13567db96d56Sopenharmony_ci test3() 13577db96d56Sopenharmony_ci self.assertEqual(Foo.f, original_f) 13587db96d56Sopenharmony_ci self.assertEqual(Foo.g, original_g) 13597db96d56Sopenharmony_ci 13607db96d56Sopenharmony_ci 13617db96d56Sopenharmony_ci def test_patch_multiple_create_mocks_patcher(self): 13627db96d56Sopenharmony_ci original_foo = Foo 13637db96d56Sopenharmony_ci original_f = Foo.f 13647db96d56Sopenharmony_ci original_g = Foo.g 13657db96d56Sopenharmony_ci 13667db96d56Sopenharmony_ci patcher = patch.multiple(foo_name, f=DEFAULT, g=3, foo=DEFAULT) 13677db96d56Sopenharmony_ci 13687db96d56Sopenharmony_ci result = patcher.start() 13697db96d56Sopenharmony_ci try: 13707db96d56Sopenharmony_ci f = result['f'] 13717db96d56Sopenharmony_ci foo = result['foo'] 13727db96d56Sopenharmony_ci self.assertEqual(set(result), set(['f', 'foo'])) 13737db96d56Sopenharmony_ci 13747db96d56Sopenharmony_ci self.assertIs(Foo, original_foo) 13757db96d56Sopenharmony_ci self.assertIs(Foo.f, f) 13767db96d56Sopenharmony_ci self.assertIs(Foo.foo, foo) 13777db96d56Sopenharmony_ci self.assertTrue(is_instance(f, MagicMock)) 13787db96d56Sopenharmony_ci self.assertTrue(is_instance(foo, MagicMock)) 13797db96d56Sopenharmony_ci finally: 13807db96d56Sopenharmony_ci patcher.stop() 13817db96d56Sopenharmony_ci 13827db96d56Sopenharmony_ci self.assertEqual(Foo.f, original_f) 13837db96d56Sopenharmony_ci self.assertEqual(Foo.g, original_g) 13847db96d56Sopenharmony_ci 13857db96d56Sopenharmony_ci 13867db96d56Sopenharmony_ci def test_patch_multiple_decorating_class(self): 13877db96d56Sopenharmony_ci test = self 13887db96d56Sopenharmony_ci original_foo = Foo 13897db96d56Sopenharmony_ci original_f = Foo.f 13907db96d56Sopenharmony_ci original_g = Foo.g 13917db96d56Sopenharmony_ci 13927db96d56Sopenharmony_ci class SomeTest(object): 13937db96d56Sopenharmony_ci 13947db96d56Sopenharmony_ci def _test(self, f, foo): 13957db96d56Sopenharmony_ci test.assertIs(Foo, original_foo) 13967db96d56Sopenharmony_ci test.assertIs(Foo.f, f) 13977db96d56Sopenharmony_ci test.assertEqual(Foo.g, 3) 13987db96d56Sopenharmony_ci test.assertIs(Foo.foo, foo) 13997db96d56Sopenharmony_ci test.assertTrue(is_instance(f, MagicMock)) 14007db96d56Sopenharmony_ci test.assertTrue(is_instance(foo, MagicMock)) 14017db96d56Sopenharmony_ci 14027db96d56Sopenharmony_ci def test_two(self, f, foo): 14037db96d56Sopenharmony_ci self._test(f, foo) 14047db96d56Sopenharmony_ci def test_one(self, f, foo): 14057db96d56Sopenharmony_ci self._test(f, foo) 14067db96d56Sopenharmony_ci 14077db96d56Sopenharmony_ci SomeTest = patch.multiple( 14087db96d56Sopenharmony_ci foo_name, f=DEFAULT, g=3, foo=DEFAULT 14097db96d56Sopenharmony_ci )(SomeTest) 14107db96d56Sopenharmony_ci 14117db96d56Sopenharmony_ci thing = SomeTest() 14127db96d56Sopenharmony_ci thing.test_one() 14137db96d56Sopenharmony_ci thing.test_two() 14147db96d56Sopenharmony_ci 14157db96d56Sopenharmony_ci self.assertEqual(Foo.f, original_f) 14167db96d56Sopenharmony_ci self.assertEqual(Foo.g, original_g) 14177db96d56Sopenharmony_ci 14187db96d56Sopenharmony_ci 14197db96d56Sopenharmony_ci def test_patch_multiple_create(self): 14207db96d56Sopenharmony_ci patcher = patch.multiple(Foo, blam='blam') 14217db96d56Sopenharmony_ci self.assertRaises(AttributeError, patcher.start) 14227db96d56Sopenharmony_ci 14237db96d56Sopenharmony_ci patcher = patch.multiple(Foo, blam='blam', create=True) 14247db96d56Sopenharmony_ci patcher.start() 14257db96d56Sopenharmony_ci try: 14267db96d56Sopenharmony_ci self.assertEqual(Foo.blam, 'blam') 14277db96d56Sopenharmony_ci finally: 14287db96d56Sopenharmony_ci patcher.stop() 14297db96d56Sopenharmony_ci 14307db96d56Sopenharmony_ci self.assertFalse(hasattr(Foo, 'blam')) 14317db96d56Sopenharmony_ci 14327db96d56Sopenharmony_ci 14337db96d56Sopenharmony_ci def test_patch_multiple_spec_set(self): 14347db96d56Sopenharmony_ci # if spec_set works then we can assume that spec and autospec also 14357db96d56Sopenharmony_ci # work as the underlying machinery is the same 14367db96d56Sopenharmony_ci patcher = patch.multiple(Foo, foo=DEFAULT, spec_set=['a', 'b']) 14377db96d56Sopenharmony_ci result = patcher.start() 14387db96d56Sopenharmony_ci try: 14397db96d56Sopenharmony_ci self.assertEqual(Foo.foo, result['foo']) 14407db96d56Sopenharmony_ci Foo.foo.a(1) 14417db96d56Sopenharmony_ci Foo.foo.b(2) 14427db96d56Sopenharmony_ci Foo.foo.a.assert_called_with(1) 14437db96d56Sopenharmony_ci Foo.foo.b.assert_called_with(2) 14447db96d56Sopenharmony_ci self.assertRaises(AttributeError, setattr, Foo.foo, 'c', None) 14457db96d56Sopenharmony_ci finally: 14467db96d56Sopenharmony_ci patcher.stop() 14477db96d56Sopenharmony_ci 14487db96d56Sopenharmony_ci 14497db96d56Sopenharmony_ci def test_patch_multiple_new_callable(self): 14507db96d56Sopenharmony_ci class Thing(object): 14517db96d56Sopenharmony_ci pass 14527db96d56Sopenharmony_ci 14537db96d56Sopenharmony_ci patcher = patch.multiple( 14547db96d56Sopenharmony_ci Foo, f=DEFAULT, g=DEFAULT, new_callable=Thing 14557db96d56Sopenharmony_ci ) 14567db96d56Sopenharmony_ci result = patcher.start() 14577db96d56Sopenharmony_ci try: 14587db96d56Sopenharmony_ci self.assertIs(Foo.f, result['f']) 14597db96d56Sopenharmony_ci self.assertIs(Foo.g, result['g']) 14607db96d56Sopenharmony_ci self.assertIsInstance(Foo.f, Thing) 14617db96d56Sopenharmony_ci self.assertIsInstance(Foo.g, Thing) 14627db96d56Sopenharmony_ci self.assertIsNot(Foo.f, Foo.g) 14637db96d56Sopenharmony_ci finally: 14647db96d56Sopenharmony_ci patcher.stop() 14657db96d56Sopenharmony_ci 14667db96d56Sopenharmony_ci 14677db96d56Sopenharmony_ci def test_nested_patch_failure(self): 14687db96d56Sopenharmony_ci original_f = Foo.f 14697db96d56Sopenharmony_ci original_g = Foo.g 14707db96d56Sopenharmony_ci 14717db96d56Sopenharmony_ci @patch.object(Foo, 'g', 1) 14727db96d56Sopenharmony_ci @patch.object(Foo, 'missing', 1) 14737db96d56Sopenharmony_ci @patch.object(Foo, 'f', 1) 14747db96d56Sopenharmony_ci def thing1(): pass 14757db96d56Sopenharmony_ci 14767db96d56Sopenharmony_ci @patch.object(Foo, 'missing', 1) 14777db96d56Sopenharmony_ci @patch.object(Foo, 'g', 1) 14787db96d56Sopenharmony_ci @patch.object(Foo, 'f', 1) 14797db96d56Sopenharmony_ci def thing2(): pass 14807db96d56Sopenharmony_ci 14817db96d56Sopenharmony_ci @patch.object(Foo, 'g', 1) 14827db96d56Sopenharmony_ci @patch.object(Foo, 'f', 1) 14837db96d56Sopenharmony_ci @patch.object(Foo, 'missing', 1) 14847db96d56Sopenharmony_ci def thing3(): pass 14857db96d56Sopenharmony_ci 14867db96d56Sopenharmony_ci for func in thing1, thing2, thing3: 14877db96d56Sopenharmony_ci self.assertRaises(AttributeError, func) 14887db96d56Sopenharmony_ci self.assertEqual(Foo.f, original_f) 14897db96d56Sopenharmony_ci self.assertEqual(Foo.g, original_g) 14907db96d56Sopenharmony_ci 14917db96d56Sopenharmony_ci 14927db96d56Sopenharmony_ci def test_new_callable_failure(self): 14937db96d56Sopenharmony_ci original_f = Foo.f 14947db96d56Sopenharmony_ci original_g = Foo.g 14957db96d56Sopenharmony_ci original_foo = Foo.foo 14967db96d56Sopenharmony_ci 14977db96d56Sopenharmony_ci def crasher(): 14987db96d56Sopenharmony_ci raise NameError('crasher') 14997db96d56Sopenharmony_ci 15007db96d56Sopenharmony_ci @patch.object(Foo, 'g', 1) 15017db96d56Sopenharmony_ci @patch.object(Foo, 'foo', new_callable=crasher) 15027db96d56Sopenharmony_ci @patch.object(Foo, 'f', 1) 15037db96d56Sopenharmony_ci def thing1(): pass 15047db96d56Sopenharmony_ci 15057db96d56Sopenharmony_ci @patch.object(Foo, 'foo', new_callable=crasher) 15067db96d56Sopenharmony_ci @patch.object(Foo, 'g', 1) 15077db96d56Sopenharmony_ci @patch.object(Foo, 'f', 1) 15087db96d56Sopenharmony_ci def thing2(): pass 15097db96d56Sopenharmony_ci 15107db96d56Sopenharmony_ci @patch.object(Foo, 'g', 1) 15117db96d56Sopenharmony_ci @patch.object(Foo, 'f', 1) 15127db96d56Sopenharmony_ci @patch.object(Foo, 'foo', new_callable=crasher) 15137db96d56Sopenharmony_ci def thing3(): pass 15147db96d56Sopenharmony_ci 15157db96d56Sopenharmony_ci for func in thing1, thing2, thing3: 15167db96d56Sopenharmony_ci self.assertRaises(NameError, func) 15177db96d56Sopenharmony_ci self.assertEqual(Foo.f, original_f) 15187db96d56Sopenharmony_ci self.assertEqual(Foo.g, original_g) 15197db96d56Sopenharmony_ci self.assertEqual(Foo.foo, original_foo) 15207db96d56Sopenharmony_ci 15217db96d56Sopenharmony_ci 15227db96d56Sopenharmony_ci def test_patch_multiple_failure(self): 15237db96d56Sopenharmony_ci original_f = Foo.f 15247db96d56Sopenharmony_ci original_g = Foo.g 15257db96d56Sopenharmony_ci 15267db96d56Sopenharmony_ci patcher = patch.object(Foo, 'f', 1) 15277db96d56Sopenharmony_ci patcher.attribute_name = 'f' 15287db96d56Sopenharmony_ci 15297db96d56Sopenharmony_ci good = patch.object(Foo, 'g', 1) 15307db96d56Sopenharmony_ci good.attribute_name = 'g' 15317db96d56Sopenharmony_ci 15327db96d56Sopenharmony_ci bad = patch.object(Foo, 'missing', 1) 15337db96d56Sopenharmony_ci bad.attribute_name = 'missing' 15347db96d56Sopenharmony_ci 15357db96d56Sopenharmony_ci for additionals in [good, bad], [bad, good]: 15367db96d56Sopenharmony_ci patcher.additional_patchers = additionals 15377db96d56Sopenharmony_ci 15387db96d56Sopenharmony_ci @patcher 15397db96d56Sopenharmony_ci def func(): pass 15407db96d56Sopenharmony_ci 15417db96d56Sopenharmony_ci self.assertRaises(AttributeError, func) 15427db96d56Sopenharmony_ci self.assertEqual(Foo.f, original_f) 15437db96d56Sopenharmony_ci self.assertEqual(Foo.g, original_g) 15447db96d56Sopenharmony_ci 15457db96d56Sopenharmony_ci 15467db96d56Sopenharmony_ci def test_patch_multiple_new_callable_failure(self): 15477db96d56Sopenharmony_ci original_f = Foo.f 15487db96d56Sopenharmony_ci original_g = Foo.g 15497db96d56Sopenharmony_ci original_foo = Foo.foo 15507db96d56Sopenharmony_ci 15517db96d56Sopenharmony_ci def crasher(): 15527db96d56Sopenharmony_ci raise NameError('crasher') 15537db96d56Sopenharmony_ci 15547db96d56Sopenharmony_ci patcher = patch.object(Foo, 'f', 1) 15557db96d56Sopenharmony_ci patcher.attribute_name = 'f' 15567db96d56Sopenharmony_ci 15577db96d56Sopenharmony_ci good = patch.object(Foo, 'g', 1) 15587db96d56Sopenharmony_ci good.attribute_name = 'g' 15597db96d56Sopenharmony_ci 15607db96d56Sopenharmony_ci bad = patch.object(Foo, 'foo', new_callable=crasher) 15617db96d56Sopenharmony_ci bad.attribute_name = 'foo' 15627db96d56Sopenharmony_ci 15637db96d56Sopenharmony_ci for additionals in [good, bad], [bad, good]: 15647db96d56Sopenharmony_ci patcher.additional_patchers = additionals 15657db96d56Sopenharmony_ci 15667db96d56Sopenharmony_ci @patcher 15677db96d56Sopenharmony_ci def func(): pass 15687db96d56Sopenharmony_ci 15697db96d56Sopenharmony_ci self.assertRaises(NameError, func) 15707db96d56Sopenharmony_ci self.assertEqual(Foo.f, original_f) 15717db96d56Sopenharmony_ci self.assertEqual(Foo.g, original_g) 15727db96d56Sopenharmony_ci self.assertEqual(Foo.foo, original_foo) 15737db96d56Sopenharmony_ci 15747db96d56Sopenharmony_ci 15757db96d56Sopenharmony_ci def test_patch_multiple_string_subclasses(self): 15767db96d56Sopenharmony_ci Foo = type('Foo', (str,), {'fish': 'tasty'}) 15777db96d56Sopenharmony_ci foo = Foo() 15787db96d56Sopenharmony_ci @patch.multiple(foo, fish='nearly gone') 15797db96d56Sopenharmony_ci def test(): 15807db96d56Sopenharmony_ci self.assertEqual(foo.fish, 'nearly gone') 15817db96d56Sopenharmony_ci 15827db96d56Sopenharmony_ci test() 15837db96d56Sopenharmony_ci self.assertEqual(foo.fish, 'tasty') 15847db96d56Sopenharmony_ci 15857db96d56Sopenharmony_ci 15867db96d56Sopenharmony_ci @patch('unittest.mock.patch.TEST_PREFIX', 'foo') 15877db96d56Sopenharmony_ci def test_patch_test_prefix(self): 15887db96d56Sopenharmony_ci class Foo(object): 15897db96d56Sopenharmony_ci thing = 'original' 15907db96d56Sopenharmony_ci 15917db96d56Sopenharmony_ci def foo_one(self): 15927db96d56Sopenharmony_ci return self.thing 15937db96d56Sopenharmony_ci def foo_two(self): 15947db96d56Sopenharmony_ci return self.thing 15957db96d56Sopenharmony_ci def test_one(self): 15967db96d56Sopenharmony_ci return self.thing 15977db96d56Sopenharmony_ci def test_two(self): 15987db96d56Sopenharmony_ci return self.thing 15997db96d56Sopenharmony_ci 16007db96d56Sopenharmony_ci Foo = patch.object(Foo, 'thing', 'changed')(Foo) 16017db96d56Sopenharmony_ci 16027db96d56Sopenharmony_ci foo = Foo() 16037db96d56Sopenharmony_ci self.assertEqual(foo.foo_one(), 'changed') 16047db96d56Sopenharmony_ci self.assertEqual(foo.foo_two(), 'changed') 16057db96d56Sopenharmony_ci self.assertEqual(foo.test_one(), 'original') 16067db96d56Sopenharmony_ci self.assertEqual(foo.test_two(), 'original') 16077db96d56Sopenharmony_ci 16087db96d56Sopenharmony_ci 16097db96d56Sopenharmony_ci @patch('unittest.mock.patch.TEST_PREFIX', 'bar') 16107db96d56Sopenharmony_ci def test_patch_dict_test_prefix(self): 16117db96d56Sopenharmony_ci class Foo(object): 16127db96d56Sopenharmony_ci def bar_one(self): 16137db96d56Sopenharmony_ci return dict(the_dict) 16147db96d56Sopenharmony_ci def bar_two(self): 16157db96d56Sopenharmony_ci return dict(the_dict) 16167db96d56Sopenharmony_ci def test_one(self): 16177db96d56Sopenharmony_ci return dict(the_dict) 16187db96d56Sopenharmony_ci def test_two(self): 16197db96d56Sopenharmony_ci return dict(the_dict) 16207db96d56Sopenharmony_ci 16217db96d56Sopenharmony_ci the_dict = {'key': 'original'} 16227db96d56Sopenharmony_ci Foo = patch.dict(the_dict, key='changed')(Foo) 16237db96d56Sopenharmony_ci 16247db96d56Sopenharmony_ci foo =Foo() 16257db96d56Sopenharmony_ci self.assertEqual(foo.bar_one(), {'key': 'changed'}) 16267db96d56Sopenharmony_ci self.assertEqual(foo.bar_two(), {'key': 'changed'}) 16277db96d56Sopenharmony_ci self.assertEqual(foo.test_one(), {'key': 'original'}) 16287db96d56Sopenharmony_ci self.assertEqual(foo.test_two(), {'key': 'original'}) 16297db96d56Sopenharmony_ci 16307db96d56Sopenharmony_ci 16317db96d56Sopenharmony_ci def test_patch_with_spec_mock_repr(self): 16327db96d56Sopenharmony_ci for arg in ('spec', 'autospec', 'spec_set'): 16337db96d56Sopenharmony_ci p = patch('%s.SomeClass' % __name__, **{arg: True}) 16347db96d56Sopenharmony_ci m = p.start() 16357db96d56Sopenharmony_ci try: 16367db96d56Sopenharmony_ci self.assertIn(" name='SomeClass'", repr(m)) 16377db96d56Sopenharmony_ci self.assertIn(" name='SomeClass.class_attribute'", 16387db96d56Sopenharmony_ci repr(m.class_attribute)) 16397db96d56Sopenharmony_ci self.assertIn(" name='SomeClass()'", repr(m())) 16407db96d56Sopenharmony_ci self.assertIn(" name='SomeClass().class_attribute'", 16417db96d56Sopenharmony_ci repr(m().class_attribute)) 16427db96d56Sopenharmony_ci finally: 16437db96d56Sopenharmony_ci p.stop() 16447db96d56Sopenharmony_ci 16457db96d56Sopenharmony_ci 16467db96d56Sopenharmony_ci def test_patch_nested_autospec_repr(self): 16477db96d56Sopenharmony_ci with patch('unittest.test.testmock.support', autospec=True) as m: 16487db96d56Sopenharmony_ci self.assertIn(" name='support.SomeClass.wibble()'", 16497db96d56Sopenharmony_ci repr(m.SomeClass.wibble())) 16507db96d56Sopenharmony_ci self.assertIn(" name='support.SomeClass().wibble()'", 16517db96d56Sopenharmony_ci repr(m.SomeClass().wibble())) 16527db96d56Sopenharmony_ci 16537db96d56Sopenharmony_ci 16547db96d56Sopenharmony_ci 16557db96d56Sopenharmony_ci def test_mock_calls_with_patch(self): 16567db96d56Sopenharmony_ci for arg in ('spec', 'autospec', 'spec_set'): 16577db96d56Sopenharmony_ci p = patch('%s.SomeClass' % __name__, **{arg: True}) 16587db96d56Sopenharmony_ci m = p.start() 16597db96d56Sopenharmony_ci try: 16607db96d56Sopenharmony_ci m.wibble() 16617db96d56Sopenharmony_ci 16627db96d56Sopenharmony_ci kalls = [call.wibble()] 16637db96d56Sopenharmony_ci self.assertEqual(m.mock_calls, kalls) 16647db96d56Sopenharmony_ci self.assertEqual(m.method_calls, kalls) 16657db96d56Sopenharmony_ci self.assertEqual(m.wibble.mock_calls, [call()]) 16667db96d56Sopenharmony_ci 16677db96d56Sopenharmony_ci result = m() 16687db96d56Sopenharmony_ci kalls.append(call()) 16697db96d56Sopenharmony_ci self.assertEqual(m.mock_calls, kalls) 16707db96d56Sopenharmony_ci 16717db96d56Sopenharmony_ci result.wibble() 16727db96d56Sopenharmony_ci kalls.append(call().wibble()) 16737db96d56Sopenharmony_ci self.assertEqual(m.mock_calls, kalls) 16747db96d56Sopenharmony_ci 16757db96d56Sopenharmony_ci self.assertEqual(result.mock_calls, [call.wibble()]) 16767db96d56Sopenharmony_ci self.assertEqual(result.wibble.mock_calls, [call()]) 16777db96d56Sopenharmony_ci self.assertEqual(result.method_calls, [call.wibble()]) 16787db96d56Sopenharmony_ci finally: 16797db96d56Sopenharmony_ci p.stop() 16807db96d56Sopenharmony_ci 16817db96d56Sopenharmony_ci 16827db96d56Sopenharmony_ci def test_patch_imports_lazily(self): 16837db96d56Sopenharmony_ci p1 = patch('squizz.squozz') 16847db96d56Sopenharmony_ci self.assertRaises(ImportError, p1.start) 16857db96d56Sopenharmony_ci 16867db96d56Sopenharmony_ci with uncache('squizz'): 16877db96d56Sopenharmony_ci squizz = Mock() 16887db96d56Sopenharmony_ci sys.modules['squizz'] = squizz 16897db96d56Sopenharmony_ci 16907db96d56Sopenharmony_ci squizz.squozz = 6 16917db96d56Sopenharmony_ci p1 = patch('squizz.squozz') 16927db96d56Sopenharmony_ci squizz.squozz = 3 16937db96d56Sopenharmony_ci p1.start() 16947db96d56Sopenharmony_ci p1.stop() 16957db96d56Sopenharmony_ci self.assertEqual(squizz.squozz, 3) 16967db96d56Sopenharmony_ci 16977db96d56Sopenharmony_ci def test_patch_propagates_exc_on_exit(self): 16987db96d56Sopenharmony_ci class holder: 16997db96d56Sopenharmony_ci exc_info = None, None, None 17007db96d56Sopenharmony_ci 17017db96d56Sopenharmony_ci class custom_patch(_patch): 17027db96d56Sopenharmony_ci def __exit__(self, etype=None, val=None, tb=None): 17037db96d56Sopenharmony_ci _patch.__exit__(self, etype, val, tb) 17047db96d56Sopenharmony_ci holder.exc_info = etype, val, tb 17057db96d56Sopenharmony_ci stop = __exit__ 17067db96d56Sopenharmony_ci 17077db96d56Sopenharmony_ci def with_custom_patch(target): 17087db96d56Sopenharmony_ci getter, attribute = _get_target(target) 17097db96d56Sopenharmony_ci return custom_patch( 17107db96d56Sopenharmony_ci getter, attribute, DEFAULT, None, False, None, 17117db96d56Sopenharmony_ci None, None, {} 17127db96d56Sopenharmony_ci ) 17137db96d56Sopenharmony_ci 17147db96d56Sopenharmony_ci @with_custom_patch('squizz.squozz') 17157db96d56Sopenharmony_ci def test(mock): 17167db96d56Sopenharmony_ci raise RuntimeError 17177db96d56Sopenharmony_ci 17187db96d56Sopenharmony_ci with uncache('squizz'): 17197db96d56Sopenharmony_ci squizz = Mock() 17207db96d56Sopenharmony_ci sys.modules['squizz'] = squizz 17217db96d56Sopenharmony_ci 17227db96d56Sopenharmony_ci self.assertRaises(RuntimeError, test) 17237db96d56Sopenharmony_ci 17247db96d56Sopenharmony_ci self.assertIs(holder.exc_info[0], RuntimeError) 17257db96d56Sopenharmony_ci self.assertIsNotNone(holder.exc_info[1], 17267db96d56Sopenharmony_ci 'exception value not propagated') 17277db96d56Sopenharmony_ci self.assertIsNotNone(holder.exc_info[2], 17287db96d56Sopenharmony_ci 'exception traceback not propagated') 17297db96d56Sopenharmony_ci 17307db96d56Sopenharmony_ci 17317db96d56Sopenharmony_ci def test_create_and_specs(self): 17327db96d56Sopenharmony_ci for kwarg in ('spec', 'spec_set', 'autospec'): 17337db96d56Sopenharmony_ci p = patch('%s.doesnotexist' % __name__, create=True, 17347db96d56Sopenharmony_ci **{kwarg: True}) 17357db96d56Sopenharmony_ci self.assertRaises(TypeError, p.start) 17367db96d56Sopenharmony_ci self.assertRaises(NameError, lambda: doesnotexist) 17377db96d56Sopenharmony_ci 17387db96d56Sopenharmony_ci # check that spec with create is innocuous if the original exists 17397db96d56Sopenharmony_ci p = patch(MODNAME, create=True, **{kwarg: True}) 17407db96d56Sopenharmony_ci p.start() 17417db96d56Sopenharmony_ci p.stop() 17427db96d56Sopenharmony_ci 17437db96d56Sopenharmony_ci 17447db96d56Sopenharmony_ci def test_multiple_specs(self): 17457db96d56Sopenharmony_ci original = PTModule 17467db96d56Sopenharmony_ci for kwarg in ('spec', 'spec_set'): 17477db96d56Sopenharmony_ci p = patch(MODNAME, autospec=0, **{kwarg: 0}) 17487db96d56Sopenharmony_ci self.assertRaises(TypeError, p.start) 17497db96d56Sopenharmony_ci self.assertIs(PTModule, original) 17507db96d56Sopenharmony_ci 17517db96d56Sopenharmony_ci for kwarg in ('spec', 'autospec'): 17527db96d56Sopenharmony_ci p = patch(MODNAME, spec_set=0, **{kwarg: 0}) 17537db96d56Sopenharmony_ci self.assertRaises(TypeError, p.start) 17547db96d56Sopenharmony_ci self.assertIs(PTModule, original) 17557db96d56Sopenharmony_ci 17567db96d56Sopenharmony_ci for kwarg in ('spec_set', 'autospec'): 17577db96d56Sopenharmony_ci p = patch(MODNAME, spec=0, **{kwarg: 0}) 17587db96d56Sopenharmony_ci self.assertRaises(TypeError, p.start) 17597db96d56Sopenharmony_ci self.assertIs(PTModule, original) 17607db96d56Sopenharmony_ci 17617db96d56Sopenharmony_ci 17627db96d56Sopenharmony_ci def test_specs_false_instead_of_none(self): 17637db96d56Sopenharmony_ci p = patch(MODNAME, spec=False, spec_set=False, autospec=False) 17647db96d56Sopenharmony_ci mock = p.start() 17657db96d56Sopenharmony_ci try: 17667db96d56Sopenharmony_ci # no spec should have been set, so attribute access should not fail 17677db96d56Sopenharmony_ci mock.does_not_exist 17687db96d56Sopenharmony_ci mock.does_not_exist = 3 17697db96d56Sopenharmony_ci finally: 17707db96d56Sopenharmony_ci p.stop() 17717db96d56Sopenharmony_ci 17727db96d56Sopenharmony_ci 17737db96d56Sopenharmony_ci def test_falsey_spec(self): 17747db96d56Sopenharmony_ci for kwarg in ('spec', 'autospec', 'spec_set'): 17757db96d56Sopenharmony_ci p = patch(MODNAME, **{kwarg: 0}) 17767db96d56Sopenharmony_ci m = p.start() 17777db96d56Sopenharmony_ci try: 17787db96d56Sopenharmony_ci self.assertRaises(AttributeError, getattr, m, 'doesnotexit') 17797db96d56Sopenharmony_ci finally: 17807db96d56Sopenharmony_ci p.stop() 17817db96d56Sopenharmony_ci 17827db96d56Sopenharmony_ci 17837db96d56Sopenharmony_ci def test_spec_set_true(self): 17847db96d56Sopenharmony_ci for kwarg in ('spec', 'autospec'): 17857db96d56Sopenharmony_ci p = patch(MODNAME, spec_set=True, **{kwarg: True}) 17867db96d56Sopenharmony_ci m = p.start() 17877db96d56Sopenharmony_ci try: 17887db96d56Sopenharmony_ci self.assertRaises(AttributeError, setattr, m, 17897db96d56Sopenharmony_ci 'doesnotexist', 'something') 17907db96d56Sopenharmony_ci self.assertRaises(AttributeError, getattr, m, 'doesnotexist') 17917db96d56Sopenharmony_ci finally: 17927db96d56Sopenharmony_ci p.stop() 17937db96d56Sopenharmony_ci 17947db96d56Sopenharmony_ci 17957db96d56Sopenharmony_ci def test_callable_spec_as_list(self): 17967db96d56Sopenharmony_ci spec = ('__call__',) 17977db96d56Sopenharmony_ci p = patch(MODNAME, spec=spec) 17987db96d56Sopenharmony_ci m = p.start() 17997db96d56Sopenharmony_ci try: 18007db96d56Sopenharmony_ci self.assertTrue(callable(m)) 18017db96d56Sopenharmony_ci finally: 18027db96d56Sopenharmony_ci p.stop() 18037db96d56Sopenharmony_ci 18047db96d56Sopenharmony_ci 18057db96d56Sopenharmony_ci def test_not_callable_spec_as_list(self): 18067db96d56Sopenharmony_ci spec = ('foo', 'bar') 18077db96d56Sopenharmony_ci p = patch(MODNAME, spec=spec) 18087db96d56Sopenharmony_ci m = p.start() 18097db96d56Sopenharmony_ci try: 18107db96d56Sopenharmony_ci self.assertFalse(callable(m)) 18117db96d56Sopenharmony_ci finally: 18127db96d56Sopenharmony_ci p.stop() 18137db96d56Sopenharmony_ci 18147db96d56Sopenharmony_ci 18157db96d56Sopenharmony_ci def test_patch_stopall(self): 18167db96d56Sopenharmony_ci unlink = os.unlink 18177db96d56Sopenharmony_ci chdir = os.chdir 18187db96d56Sopenharmony_ci path = os.path 18197db96d56Sopenharmony_ci patch('os.unlink', something).start() 18207db96d56Sopenharmony_ci patch('os.chdir', something_else).start() 18217db96d56Sopenharmony_ci 18227db96d56Sopenharmony_ci @patch('os.path') 18237db96d56Sopenharmony_ci def patched(mock_path): 18247db96d56Sopenharmony_ci patch.stopall() 18257db96d56Sopenharmony_ci self.assertIs(os.path, mock_path) 18267db96d56Sopenharmony_ci self.assertIs(os.unlink, unlink) 18277db96d56Sopenharmony_ci self.assertIs(os.chdir, chdir) 18287db96d56Sopenharmony_ci 18297db96d56Sopenharmony_ci patched() 18307db96d56Sopenharmony_ci self.assertIs(os.path, path) 18317db96d56Sopenharmony_ci 18327db96d56Sopenharmony_ci def test_stopall_lifo(self): 18337db96d56Sopenharmony_ci stopped = [] 18347db96d56Sopenharmony_ci class thing(object): 18357db96d56Sopenharmony_ci one = two = three = None 18367db96d56Sopenharmony_ci 18377db96d56Sopenharmony_ci def get_patch(attribute): 18387db96d56Sopenharmony_ci class mypatch(_patch): 18397db96d56Sopenharmony_ci def stop(self): 18407db96d56Sopenharmony_ci stopped.append(attribute) 18417db96d56Sopenharmony_ci return super(mypatch, self).stop() 18427db96d56Sopenharmony_ci return mypatch(lambda: thing, attribute, None, None, 18437db96d56Sopenharmony_ci False, None, None, None, {}) 18447db96d56Sopenharmony_ci [get_patch(val).start() for val in ("one", "two", "three")] 18457db96d56Sopenharmony_ci patch.stopall() 18467db96d56Sopenharmony_ci 18477db96d56Sopenharmony_ci self.assertEqual(stopped, ["three", "two", "one"]) 18487db96d56Sopenharmony_ci 18497db96d56Sopenharmony_ci def test_patch_dict_stopall(self): 18507db96d56Sopenharmony_ci dic1 = {} 18517db96d56Sopenharmony_ci dic2 = {1: 'a'} 18527db96d56Sopenharmony_ci dic3 = {1: 'A', 2: 'B'} 18537db96d56Sopenharmony_ci origdic1 = dic1.copy() 18547db96d56Sopenharmony_ci origdic2 = dic2.copy() 18557db96d56Sopenharmony_ci origdic3 = dic3.copy() 18567db96d56Sopenharmony_ci patch.dict(dic1, {1: 'I', 2: 'II'}).start() 18577db96d56Sopenharmony_ci patch.dict(dic2, {2: 'b'}).start() 18587db96d56Sopenharmony_ci 18597db96d56Sopenharmony_ci @patch.dict(dic3) 18607db96d56Sopenharmony_ci def patched(): 18617db96d56Sopenharmony_ci del dic3[1] 18627db96d56Sopenharmony_ci 18637db96d56Sopenharmony_ci patched() 18647db96d56Sopenharmony_ci self.assertNotEqual(dic1, origdic1) 18657db96d56Sopenharmony_ci self.assertNotEqual(dic2, origdic2) 18667db96d56Sopenharmony_ci self.assertEqual(dic3, origdic3) 18677db96d56Sopenharmony_ci 18687db96d56Sopenharmony_ci patch.stopall() 18697db96d56Sopenharmony_ci 18707db96d56Sopenharmony_ci self.assertEqual(dic1, origdic1) 18717db96d56Sopenharmony_ci self.assertEqual(dic2, origdic2) 18727db96d56Sopenharmony_ci self.assertEqual(dic3, origdic3) 18737db96d56Sopenharmony_ci 18747db96d56Sopenharmony_ci 18757db96d56Sopenharmony_ci def test_patch_and_patch_dict_stopall(self): 18767db96d56Sopenharmony_ci original_unlink = os.unlink 18777db96d56Sopenharmony_ci original_chdir = os.chdir 18787db96d56Sopenharmony_ci dic1 = {} 18797db96d56Sopenharmony_ci dic2 = {1: 'A', 2: 'B'} 18807db96d56Sopenharmony_ci origdic1 = dic1.copy() 18817db96d56Sopenharmony_ci origdic2 = dic2.copy() 18827db96d56Sopenharmony_ci 18837db96d56Sopenharmony_ci patch('os.unlink', something).start() 18847db96d56Sopenharmony_ci patch('os.chdir', something_else).start() 18857db96d56Sopenharmony_ci patch.dict(dic1, {1: 'I', 2: 'II'}).start() 18867db96d56Sopenharmony_ci patch.dict(dic2).start() 18877db96d56Sopenharmony_ci del dic2[1] 18887db96d56Sopenharmony_ci 18897db96d56Sopenharmony_ci self.assertIsNot(os.unlink, original_unlink) 18907db96d56Sopenharmony_ci self.assertIsNot(os.chdir, original_chdir) 18917db96d56Sopenharmony_ci self.assertNotEqual(dic1, origdic1) 18927db96d56Sopenharmony_ci self.assertNotEqual(dic2, origdic2) 18937db96d56Sopenharmony_ci patch.stopall() 18947db96d56Sopenharmony_ci self.assertIs(os.unlink, original_unlink) 18957db96d56Sopenharmony_ci self.assertIs(os.chdir, original_chdir) 18967db96d56Sopenharmony_ci self.assertEqual(dic1, origdic1) 18977db96d56Sopenharmony_ci self.assertEqual(dic2, origdic2) 18987db96d56Sopenharmony_ci 18997db96d56Sopenharmony_ci 19007db96d56Sopenharmony_ci def test_special_attrs(self): 19017db96d56Sopenharmony_ci def foo(x=0): 19027db96d56Sopenharmony_ci """TEST""" 19037db96d56Sopenharmony_ci return x 19047db96d56Sopenharmony_ci with patch.object(foo, '__defaults__', (1, )): 19057db96d56Sopenharmony_ci self.assertEqual(foo(), 1) 19067db96d56Sopenharmony_ci self.assertEqual(foo(), 0) 19077db96d56Sopenharmony_ci 19087db96d56Sopenharmony_ci orig_doc = foo.__doc__ 19097db96d56Sopenharmony_ci with patch.object(foo, '__doc__', "FUN"): 19107db96d56Sopenharmony_ci self.assertEqual(foo.__doc__, "FUN") 19117db96d56Sopenharmony_ci self.assertEqual(foo.__doc__, orig_doc) 19127db96d56Sopenharmony_ci 19137db96d56Sopenharmony_ci with patch.object(foo, '__module__', "testpatch2"): 19147db96d56Sopenharmony_ci self.assertEqual(foo.__module__, "testpatch2") 19157db96d56Sopenharmony_ci self.assertEqual(foo.__module__, 'unittest.test.testmock.testpatch') 19167db96d56Sopenharmony_ci 19177db96d56Sopenharmony_ci with patch.object(foo, '__annotations__', dict([('s', 1, )])): 19187db96d56Sopenharmony_ci self.assertEqual(foo.__annotations__, dict([('s', 1, )])) 19197db96d56Sopenharmony_ci self.assertEqual(foo.__annotations__, dict()) 19207db96d56Sopenharmony_ci 19217db96d56Sopenharmony_ci def foo(*a, x=0): 19227db96d56Sopenharmony_ci return x 19237db96d56Sopenharmony_ci with patch.object(foo, '__kwdefaults__', dict([('x', 1, )])): 19247db96d56Sopenharmony_ci self.assertEqual(foo(), 1) 19257db96d56Sopenharmony_ci self.assertEqual(foo(), 0) 19267db96d56Sopenharmony_ci 19277db96d56Sopenharmony_ci def test_patch_orderdict(self): 19287db96d56Sopenharmony_ci foo = OrderedDict() 19297db96d56Sopenharmony_ci foo['a'] = object() 19307db96d56Sopenharmony_ci foo['b'] = 'python' 19317db96d56Sopenharmony_ci 19327db96d56Sopenharmony_ci original = foo.copy() 19337db96d56Sopenharmony_ci update_values = list(zip('cdefghijklmnopqrstuvwxyz', range(26))) 19347db96d56Sopenharmony_ci patched_values = list(foo.items()) + update_values 19357db96d56Sopenharmony_ci 19367db96d56Sopenharmony_ci with patch.dict(foo, OrderedDict(update_values)): 19377db96d56Sopenharmony_ci self.assertEqual(list(foo.items()), patched_values) 19387db96d56Sopenharmony_ci 19397db96d56Sopenharmony_ci self.assertEqual(foo, original) 19407db96d56Sopenharmony_ci 19417db96d56Sopenharmony_ci with patch.dict(foo, update_values): 19427db96d56Sopenharmony_ci self.assertEqual(list(foo.items()), patched_values) 19437db96d56Sopenharmony_ci 19447db96d56Sopenharmony_ci self.assertEqual(foo, original) 19457db96d56Sopenharmony_ci 19467db96d56Sopenharmony_ci def test_dotted_but_module_not_loaded(self): 19477db96d56Sopenharmony_ci # This exercises the AttributeError branch of _dot_lookup. 19487db96d56Sopenharmony_ci 19497db96d56Sopenharmony_ci # make sure it's there 19507db96d56Sopenharmony_ci import unittest.test.testmock.support 19517db96d56Sopenharmony_ci # now make sure it's not: 19527db96d56Sopenharmony_ci with patch.dict('sys.modules'): 19537db96d56Sopenharmony_ci del sys.modules['unittest.test.testmock.support'] 19547db96d56Sopenharmony_ci del sys.modules['unittest.test.testmock'] 19557db96d56Sopenharmony_ci del sys.modules['unittest.test'] 19567db96d56Sopenharmony_ci del sys.modules['unittest'] 19577db96d56Sopenharmony_ci 19587db96d56Sopenharmony_ci # now make sure we can patch based on a dotted path: 19597db96d56Sopenharmony_ci @patch('unittest.test.testmock.support.X') 19607db96d56Sopenharmony_ci def test(mock): 19617db96d56Sopenharmony_ci pass 19627db96d56Sopenharmony_ci test() 19637db96d56Sopenharmony_ci 19647db96d56Sopenharmony_ci 19657db96d56Sopenharmony_ci def test_invalid_target(self): 19667db96d56Sopenharmony_ci class Foo: 19677db96d56Sopenharmony_ci pass 19687db96d56Sopenharmony_ci 19697db96d56Sopenharmony_ci for target in ['', 12, Foo()]: 19707db96d56Sopenharmony_ci with self.subTest(target=target): 19717db96d56Sopenharmony_ci with self.assertRaises(TypeError): 19727db96d56Sopenharmony_ci patch(target) 19737db96d56Sopenharmony_ci 19747db96d56Sopenharmony_ci 19757db96d56Sopenharmony_ci def test_cant_set_kwargs_when_passing_a_mock(self): 19767db96d56Sopenharmony_ci @patch('unittest.test.testmock.support.X', new=object(), x=1) 19777db96d56Sopenharmony_ci def test(): pass 19787db96d56Sopenharmony_ci with self.assertRaises(TypeError): 19797db96d56Sopenharmony_ci test() 19807db96d56Sopenharmony_ci 19817db96d56Sopenharmony_ci 19827db96d56Sopenharmony_ciif __name__ == '__main__': 19837db96d56Sopenharmony_ci unittest.main() 1984