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