diff --git a/src/specify_cli/workflows/catalog/_domain.py b/src/specify_cli/workflows/catalog/_domain.py index cc29a0b0ca..18bc0165a6 100644 --- a/src/specify_cli/workflows/catalog/_domain.py +++ b/src/specify_cli/workflows/catalog/_domain.py @@ -805,10 +805,11 @@ def _coerce_priority(value: Any) -> int: # existing priority as 0 rather than crashing 'catalog add'. return 0 + # Match the config parser's one-based default for omitted priorities. max_priority = max( ( - _coerce_priority(cat.get("priority", 0)) - for cat in catalogs + _coerce_priority(cat.get("priority", idx + 1)) + for idx, cat in enumerate(catalogs) if isinstance(cat, dict) ), default=0, diff --git a/src/specify_cli/workflows/step/catalog/_domain.py b/src/specify_cli/workflows/step/catalog/_domain.py index 1f0e2503d8..4ed99a140b 100644 --- a/src/specify_cli/workflows/step/catalog/_domain.py +++ b/src/specify_cli/workflows/step/catalog/_domain.py @@ -741,10 +741,11 @@ def _coerce_priority(value: Any) -> int: # existing priority as 0 rather than crashing 'catalog add'. return 0 + # Match the config parser's one-based default for omitted priorities. max_priority = max( ( - _coerce_priority(cat.get("priority", 0)) - for cat in catalogs + _coerce_priority(cat.get("priority", idx + 1)) + for idx, cat in enumerate(catalogs) if isinstance(cat, dict) ), default=0, diff --git a/tests/specify_cli/workflows/catalog/test_domain.py b/tests/specify_cli/workflows/catalog/test_domain.py new file mode 100644 index 0000000000..35d81aec1b --- /dev/null +++ b/tests/specify_cli/workflows/catalog/test_domain.py @@ -0,0 +1,43 @@ +"""Regression tests for workflow catalog source ordering.""" + +import pytest +import yaml + +from specify_cli.workflows.catalog import WorkflowCatalog + + +@pytest.mark.parametrize( + ("priorities", "expected_priorities"), + [ + ([None, None, None], [1, 2, 3, 4]), + ([1, None, None], [1, 2, 3, 4]), + ([10, "20", 30], [10, 20, 30, 31]), + ([-3, -2, -1], [-3, -2, -1, 0]), + ], + ids=["implicit", "mixed", "explicit", "negative"], +) +def test_add_catalog_appends_after_effective_priorities( + project_dir, monkeypatch, priorities, expected_priorities +): + monkeypatch.delenv("SPECKIT_WORKFLOW_CATALOG_URL", raising=False) + config_path = project_dir / ".specify" / "workflow-catalogs.yml" + entries = [ + {"name": name, "url": f"https://{name}.example/catalog.json"} + for name in ("first", "second", "third") + ] + for entry, priority in zip(entries, priorities): + if priority is not None: + entry["priority"] = priority + config_path.write_text(yaml.safe_dump({"catalogs": entries}), encoding="utf-8") + + catalog = WorkflowCatalog(project_dir) + assert catalog.add_catalog("https://added.example/catalog.json", "added") == "added" + + configs = WorkflowCatalog(project_dir).get_catalog_configs() + assert [config["name"] for config in configs] == [ + "first", "second", "third", "added" + ] + assert [config["priority"] for config in configs] == expected_priorities + stored = yaml.safe_load(config_path.read_text(encoding="utf-8"))["catalogs"] + assert stored[:-1] == entries + assert stored[-1]["priority"] == expected_priorities[-1] diff --git a/tests/specify_cli/workflows/step/catalog/test_domain.py b/tests/specify_cli/workflows/step/catalog/test_domain.py new file mode 100644 index 0000000000..837e986eca --- /dev/null +++ b/tests/specify_cli/workflows/step/catalog/test_domain.py @@ -0,0 +1,43 @@ +"""Regression tests for workflow step catalog source ordering.""" + +import pytest +import yaml + +from specify_cli.workflows.step.catalog import StepCatalog + + +@pytest.mark.parametrize( + ("priorities", "expected_priorities"), + [ + ([None, None, None], [1, 2, 3, 4]), + ([1, None, None], [1, 2, 3, 4]), + ([10, "20", 30], [10, 20, 30, 31]), + ([-3, -2, -1], [-3, -2, -1, 0]), + ], + ids=["implicit", "mixed", "explicit", "negative"], +) +def test_add_catalog_appends_after_effective_priorities( + project_dir, monkeypatch, priorities, expected_priorities +): + monkeypatch.delenv("SPECKIT_STEP_CATALOG_URL", raising=False) + config_path = project_dir / ".specify" / "step-catalogs.yml" + entries = [ + {"name": name, "url": f"https://{name}.example/catalog.json"} + for name in ("first", "second", "third") + ] + for entry, priority in zip(entries, priorities): + if priority is not None: + entry["priority"] = priority + config_path.write_text(yaml.safe_dump({"catalogs": entries}), encoding="utf-8") + + catalog = StepCatalog(project_dir) + assert catalog.add_catalog("https://added.example/catalog.json", "added") == "added" + + configs = StepCatalog(project_dir).get_catalog_configs() + assert [config["name"] for config in configs] == [ + "first", "second", "third", "added" + ] + assert [config["priority"] for config in configs] == expected_priorities + stored = yaml.safe_load(config_path.read_text(encoding="utf-8"))["catalogs"] + assert stored[:-1] == entries + assert stored[-1]["priority"] == expected_priorities[-1]