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