lundi 25 avril 2016

Python mocking paramiko sftpclient open

I am trying to mock paramiko SFTPClient.open() and return a file to test my file parsing code. However, when I setup my Mock as below it returns a magicmock instance instead of the opened file and instead creates a magic mock instance with it's _mock_return_value is equal to the open file.

I am wanting the paramiko.SSHClient.open_sftp.open to equal the open test file. I feel like this should be happening, but it is not. Am I missing something? Can anyone explain, what it is I am doing wrong and how I am misunderstanding mock?

This is my code:

@app.route('/ipmivlan/<girls_name>', methods=['POST'])
def find_the_girl(girls_name):
this_is_the_girl = None
remote_file = None
try:
  client = paramiko.SSHClient()
  # Auto add host key if not found/unknown
  client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  client.connect(host, username=username, password=password)
  sftp_client = client.open_sftp()
  remote_filename = '/usr/local/{0}'.format(girls_name.lower())
  remote_file = sftp_client.open(remote_filename, mode='r')
  print remote_file
  pprint(remote_file.__dict__)
  this_is_the_girl = parse_config(remote_file)
except paramiko.ssh_exception.AuthenticationException:
  return_message = "Authentication has failed."
  app.logger.info(return_message)
  app.logger.info("Traceback: {0}".format(traceback.format_exc()))
  return jsonify(return_code=1, message=return_message, traceback=traceback.format_exc())
except paramiko.ssh_exception.BadHostKeyException:
  return_message = "Server hostkey could not be verified"
  app.logger.info(return_message)
  app.logger.info("Traceback: {0}".format(traceback.format_exc()))
  return jsonify(return_code=1, message=return_message, traceback=traceback.format_exc())
except paramiko.ssh_exception.SSHException:
  return_message = "Error connecting or establishing SSH Session."
  app.logger.info(return_message)
  app.logger.info("Traceback: {0}".format(traceback.format_exc()))
  return jsonify(return_code=1, message=return_message, traceback=traceback.format_exc())
except paramiko.ssh_exception.socket.error:
  return_message = "Socket error occurred while connecting."
  app.logger.info(return_message)
  app.logger.info("Traceback: {0}".format(traceback.format_exc()))
  return jsonify(return_code=1, message=return_message, traceback=traceback.format_exc())
except IOError:
  return_message = "IOError while trying to read remote file {0}".format(remote_filename)
  app.logger.info(return_message)
  app.logger.info("Traceback: {0}".format(traceback.format_exc()))
  return jsonify(return_code=1, message=return_message, traceback=traceback.format_exc())
except: 
  return_message = "Unknown exception: {0}".format(str(sys.exc_info()[0]))
  app.logger.info(return_message)
  app.logger.info("Traceback: {0}".format(traceback.format_exc()))
  return jsonify(return_code=1, message=return_message, traceback=traceback.format_exc())
finally:
  if remote_file is not None:
    remote_file.close()

if this_is_the_girl is None:
  return jsonify(return_code=0, message="Girl not found.")
else:
  return jsonify(return_code=0, message="Successfully found girl")

def parse_config(self, file):
  for line in file:
    print line
    ...

Here is my test code:

def setUp(self):
  self.test_file = open('this_is_the_girl_test_data.txt')

@mock.patch('src.mulholland.paramiko')
def test_find_girl(self, paramiko):
  expected_return_code = 0
  expected_message = "Successfully found girl"

  paramiko.SSHClient().open_sftp().open().return_value = self.test_file

  response = self.app.post('/mulholland_drive/{0}'.format(self.girl), data=dict(username=self.username, password=self.password), follow_redirects=True)
  response_json = json.loads(response.data)

  self.assertEqual(expected_return_code, response_json['return_code'])
  self.assertEqual(expected_message, response_json['message'])

def tearDown(self):
  self.test_file.close()

This is what my test returns:

<MagicMock name='paramiko.SSHClient().open_sftp().open()' id='4426176848'>
{'__str__': <MagicMock name='paramiko.SSHClient().open_sftp().open().__str__' id='4426525136'>,
 '_mock_call_args': None,
 '_mock_call_args_list': [],
 '_mock_call_count': 0,
 '_mock_called': False,
 '_mock_children': {'__str__': <MagicMock name='paramiko.SSHClient().open_sftp().open().__str__' id='4426525136'>},
 '_mock_delegate': None,
 '_mock_methods': None,
 '_mock_mock_calls': [call.__str__()],
 '_mock_name': None,
 '_mock_new_name': '()',
 '_mock_new_parent': <MagicMock name='paramiko.SSHClient().open_sftp().open' id='4426130896'>,
 '_mock_parent': None,
 '_mock_return_value': <open file 'this_is_the_girl_test_data.txt', mode 'r' at 0x107ab1930>,
 '_mock_side_effect': None,
 '_mock_unsafe': False,
 '_mock_wraps': None,
 '_spec_class': None,
 '_spec_set': None,
 '_spec_signature': None,
 'method_calls': []}

Aucun commentaire:

Enregistrer un commentaire