From f9312edebb0c21b1ab969784e68c4a9047711ded Mon Sep 17 00:00:00 2001 From: marcelsafin <179933638+marcelsafin@users.noreply.github.com> Date: Wed, 12 Aug 2026 23:53:45 +0200 Subject: [PATCH] fix(workflows): reject malformed step config on remove Assisted-by: GitHub Copilot (model: gpt-5.6-sol, autonomous) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/specify_cli/workflows/catalog.py | 6 ++++-- tests/test_workflows.py | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/specify_cli/workflows/catalog.py b/src/specify_cli/workflows/catalog.py index 61f490631c..bcebb75dbd 100644 --- a/src/specify_cli/workflows/catalog.py +++ b/src/specify_cli/workflows/catalog.py @@ -1463,12 +1463,14 @@ def remove_catalog(self, index: int) -> str: raise StepValidationError("No step catalog config file found.") try: - data = yaml.safe_load(config_path.read_text(encoding="utf-8")) or {} + data = yaml.safe_load(config_path.read_text(encoding="utf-8")) except (yaml.YAMLError, OSError, UnicodeDecodeError) as exc: raise StepValidationError( f"Catalog config file is unreadable or malformed: {exc}" ) from exc - if not isinstance(data, dict): + if data is None: + data = {} + elif not isinstance(data, dict): raise StepValidationError( "Catalog config file is corrupted (expected a mapping)." ) diff --git a/tests/test_workflows.py b/tests/test_workflows.py index 95baf22d3c..fb737c58f0 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -8861,6 +8861,18 @@ def test_remove_catalog_invalid_index(self, project_dir): with pytest.raises(StepValidationError, match="out of range"): catalog.remove_catalog(5) + @pytest.mark.parametrize("bad", [[], False, 0, ""]) + def test_remove_catalog_rejects_falsy_non_mapping_config( + self, project_dir, bad + ): + from specify_cli.workflows.catalog import StepCatalog, StepValidationError + + config_path = project_dir / ".specify" / "step-catalogs.yml" + config_path.write_text(yaml.safe_dump(bad), encoding="utf-8") + + with pytest.raises(StepValidationError, match="expected a mapping"): + StepCatalog(project_dir).remove_catalog(0) + def test_remove_catalog_no_config(self, project_dir): from specify_cli.workflows.catalog import StepCatalog, StepValidationError