import os from unittest import mock import pytest from vector_utils.connections import connection_info from vector_utils.connections import sftp def test_sftp_connection_class(sftpserver): """Test ftp connection class.""" with sftpserver.serve_content({'a_dir': {'somefile.txt': 'File content'}}): conn_obj = connection_info.ConnectionInfo({ 'connection_type': 'sftp', 'authenticate_type': 'password', 'user_name': 'username', 'password': 'password', 'port': sftpserver.port, 'domain_name': sftpserver.host }) c = sftp.SftpConnection(conn_obj) assert c.scan_dir('/a_dir') == ['somefile.txt'] c.close_connection() def test_sftp_connection_file_size(sftpserver): """Test ftp connection class.""" with sftpserver.serve_content({'a_dir': {'somefile.txt': 'File content'}}): conn_obj = connection_info.ConnectionInfo({ 'connection_type': 'sftp', 'authenticate_type': 'password', 'user_name': 'username', 'password': 'password', 'port': sftpserver.port, 'domain_name': sftpserver.host }) c = sftp.SftpConnection(conn_obj) assert c.file_size('/a_dir/somefile.txt') == 12 c.close_connection() def test_sftp_connection_file_exists(sftpserver): """Test ftp connection class.""" with sftpserver.serve_content({'a_dir': {'somefile.txt': 'File content'}}): conn_obj = connection_info.ConnectionInfo({ 'connection_type': 'sftp', 'authenticate_type': 'password', 'user_name': 'username', 'password': 'password', 'port': sftpserver.port, 'domain_name': sftpserver.host }) c = sftp.SftpConnection(conn_obj) assert c.file_exists('/a_dir/somefile.txt') is True assert c.file_exists('/a_dir/some_other_file.txt') is False assert c.file_exists('/a_dir/b_dir/some_other_file.txt') is False c.close_connection() def test_sftp_connection_mkdir(sftpserver): """Test ftp connection class.""" with sftpserver.serve_content({'a_dir': {'somefile.txt': 'File content'}}): conn_obj = connection_info.ConnectionInfo({ 'connection_type': 'sftp', 'authenticate_type': 'password', 'user_name': 'username', 'password': 'password', 'port': sftpserver.port, 'domain_name': sftpserver.host }) c = sftp.SftpConnection(conn_obj) assert c.mkdir('/a_dir/b_dir/c_dir/d_dir/e_dir') is True assert c.mkdir('/a_dir/b_dir/c_dir/d_dir/e_dir') is None assert c.scan_dir('/a_dir/b_dir/c_dir/d_dir') == ['e_dir'] c.close_connection() def test_sftp_connection_mkdir_empty(sftpserver): with sftpserver.serve_content({'a_dir': {'somefile.txt': 'File content'}}): conn_obj = connection_info.ConnectionInfo({ 'connection_type': 'sftp', 'authenticate_type': 'password', 'user_name': 'username', 'password': 'password', 'port': sftpserver.port, 'domain_name': sftpserver.host }) c = sftp.SftpConnection(conn_obj) assert not c.mkdir('/') assert not c.mkdir('') c.close_connection() def test_sftp_connection_reconnect(sftpserver): """Test ftp connection class.""" with sftpserver.serve_content({'a_dir': {'somefile.txt': 'File content'}}): conn_obj = connection_info.ConnectionInfo({ 'connection_type': 'sftp', 'authenticate_type': 'password', 'user_name': 'username', 'password': 'password', 'port': sftpserver.port, 'domain_name': sftpserver.host }) c = sftp.SftpConnection(conn_obj) assert c.scan_dir('/a_dir') == ['somefile.txt'] c.close_connection() with pytest.raises(OSError) as excinfo: assert c.scan_dir('/a_dir') == ['somefile.txt'] assert str(excinfo.value) == 'Socket is closed' c.reconnect() assert c.scan_dir('/a_dir') == ['somefile.txt'] c.close_connection() def test_sftp_connection_exception_raised(sftpserver): """Test ftp connection class raises exceptions properly.""" with sftpserver.serve_content({'a_dir': {'somefile.txt': 'File content'}}): conn_obj = connection_info.ConnectionInfo({ 'connection_type': 'sftp', 'authenticate_type': 'password', 'user_name': 'username', 'password': 'password', 'port': sftpserver.port, 'domain_name': sftpserver.host }) c = sftp.SftpConnection(conn_obj) with pytest.raises(FileNotFoundError) as excinfo: c.file_size('/a_dir/somefile111.txt') assert 'No such file' in str(excinfo) # connection automatically closed due to exception...lets verify assert c.connection.get_transport() is None def test_sftp_connection_transfer_files_upload( sftp_server_and_conn_obj, local_test_files): """Test sftp connection class uploads files.""" sftpserver, conn_obj = sftp_server_and_conn_obj with sftpserver.serve_content({'a_dir': {'somefile.txt': 'File content'}}): c = sftp.SftpConnection(conn_obj) transfer_files_list = [ {'local': x, 'remote': '{}/{}'.format('', os.path.basename(x))} for x in local_test_files] c.transfer_files(transfer_files_list) assert c.scan_dir('/') == [ 'a_dir', *[os.path.basename(x) for x in local_test_files]] c.close_connection() def test_sftp_connection_transfer_in_memory_upload(sftp_server_and_conn_obj): sftpserver, conn_obj = sftp_server_and_conn_obj with sftpserver.serve_content({'a_dir': {'somefile.txt': 'File content'}}): c = sftp.SftpConnection(conn_obj) c.transfer_files([ { 'local': b'data', 'remote': 'file_1.txt' } ]) assert c.scan_dir('/') == ['a_dir', 'file_1.txt'] c.close_connection() def test_sftp_connection_transfer_files_upload_bad_auth_type( sftp_server_and_conn_obj, local_test_files): """Test sftp connection class errors on bad auth type.""" sftpserver, conn_obj = sftp_server_and_conn_obj conn_obj.authenticate_type = 'bad_auth_type' with sftpserver.serve_content({'a_dir': {'somefile.txt': 'File content'}}): with pytest.raises(Exception) as excinfo: sftp.SftpConnection(conn_obj) assert str(excinfo.value) == 'Unsupported authentication type bad_auth_type' def test_sftp_connection_transfer_files_download( sftp_server_and_conn_obj, tmpdir): """Test sftp connection class downloads files.""" sftpserver, conn_obj = sftp_server_and_conn_obj with sftpserver.serve_content({'a_dir': {'somefile.txt': 'File content'}}): c = sftp.SftpConnection(conn_obj) local_file_location = '{}/{}'.format(tmpdir, 'somefile.txt') transfer_files_list = [{ 'local': local_file_location, 'remote': '/a_dir/somefile.txt' }] c.transfer_files(transfer_files_list, transfer_mode='download') assert tmpdir.listdir() == [local_file_location] c.close_connection() @mock.patch('vector_utils.connections.sftp.sleep') def test_sftp_connection_transfer_files_download_err( mock_sleep, sftp_server_and_conn_obj, tmpdir): """Test sftp connection class downloads files error.""" sftpserver, conn_obj = sftp_server_and_conn_obj with sftpserver.serve_content({'a_dir': {'somefile.txt': 'File content'}}): c = sftp.SftpConnection(conn_obj) local_file_location = '{}/{}'.format(tmpdir, 'somefile.txt') transfer_files_list = [{ 'local': local_file_location, 'remote': '/a_dir/somefile_1.txt' }] with pytest.raises(Exception) as excinfo: c.transfer_files(transfer_files_list, transfer_mode='download') assert str(excinfo.value) == 'Unable to transfer files' c.close_connection()