17db96d56Sopenharmony_ciimport unittest
27db96d56Sopenharmony_cifrom warnings import catch_warnings
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_cifrom unittest.test.testmock.support import is_instance
57db96d56Sopenharmony_cifrom unittest.mock import MagicMock, Mock, patch, sentinel, mock_open, call
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_cisomething  = sentinel.Something
107db96d56Sopenharmony_cisomething_else  = sentinel.SomethingElse
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ciclass SampleException(Exception): pass
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciclass WithTest(unittest.TestCase):
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci    def test_with_statement(self):
197db96d56Sopenharmony_ci        with patch('%s.something' % __name__, sentinel.Something2):
207db96d56Sopenharmony_ci            self.assertEqual(something, sentinel.Something2, "unpatched")
217db96d56Sopenharmony_ci        self.assertEqual(something, sentinel.Something)
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci    def test_with_statement_exception(self):
257db96d56Sopenharmony_ci        with self.assertRaises(SampleException):
267db96d56Sopenharmony_ci            with patch('%s.something' % __name__, sentinel.Something2):
277db96d56Sopenharmony_ci                self.assertEqual(something, sentinel.Something2, "unpatched")
287db96d56Sopenharmony_ci                raise SampleException()
297db96d56Sopenharmony_ci        self.assertEqual(something, sentinel.Something)
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci    def test_with_statement_as(self):
337db96d56Sopenharmony_ci        with patch('%s.something' % __name__) as mock_something:
347db96d56Sopenharmony_ci            self.assertEqual(something, mock_something, "unpatched")
357db96d56Sopenharmony_ci            self.assertTrue(is_instance(mock_something, MagicMock),
367db96d56Sopenharmony_ci                            "patching wrong type")
377db96d56Sopenharmony_ci        self.assertEqual(something, sentinel.Something)
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci    def test_patch_object_with_statement(self):
417db96d56Sopenharmony_ci        class Foo(object):
427db96d56Sopenharmony_ci            something = 'foo'
437db96d56Sopenharmony_ci        original = Foo.something
447db96d56Sopenharmony_ci        with patch.object(Foo, 'something'):
457db96d56Sopenharmony_ci            self.assertNotEqual(Foo.something, original, "unpatched")
467db96d56Sopenharmony_ci        self.assertEqual(Foo.something, original)
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci    def test_with_statement_nested(self):
507db96d56Sopenharmony_ci        with catch_warnings(record=True):
517db96d56Sopenharmony_ci            with patch('%s.something' % __name__) as mock_something, patch('%s.something_else' % __name__) as mock_something_else:
527db96d56Sopenharmony_ci                self.assertEqual(something, mock_something, "unpatched")
537db96d56Sopenharmony_ci                self.assertEqual(something_else, mock_something_else,
547db96d56Sopenharmony_ci                                 "unpatched")
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci        self.assertEqual(something, sentinel.Something)
577db96d56Sopenharmony_ci        self.assertEqual(something_else, sentinel.SomethingElse)
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci    def test_with_statement_specified(self):
617db96d56Sopenharmony_ci        with patch('%s.something' % __name__, sentinel.Patched) as mock_something:
627db96d56Sopenharmony_ci            self.assertEqual(something, mock_something, "unpatched")
637db96d56Sopenharmony_ci            self.assertEqual(mock_something, sentinel.Patched, "wrong patch")
647db96d56Sopenharmony_ci        self.assertEqual(something, sentinel.Something)
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci    def testContextManagerMocking(self):
687db96d56Sopenharmony_ci        mock = Mock()
697db96d56Sopenharmony_ci        mock.__enter__ = Mock()
707db96d56Sopenharmony_ci        mock.__exit__ = Mock()
717db96d56Sopenharmony_ci        mock.__exit__.return_value = False
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci        with mock as m:
747db96d56Sopenharmony_ci            self.assertEqual(m, mock.__enter__.return_value)
757db96d56Sopenharmony_ci        mock.__enter__.assert_called_with()
767db96d56Sopenharmony_ci        mock.__exit__.assert_called_with(None, None, None)
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci    def test_context_manager_with_magic_mock(self):
807db96d56Sopenharmony_ci        mock = MagicMock()
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
837db96d56Sopenharmony_ci            with mock:
847db96d56Sopenharmony_ci                'foo' + 3
857db96d56Sopenharmony_ci        mock.__enter__.assert_called_with()
867db96d56Sopenharmony_ci        self.assertTrue(mock.__exit__.called)
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci    def test_with_statement_same_attribute(self):
907db96d56Sopenharmony_ci        with patch('%s.something' % __name__, sentinel.Patched) as mock_something:
917db96d56Sopenharmony_ci            self.assertEqual(something, mock_something, "unpatched")
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci            with patch('%s.something' % __name__) as mock_again:
947db96d56Sopenharmony_ci                self.assertEqual(something, mock_again, "unpatched")
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci            self.assertEqual(something, mock_something,
977db96d56Sopenharmony_ci                             "restored with wrong instance")
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci        self.assertEqual(something, sentinel.Something, "not restored")
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci    def test_with_statement_imbricated(self):
1037db96d56Sopenharmony_ci        with patch('%s.something' % __name__) as mock_something:
1047db96d56Sopenharmony_ci            self.assertEqual(something, mock_something, "unpatched")
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci            with patch('%s.something_else' % __name__) as mock_something_else:
1077db96d56Sopenharmony_ci                self.assertEqual(something_else, mock_something_else,
1087db96d56Sopenharmony_ci                                 "unpatched")
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci        self.assertEqual(something, sentinel.Something)
1117db96d56Sopenharmony_ci        self.assertEqual(something_else, sentinel.SomethingElse)
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci    def test_dict_context_manager(self):
1157db96d56Sopenharmony_ci        foo = {}
1167db96d56Sopenharmony_ci        with patch.dict(foo, {'a': 'b'}):
1177db96d56Sopenharmony_ci            self.assertEqual(foo, {'a': 'b'})
1187db96d56Sopenharmony_ci        self.assertEqual(foo, {})
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci        with self.assertRaises(NameError):
1217db96d56Sopenharmony_ci            with patch.dict(foo, {'a': 'b'}):
1227db96d56Sopenharmony_ci                self.assertEqual(foo, {'a': 'b'})
1237db96d56Sopenharmony_ci                raise NameError('Konrad')
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci        self.assertEqual(foo, {})
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ci    def test_double_patch_instance_method(self):
1287db96d56Sopenharmony_ci        class C:
1297db96d56Sopenharmony_ci            def f(self): pass
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci        c = C()
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci        with patch.object(c, 'f') as patch1:
1347db96d56Sopenharmony_ci            with patch.object(c, 'f') as patch2:
1357db96d56Sopenharmony_ci                c.f()
1367db96d56Sopenharmony_ci            self.assertEqual(patch2.call_count, 1)
1377db96d56Sopenharmony_ci            self.assertEqual(patch1.call_count, 0)
1387db96d56Sopenharmony_ci            c.f()
1397db96d56Sopenharmony_ci        self.assertEqual(patch1.call_count, 1)
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ciclass TestMockOpen(unittest.TestCase):
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci    def test_mock_open(self):
1457db96d56Sopenharmony_ci        mock = mock_open()
1467db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True) as patched:
1477db96d56Sopenharmony_ci            self.assertIs(patched, mock)
1487db96d56Sopenharmony_ci            open('foo')
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci        mock.assert_called_once_with('foo')
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci    def test_mock_open_context_manager(self):
1547db96d56Sopenharmony_ci        mock = mock_open()
1557db96d56Sopenharmony_ci        handle = mock.return_value
1567db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True):
1577db96d56Sopenharmony_ci            with open('foo') as f:
1587db96d56Sopenharmony_ci                f.read()
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci        expected_calls = [call('foo'), call().__enter__(), call().read(),
1617db96d56Sopenharmony_ci                          call().__exit__(None, None, None)]
1627db96d56Sopenharmony_ci        self.assertEqual(mock.mock_calls, expected_calls)
1637db96d56Sopenharmony_ci        self.assertIs(f, handle)
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci    def test_mock_open_context_manager_multiple_times(self):
1667db96d56Sopenharmony_ci        mock = mock_open()
1677db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True):
1687db96d56Sopenharmony_ci            with open('foo') as f:
1697db96d56Sopenharmony_ci                f.read()
1707db96d56Sopenharmony_ci            with open('bar') as f:
1717db96d56Sopenharmony_ci                f.read()
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci        expected_calls = [
1747db96d56Sopenharmony_ci            call('foo'), call().__enter__(), call().read(),
1757db96d56Sopenharmony_ci            call().__exit__(None, None, None),
1767db96d56Sopenharmony_ci            call('bar'), call().__enter__(), call().read(),
1777db96d56Sopenharmony_ci            call().__exit__(None, None, None)]
1787db96d56Sopenharmony_ci        self.assertEqual(mock.mock_calls, expected_calls)
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci    def test_explicit_mock(self):
1817db96d56Sopenharmony_ci        mock = MagicMock()
1827db96d56Sopenharmony_ci        mock_open(mock)
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True) as patched:
1857db96d56Sopenharmony_ci            self.assertIs(patched, mock)
1867db96d56Sopenharmony_ci            open('foo')
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci        mock.assert_called_once_with('foo')
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci
1917db96d56Sopenharmony_ci    def test_read_data(self):
1927db96d56Sopenharmony_ci        mock = mock_open(read_data='foo')
1937db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True):
1947db96d56Sopenharmony_ci            h = open('bar')
1957db96d56Sopenharmony_ci            result = h.read()
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci        self.assertEqual(result, 'foo')
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci    def test_readline_data(self):
2017db96d56Sopenharmony_ci        # Check that readline will return all the lines from the fake file
2027db96d56Sopenharmony_ci        # And that once fully consumed, readline will return an empty string.
2037db96d56Sopenharmony_ci        mock = mock_open(read_data='foo\nbar\nbaz\n')
2047db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True):
2057db96d56Sopenharmony_ci            h = open('bar')
2067db96d56Sopenharmony_ci            line1 = h.readline()
2077db96d56Sopenharmony_ci            line2 = h.readline()
2087db96d56Sopenharmony_ci            line3 = h.readline()
2097db96d56Sopenharmony_ci        self.assertEqual(line1, 'foo\n')
2107db96d56Sopenharmony_ci        self.assertEqual(line2, 'bar\n')
2117db96d56Sopenharmony_ci        self.assertEqual(line3, 'baz\n')
2127db96d56Sopenharmony_ci        self.assertEqual(h.readline(), '')
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci        # Check that we properly emulate a file that doesn't end in a newline
2157db96d56Sopenharmony_ci        mock = mock_open(read_data='foo')
2167db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True):
2177db96d56Sopenharmony_ci            h = open('bar')
2187db96d56Sopenharmony_ci            result = h.readline()
2197db96d56Sopenharmony_ci        self.assertEqual(result, 'foo')
2207db96d56Sopenharmony_ci        self.assertEqual(h.readline(), '')
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci
2237db96d56Sopenharmony_ci    def test_dunder_iter_data(self):
2247db96d56Sopenharmony_ci        # Check that dunder_iter will return all the lines from the fake file.
2257db96d56Sopenharmony_ci        mock = mock_open(read_data='foo\nbar\nbaz\n')
2267db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True):
2277db96d56Sopenharmony_ci            h = open('bar')
2287db96d56Sopenharmony_ci            lines = [l for l in h]
2297db96d56Sopenharmony_ci        self.assertEqual(lines[0], 'foo\n')
2307db96d56Sopenharmony_ci        self.assertEqual(lines[1], 'bar\n')
2317db96d56Sopenharmony_ci        self.assertEqual(lines[2], 'baz\n')
2327db96d56Sopenharmony_ci        self.assertEqual(h.readline(), '')
2337db96d56Sopenharmony_ci        with self.assertRaises(StopIteration):
2347db96d56Sopenharmony_ci            next(h)
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci    def test_next_data(self):
2377db96d56Sopenharmony_ci        # Check that next will correctly return the next available
2387db96d56Sopenharmony_ci        # line and plays well with the dunder_iter part.
2397db96d56Sopenharmony_ci        mock = mock_open(read_data='foo\nbar\nbaz\n')
2407db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True):
2417db96d56Sopenharmony_ci            h = open('bar')
2427db96d56Sopenharmony_ci            line1 = next(h)
2437db96d56Sopenharmony_ci            line2 = next(h)
2447db96d56Sopenharmony_ci            lines = [l for l in h]
2457db96d56Sopenharmony_ci        self.assertEqual(line1, 'foo\n')
2467db96d56Sopenharmony_ci        self.assertEqual(line2, 'bar\n')
2477db96d56Sopenharmony_ci        self.assertEqual(lines[0], 'baz\n')
2487db96d56Sopenharmony_ci        self.assertEqual(h.readline(), '')
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ci    def test_readlines_data(self):
2517db96d56Sopenharmony_ci        # Test that emulating a file that ends in a newline character works
2527db96d56Sopenharmony_ci        mock = mock_open(read_data='foo\nbar\nbaz\n')
2537db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True):
2547db96d56Sopenharmony_ci            h = open('bar')
2557db96d56Sopenharmony_ci            result = h.readlines()
2567db96d56Sopenharmony_ci        self.assertEqual(result, ['foo\n', 'bar\n', 'baz\n'])
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci        # Test that files without a final newline will also be correctly
2597db96d56Sopenharmony_ci        # emulated
2607db96d56Sopenharmony_ci        mock = mock_open(read_data='foo\nbar\nbaz')
2617db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True):
2627db96d56Sopenharmony_ci            h = open('bar')
2637db96d56Sopenharmony_ci            result = h.readlines()
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci        self.assertEqual(result, ['foo\n', 'bar\n', 'baz'])
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci    def test_read_bytes(self):
2697db96d56Sopenharmony_ci        mock = mock_open(read_data=b'\xc6')
2707db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True):
2717db96d56Sopenharmony_ci            with open('abc', 'rb') as f:
2727db96d56Sopenharmony_ci                result = f.read()
2737db96d56Sopenharmony_ci        self.assertEqual(result, b'\xc6')
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ci    def test_readline_bytes(self):
2777db96d56Sopenharmony_ci        m = mock_open(read_data=b'abc\ndef\nghi\n')
2787db96d56Sopenharmony_ci        with patch('%s.open' % __name__, m, create=True):
2797db96d56Sopenharmony_ci            with open('abc', 'rb') as f:
2807db96d56Sopenharmony_ci                line1 = f.readline()
2817db96d56Sopenharmony_ci                line2 = f.readline()
2827db96d56Sopenharmony_ci                line3 = f.readline()
2837db96d56Sopenharmony_ci        self.assertEqual(line1, b'abc\n')
2847db96d56Sopenharmony_ci        self.assertEqual(line2, b'def\n')
2857db96d56Sopenharmony_ci        self.assertEqual(line3, b'ghi\n')
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci    def test_readlines_bytes(self):
2897db96d56Sopenharmony_ci        m = mock_open(read_data=b'abc\ndef\nghi\n')
2907db96d56Sopenharmony_ci        with patch('%s.open' % __name__, m, create=True):
2917db96d56Sopenharmony_ci            with open('abc', 'rb') as f:
2927db96d56Sopenharmony_ci                result = f.readlines()
2937db96d56Sopenharmony_ci        self.assertEqual(result, [b'abc\n', b'def\n', b'ghi\n'])
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci    def test_mock_open_read_with_argument(self):
2977db96d56Sopenharmony_ci        # At one point calling read with an argument was broken
2987db96d56Sopenharmony_ci        # for mocks returned by mock_open
2997db96d56Sopenharmony_ci        some_data = 'foo\nbar\nbaz'
3007db96d56Sopenharmony_ci        mock = mock_open(read_data=some_data)
3017db96d56Sopenharmony_ci        self.assertEqual(mock().read(10), some_data[:10])
3027db96d56Sopenharmony_ci        self.assertEqual(mock().read(10), some_data[:10])
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci        f = mock()
3057db96d56Sopenharmony_ci        self.assertEqual(f.read(10), some_data[:10])
3067db96d56Sopenharmony_ci        self.assertEqual(f.read(10), some_data[10:])
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci
3097db96d56Sopenharmony_ci    def test_interleaved_reads(self):
3107db96d56Sopenharmony_ci        # Test that calling read, readline, and readlines pulls data
3117db96d56Sopenharmony_ci        # sequentially from the data we preload with
3127db96d56Sopenharmony_ci        mock = mock_open(read_data='foo\nbar\nbaz\n')
3137db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True):
3147db96d56Sopenharmony_ci            h = open('bar')
3157db96d56Sopenharmony_ci            line1 = h.readline()
3167db96d56Sopenharmony_ci            rest = h.readlines()
3177db96d56Sopenharmony_ci        self.assertEqual(line1, 'foo\n')
3187db96d56Sopenharmony_ci        self.assertEqual(rest, ['bar\n', 'baz\n'])
3197db96d56Sopenharmony_ci
3207db96d56Sopenharmony_ci        mock = mock_open(read_data='foo\nbar\nbaz\n')
3217db96d56Sopenharmony_ci        with patch('%s.open' % __name__, mock, create=True):
3227db96d56Sopenharmony_ci            h = open('bar')
3237db96d56Sopenharmony_ci            line1 = h.readline()
3247db96d56Sopenharmony_ci            rest = h.read()
3257db96d56Sopenharmony_ci        self.assertEqual(line1, 'foo\n')
3267db96d56Sopenharmony_ci        self.assertEqual(rest, 'bar\nbaz\n')
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci    def test_overriding_return_values(self):
3307db96d56Sopenharmony_ci        mock = mock_open(read_data='foo')
3317db96d56Sopenharmony_ci        handle = mock()
3327db96d56Sopenharmony_ci
3337db96d56Sopenharmony_ci        handle.read.return_value = 'bar'
3347db96d56Sopenharmony_ci        handle.readline.return_value = 'bar'
3357db96d56Sopenharmony_ci        handle.readlines.return_value = ['bar']
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ci        self.assertEqual(handle.read(), 'bar')
3387db96d56Sopenharmony_ci        self.assertEqual(handle.readline(), 'bar')
3397db96d56Sopenharmony_ci        self.assertEqual(handle.readlines(), ['bar'])
3407db96d56Sopenharmony_ci
3417db96d56Sopenharmony_ci        # call repeatedly to check that a StopIteration is not propagated
3427db96d56Sopenharmony_ci        self.assertEqual(handle.readline(), 'bar')
3437db96d56Sopenharmony_ci        self.assertEqual(handle.readline(), 'bar')
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ciif __name__ == '__main__':
3477db96d56Sopenharmony_ci    unittest.main()
348