@@ -140,3 +140,47 @@ def test_flatten_dict_deeply_nested(self):
140140 resolver = ConfigResolver (config_path = "/nonexistent/apcore.yaml" )
141141 result = resolver ._flatten_dict ({"a" : {"b" : {"c" : "deep_value" }}})
142142 assert result == {"a.b.c" : "deep_value" }
143+
144+
145+ class TestNamespaceAwareConfigResolution :
146+ """Config Bus namespace ↔ legacy key fallback (apcore >= 0.15.0)."""
147+
148+ def test_defaults_contain_namespace_keys (self ):
149+ resolver = ConfigResolver ()
150+ for key in [
151+ "apcore-cli.stdin_buffer_limit" ,
152+ "apcore-cli.auto_approve" ,
153+ "apcore-cli.help_text_max_length" ,
154+ "apcore-cli.logging_level" ,
155+ ]:
156+ assert key in resolver .DEFAULTS , f"Missing namespace default: { key } "
157+
158+ def test_resolve_namespace_key_from_legacy_config_file (self , tmp_path , clean_env ):
159+ """Querying 'apcore-cli.stdin_buffer_limit' finds 'cli.stdin_buffer_limit' in file."""
160+ config_file = tmp_path / "apcore.yaml"
161+ config_file .write_text ("cli:\n stdin_buffer_limit: 5242880\n " )
162+ resolver = ConfigResolver (config_path = str (config_file ))
163+ result = resolver .resolve ("apcore-cli.stdin_buffer_limit" )
164+ assert result == 5242880
165+
166+ def test_resolve_legacy_key_from_namespace_config_file (self , tmp_path , clean_env ):
167+ """Querying 'cli.auto_approve' finds 'apcore-cli.auto_approve' in file."""
168+ config_file = tmp_path / "apcore.yaml"
169+ config_file .write_text ("apcore-cli:\n auto_approve: true\n " )
170+ resolver = ConfigResolver (config_path = str (config_file ))
171+ result = resolver .resolve ("cli.auto_approve" )
172+ assert result is True
173+
174+ def test_direct_key_takes_precedence_over_alternate (self , tmp_path , clean_env ):
175+ """When both keys exist in file, the directly-queried key wins."""
176+ config_file = tmp_path / "apcore.yaml"
177+ config_file .write_text ("cli:\n help_text_max_length: 500\n " "apcore-cli:\n help_text_max_length: 2000\n " )
178+ resolver = ConfigResolver (config_path = str (config_file ))
179+ assert resolver .resolve ("cli.help_text_max_length" ) == 500
180+ assert resolver .resolve ("apcore-cli.help_text_max_length" ) == 2000
181+
182+ def test_namespace_mapping_is_bidirectional (self ):
183+ resolver = ConfigResolver ()
184+ assert len (resolver ._NAMESPACE_TO_LEGACY ) == len (resolver ._LEGACY_TO_NAMESPACE )
185+ for ns_key , legacy_key in resolver ._NAMESPACE_TO_LEGACY .items ():
186+ assert resolver ._LEGACY_TO_NAMESPACE [legacy_key ] == ns_key
0 commit comments