This is an automated email from the ASF dual-hosted git repository.

shahar1 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new efc3844e981 Add tests for CoordinatorManager configuration error paths 
(#69184)
efc3844e981 is described below

commit efc3844e98150c6c1ee52ce2e76b8028c777cfa9
Author: Andrew Chang <[email protected]>
AuthorDate: Tue Jun 30 20:43:51 2026 +0000

    Add tests for CoordinatorManager configuration error paths (#69184)
    
    The error branches that translate Python-internal exceptions
    (KeyError, ImportError, TypeError, ValueError) into user-facing
    InvalidCoordinatorError / ValueError messages in CoordinatorManager
    had no test coverage. Without these tests, a refactor could
    silently drop one of the except handlers and users would see raw
    Python tracebacks instead of the friendly domain errors the
    coordinator layer promises.
---
 .../task_sdk/execution_time/test_coordinator.py    | 52 ++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/task-sdk/tests/task_sdk/execution_time/test_coordinator.py 
b/task-sdk/tests/task_sdk/execution_time/test_coordinator.py
index 40db5378afc..73e737bfb8b 100644
--- a/task-sdk/tests/task_sdk/execution_time/test_coordinator.py
+++ b/task-sdk/tests/task_sdk/execution_time/test_coordinator.py
@@ -27,6 +27,7 @@ from airflow.sdk.configuration import conf, 
retrieve_configuration_description
 from airflow.sdk.execution_time.coordinator import (
     BaseCoordinator,
     CoordinatorManager,
+    InvalidCoordinatorError,
     _PythonCoordinator,
     get_coordinator_manager,
     reset_coordinator_manager,
@@ -116,6 +117,57 @@ class TestCoordinatorManager:
         assert manager._coordinator_specs == {}
         assert manager._queue_to_coordinator == {}
 
+    def test_from_config_rejects_invalid_queue_mapping(self, sdk_config):
+        sdk_config(
+            coordinators=json.dumps(
+                {"alpha": {"classpath": 
f"{_CoordinatorA.__module__}._CoordinatorA", "kwargs": {}}}
+            ),
+            queue_to_coordinator=json.dumps({"queue-x": "nonexistent"}),
+        )
+        with pytest.raises(
+            ValueError,
+            match=r"queue_to_coordinator references invalid coordinator key: 
'nonexistent'",
+        ):
+            CoordinatorManager.from_config()
+
+    @pytest.mark.parametrize(
+        ("coordinator_spec", "expected_match"),
+        [
+            pytest.param(
+                {"classpath": "nonexistent.module.MissingCoordinator", 
"kwargs": {}},
+                r"Cannot import coordinator 'bad-coord'",
+                id="classpath-cannot-be-imported",
+            ),
+            pytest.param(
+                {
+                    "classpath": f"{_CoordinatorA.__module__}._CoordinatorA",
+                    "kwargs": {"unknown_param": "x"},
+                },
+                r"Cannot instantiate coordinator 'bad-coord'",
+                id="kwargs-dont-match-constructor",
+            ),
+        ],
+    )
+    def test_for_queue_raises_invalid_coordinator_error(self, sdk_config, 
coordinator_spec, expected_match):
+        sdk_config(
+            coordinators=json.dumps({"bad-coord": coordinator_spec}),
+            queue_to_coordinator=json.dumps({"queue-bad": "bad-coord"}),
+        )
+        manager = CoordinatorManager.from_config()
+        with pytest.raises(InvalidCoordinatorError, match=expected_match):
+            manager.for_queue("queue-bad")
+
+    def test_for_queue_raises_when_spec_missing(self):
+        manager = CoordinatorManager(
+            coordinator_specs={},
+            queue_to_coordinator={"queue-bad": "missing"},
+        )
+        with pytest.raises(
+            InvalidCoordinatorError,
+            match=r"Queue 'queue-bad' configured to nonexistent coordinator",
+        ):
+            manager.for_queue("queue-bad")
+
     def test_get_coordinator_manager_is_cached(self, monkeypatch):
         monkeypatch.delenv("AIRFLOW__SDK__COORDINATORS", raising=False)
 

Reply via email to