"""Tests for the SSH connector.""" import base64 from unittest.mock import MagicMock from unittest.mock import patch from extract_sales.connectors.ssh import get_ssh_conn from extract_sales.connectors.ssh import run_ssh_cmd import pytest @patch('extract_sales.connectors.ssh.config') @patch('extract_sales.connectors.ssh.StringIO') @patch('extract_sales.connectors.ssh.Connection') @patch('extract_sales.connectors.ssh.Ed25519Key') def test_get_ssh_conn(mock_key, mock_connection, mock_stringio, mock_config): """Test getting a SSH connection.""" pkey = 'testprivatekey' pkey_encoded = base64.b64encode(pkey.encode()).decode() mock_config.SSH_HOST = 'testhost' mock_config.SSH_USER = 'testuser' mock_config.SSH_PRIVATE_KEY = pkey_encoded mock_pkey_file_obj = MagicMock() mock_stringio.return_value = mock_pkey_file_obj mock_ed25519_key = MagicMock() mock_key.return_value = mock_ed25519_key mock_connection_obj = MagicMock() mock_connection.return_value = mock_connection_obj result = get_ssh_conn() mock_stringio.assert_called_once_with(pkey) mock_key.assert_called_once_with(file_obj=mock_pkey_file_obj) mock_connection.assert_called_once_with( host='testhost', user='testuser', connect_kwargs={ 'pkey': mock_ed25519_key, 'banner_timeout': 60 } ) assert result == mock_connection_obj def test_run_ssh_cmd(): """Test running a SSH command.""" mock_cmd_result = MagicMock() mock_cmd_result.ok = True mock_cmd_result.stdout = 'testsuccess' mock_ssh_conn = MagicMock() mock_ssh_conn.run.return_value = mock_cmd_result result = run_ssh_cmd(mock_ssh_conn, 'testcmd') mock_ssh_conn.run.assert_called_once_with('testcmd', hide=True) assert result == 'testsuccess' def test_run_ssh_cmd_error(): """Test running a SSH command with an error.""" mock_cmd_result = MagicMock() mock_cmd_result.ok = False mock_cmd_result.stderr = 'testerrror' mock_ssh_conn = MagicMock() mock_ssh_conn.run.return_value = mock_cmd_result with pytest.raises(Exception, match='Error running SSH command'): run_ssh_cmd(mock_ssh_conn, 'testcmd') mock_ssh_conn.run.assert_called_once_with('testcmd', hide=True)