diff --git a/api/api_tests/util/string_processing/test_yaml.py b/api/api_tests/util/string_processing/test_yaml.py index a5628d80f..bd19491cd 100644 --- a/api/api_tests/util/string_processing/test_yaml.py +++ b/api/api_tests/util/string_processing/test_yaml.py @@ -52,6 +52,15 @@ def test_env_var_overrides_default(self): result = substitute_env_vars_in_yaml_content("key: $TEST_VAR|default_value") assert result == "key: env_value" + def test_empty_string_treated_as_unset_uses_default(self): + """When primary var is set but empty, treat as unset and use default (avoids invalid YAML in lists).""" + with patch.dict(os.environ, {"YOLOX_HTTP_ENDPOINT": ""}, clear=True): + result = substitute_env_vars_in_yaml_content( + "yolox_endpoints: " + '[$GRPC|"page-elements:8001", $YOLOX_HTTP_ENDPOINT|"http://page-elements:8000/v1/infer"]' + ) + assert result == 'yolox_endpoints: ["page-elements:8001", "http://page-elements:8000/v1/infer"]' + def test_missing_var_no_default(self): """Test that missing variables without defaults become empty strings.""" with patch.dict(os.environ, {}, clear=True): diff --git a/api/src/nv_ingest_api/util/string_processing/yaml.py b/api/src/nv_ingest_api/util/string_processing/yaml.py index af274a3f9..9ad7a4786 100644 --- a/api/src/nv_ingest_api/util/string_processing/yaml.py +++ b/api/src/nv_ingest_api/util/string_processing/yaml.py @@ -41,9 +41,9 @@ def _replacer(match: re.Match) -> str: var_name = match.group("braced") or match.group("named") default_val = match.group("braced_default") or match.group("named_default") - # First try the primary env var + # First try the primary env var (treat empty string as unset so default is used) value = os.environ.get(var_name) - if value is not None: + if value is not None and value != "": return _quote_if_needed(value) # If primary is missing, try the default.