From 05103c6bdeb8a90dd000a98572cbdeb13b19b99b Mon Sep 17 00:00:00 2001 From: Baophan00 <109447498+Baophan00@users.noreply.github.com> Date: Fri, 31 Jul 2026 23:22:28 +0700 Subject: [PATCH] test(config): add regression test for scalar model sub-key preservation Verify that setting model.provider/model.api_key after a scalar model assignment preserves the original model id as model.default. --- tests/hermes_cli/test_set_config_value.py | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/hermes_cli/test_set_config_value.py b/tests/hermes_cli/test_set_config_value.py index aa1702a594..8993fa25c9 100644 --- a/tests/hermes_cli/test_set_config_value.py +++ b/tests/hermes_cli/test_set_config_value.py @@ -658,3 +658,33 @@ class TestMappingGuard: import yaml as _yaml parsed = _yaml.safe_load(_read_config(_isolated_hermes_home)) assert parsed["model"] == "claude-opus-4" + + +class TestScalarModelSubKeyPreservation: + """#75426: setting model.provider when model is a scalar must not lose the model id.""" + + def test_scalar_model_id_preserved_after_provider_write(self, _isolated_hermes_home): + """Seed model: gpt-4o, then set model.provider → model.default must survive.""" + import yaml + + set_config_value("model", "gpt-4o") + set_config_value("model.provider", "openai") + + raw = _read_config(_isolated_hermes_home) + parsed = yaml.safe_load(raw) + model = parsed["model"] + assert model["default"] == "gpt-4o", f"model.default lost: {model}" + assert model["provider"] == "openai" + + def test_scalar_model_id_preserved_after_api_key_write(self, _isolated_hermes_home): + """model.api_key must also preserve the existing scalar model id.""" + import yaml + + set_config_value("model", "claude-sonnet") + # model.api_key is a sub-key (has a dot), so it stays in config.yaml + set_config_value("model.api_key", "sk-test") + + raw = _read_config(_isolated_hermes_home) + parsed = yaml.safe_load(raw) + assert parsed["model"]["default"] == "claude-sonnet" + assert parsed["model"]["api_key"] == "sk-test"