diff --git a/providers/smtp/src/airflow/providers/smtp/hooks/smtp.py b/providers/smtp/src/airflow/providers/smtp/hooks/smtp.py index 4f866d6010e5c..870dbc4783557 100644 --- a/providers/smtp/src/airflow/providers/smtp/hooks/smtp.py +++ b/providers/smtp/src/airflow/providers/smtp/hooks/smtp.py @@ -299,9 +299,10 @@ def test_connection(self) -> tuple[bool, str]: """Test SMTP connectivity from UI.""" try: smtp_client = self.get_conn()._smtp_client - if smtp_client: + if smtp_client is not None: + smtp_client = cast("smtplib.SMTP_SSL | smtplib.SMTP", smtp_client) status = smtp_client.noop() - if status == 250: + if status[0] == 250: return True, "Connection successfully tested" except Exception as e: return False, str(e) diff --git a/providers/smtp/tests/unit/smtp/hooks/test_smtp.py b/providers/smtp/tests/unit/smtp/hooks/test_smtp.py index 0eb74b8999dda..2c560ab3d4be5 100644 --- a/providers/smtp/tests/unit/smtp/hooks/test_smtp.py +++ b/providers/smtp/tests/unit/smtp/hooks/test_smtp.py @@ -546,6 +546,29 @@ def test_ehlo_called_after_starttls(self, mock_smtplib): assert ehlo_call == call.ehlo() assert login_call == call.login(SMTP_LOGIN, SMTP_PASSWORD) + @pytest.mark.parametrize( + ("noop_response", "expected_result"), + [ + pytest.param( + (250, b"2.0.0 Ok"), + (True, "Connection successfully tested"), + id="success", + ), + pytest.param( + (421, b"4.3.0 Service not available"), + (False, "Failed to establish connection"), + id="failure", + ), + ], + ) + @patch(smtplib_string) + def test_test_connection_handles_noop_responses(self, mock_smtplib, noop_response, expected_result): + mock_conn = _create_fake_smtp(mock_smtplib) + mock_conn.noop.return_value = noop_response + + assert SmtpHook().test_connection() == expected_result + mock_conn.noop.assert_called_once_with() + @pytest.mark.asyncio @pytest.mark.skipif(not AIRFLOW_V_3_1_PLUS, reason="Async support was added to BaseNotifier in 3.1.0")