michael@0: # Copyright (C) 2007-2012 Michael Foord & the mock team michael@0: # E-mail: fuzzyman AT voidspace DOT org DOT uk michael@0: # http://www.voidspace.org.uk/python/mock/ michael@0: michael@0: from __future__ import with_statement michael@0: michael@0: from tests.support import unittest2, is_instance michael@0: michael@0: from mock import MagicMock, Mock, patch, sentinel, mock_open, call michael@0: michael@0: from tests.support_with import catch_warnings, nested michael@0: michael@0: something = sentinel.Something michael@0: something_else = sentinel.SomethingElse michael@0: michael@0: michael@0: michael@0: class WithTest(unittest2.TestCase): michael@0: michael@0: def test_with_statement(self): michael@0: with patch('tests._testwith.something', sentinel.Something2): michael@0: self.assertEqual(something, sentinel.Something2, "unpatched") michael@0: self.assertEqual(something, sentinel.Something) michael@0: michael@0: michael@0: def test_with_statement_exception(self): michael@0: try: michael@0: with patch('tests._testwith.something', sentinel.Something2): michael@0: self.assertEqual(something, sentinel.Something2, "unpatched") michael@0: raise Exception('pow') michael@0: except Exception: michael@0: pass michael@0: else: michael@0: self.fail("patch swallowed exception") michael@0: self.assertEqual(something, sentinel.Something) michael@0: michael@0: michael@0: def test_with_statement_as(self): michael@0: with patch('tests._testwith.something') as mock_something: michael@0: self.assertEqual(something, mock_something, "unpatched") michael@0: self.assertTrue(is_instance(mock_something, MagicMock), michael@0: "patching wrong type") michael@0: self.assertEqual(something, sentinel.Something) michael@0: michael@0: michael@0: def test_patch_object_with_statement(self): michael@0: class Foo(object): michael@0: something = 'foo' michael@0: original = Foo.something michael@0: with patch.object(Foo, 'something'): michael@0: self.assertNotEqual(Foo.something, original, "unpatched") michael@0: self.assertEqual(Foo.something, original) michael@0: michael@0: michael@0: def test_with_statement_nested(self): michael@0: with catch_warnings(record=True): michael@0: # nested is deprecated in Python 2.7 michael@0: with nested(patch('tests._testwith.something'), michael@0: patch('tests._testwith.something_else')) as (mock_something, mock_something_else): michael@0: self.assertEqual(something, mock_something, "unpatched") michael@0: self.assertEqual(something_else, mock_something_else, michael@0: "unpatched") michael@0: self.assertEqual(something, sentinel.Something) michael@0: self.assertEqual(something_else, sentinel.SomethingElse) michael@0: michael@0: michael@0: def test_with_statement_specified(self): michael@0: with patch('tests._testwith.something', sentinel.Patched) as mock_something: michael@0: self.assertEqual(something, mock_something, "unpatched") michael@0: self.assertEqual(mock_something, sentinel.Patched, "wrong patch") michael@0: self.assertEqual(something, sentinel.Something) michael@0: michael@0: michael@0: def testContextManagerMocking(self): michael@0: mock = Mock() michael@0: mock.__enter__ = Mock() michael@0: mock.__exit__ = Mock() michael@0: mock.__exit__.return_value = False michael@0: michael@0: with mock as m: michael@0: self.assertEqual(m, mock.__enter__.return_value) michael@0: mock.__enter__.assert_called_with() michael@0: mock.__exit__.assert_called_with(None, None, None) michael@0: michael@0: michael@0: def test_context_manager_with_magic_mock(self): michael@0: mock = MagicMock() michael@0: michael@0: with self.assertRaises(TypeError): michael@0: with mock: michael@0: 'foo' + 3 michael@0: mock.__enter__.assert_called_with() michael@0: self.assertTrue(mock.__exit__.called) michael@0: michael@0: michael@0: def test_with_statement_same_attribute(self): michael@0: with patch('tests._testwith.something', sentinel.Patched) as mock_something: michael@0: self.assertEqual(something, mock_something, "unpatched") michael@0: michael@0: with patch('tests._testwith.something') as mock_again: michael@0: self.assertEqual(something, mock_again, "unpatched") michael@0: michael@0: self.assertEqual(something, mock_something, michael@0: "restored with wrong instance") michael@0: michael@0: self.assertEqual(something, sentinel.Something, "not restored") michael@0: michael@0: michael@0: def test_with_statement_imbricated(self): michael@0: with patch('tests._testwith.something') as mock_something: michael@0: self.assertEqual(something, mock_something, "unpatched") michael@0: michael@0: with patch('tests._testwith.something_else') as mock_something_else: michael@0: self.assertEqual(something_else, mock_something_else, michael@0: "unpatched") michael@0: michael@0: self.assertEqual(something, sentinel.Something) michael@0: self.assertEqual(something_else, sentinel.SomethingElse) michael@0: michael@0: michael@0: def test_dict_context_manager(self): michael@0: foo = {} michael@0: with patch.dict(foo, {'a': 'b'}): michael@0: self.assertEqual(foo, {'a': 'b'}) michael@0: self.assertEqual(foo, {}) michael@0: michael@0: with self.assertRaises(NameError): michael@0: with patch.dict(foo, {'a': 'b'}): michael@0: self.assertEqual(foo, {'a': 'b'}) michael@0: raise NameError('Konrad') michael@0: michael@0: self.assertEqual(foo, {}) michael@0: michael@0: michael@0: michael@0: class TestMockOpen(unittest2.TestCase): michael@0: michael@0: def test_mock_open(self): michael@0: mock = mock_open() michael@0: with patch('%s.open' % __name__, mock, create=True) as patched: michael@0: self.assertIs(patched, mock) michael@0: open('foo') michael@0: michael@0: mock.assert_called_once_with('foo') michael@0: michael@0: michael@0: def test_mock_open_context_manager(self): michael@0: mock = mock_open() michael@0: handle = mock.return_value michael@0: with patch('%s.open' % __name__, mock, create=True): michael@0: with open('foo') as f: michael@0: f.read() michael@0: michael@0: expected_calls = [call('foo'), call().__enter__(), call().read(), michael@0: call().__exit__(None, None, None)] michael@0: self.assertEqual(mock.mock_calls, expected_calls) michael@0: self.assertIs(f, handle) michael@0: michael@0: michael@0: def test_explicit_mock(self): michael@0: mock = MagicMock() michael@0: mock_open(mock) michael@0: michael@0: with patch('%s.open' % __name__, mock, create=True) as patched: michael@0: self.assertIs(patched, mock) michael@0: open('foo') michael@0: michael@0: mock.assert_called_once_with('foo') michael@0: michael@0: michael@0: def test_read_data(self): michael@0: mock = mock_open(read_data='foo') michael@0: with patch('%s.open' % __name__, mock, create=True): michael@0: h = open('bar') michael@0: result = h.read() michael@0: michael@0: self.assertEqual(result, 'foo') michael@0: michael@0: michael@0: if __name__ == '__main__': michael@0: unittest2.main()