If I run the following code with pytest test.py
I get the output {'status': 'success', 'data': 'Dave'}
. Why is that?
from unittest.mock import patch, MagicMock
class MessageHandler:
def success_response(self, data):
return {'status': 'success', 'data': data}
def error_response(self, message=None, exception=None):
return {'status': 'error', 'data': message or str(exception)}
def create_db_if_it_doesnt_already_exists():
return 'Dave'
def create_db() -> dict:
msg = MessageHandler()
result = None
try:
result = create_db_if_it_doesnt_already_exists()
except Exception as e:
return msg.error_response(exception=e)
return msg.success_response(result)
def test_create_db_success():
return_value = 'Dave'
with patch('database.init_db.create_db_if_it_doesnt_already_exists') as mock_create_db:
mock_create_db.return_value = return_value
msg = MagicMock()
msg.success_response = MagicMock(return_value={'status': 'success', 'data': return_value})
with patch('common.messages.MessageHandler', return_value=msg):
response = create_db()
mock_create_db.assert_called_once()
msg.success_response.assert_called_once_with(return_value)
assert response == {'status': 'success', 'data': return_value}
def test_create_db_error():
error_string = 'There was an error'
exception_instance = Exception(error_string)
with patch('database.init_db.create_db_if_it_doesnt_already_exists', side_effect=exception_instance) as mock_create_db_1:
#mock_create_db.side_effect = exception_instance
msg_1 = MagicMock()
msg_1.error_response = MagicMock(return_value={'status': 'error', 'data': error_string})
with patch('common.messages.MessageHandler', return_value=msg_1):
response_1 = create_db()
print(response_1)
mock_create_db_1.assert_called_once()
msg_1.error_response.assert_called_once()
msg_1.error_response.assert_called_with(exception=exception_instance)
assert response_1 == {'status': 'error', 'data': error_string}