Skip to content

Commit ae52d19

Browse files
authored
Fix SaveLinkSpec registration crash on ResultContainer string indexing (#476) (#484)
1 parent e4ec8f1 commit ae52d19

3 files changed

Lines changed: 41 additions & 1 deletion

File tree

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ Handles dispatch → process → collect workflow for B-Fabric applications. Use
9191
- Line length: 120 (ruff and black)
9292
- basedpyright uses per-package baseline files at `.basedpyright/baseline.{package}.json`
9393
- Integration tests live in a separate repository
94+
- Use TDD: write a failing test first, verify it fails, then fix the code, then verify the test passes
9495

9596
## Branches
9697

bfabric_app_runner/src/bfabric_app_runner/output_registration/register.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ def _save_link(spec: SaveLinkSpec, client: Bfabric, workunit_definition: Workuni
154154
if existing_link_id is not None:
155155
link_data["id"] = existing_link_id
156156
res = client.save("link", link_data)
157-
logger.info(f"Link {spec.name} saved with id {res['id']} for entity {entity_type} with id {entity_id}")
157+
logger.info(f"Link {spec.name} saved with id {res[0]['id']} for entity {entity_type} with id {entity_id}")
158158

159159

160160
def find_default_resource_id(workunit_definition: WorkunitDefinition, client: Bfabric) -> int | None:
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from unittest.mock import MagicMock
2+
3+
import pytest
4+
5+
from bfabric.results.result_container import ResultContainer
6+
from bfabric_app_runner.output_registration.register import _save_link
7+
from bfabric_app_runner.specs.outputs_spec import SaveLinkSpec
8+
9+
10+
@pytest.fixture()
11+
def mock_client():
12+
return MagicMock()
13+
14+
15+
@pytest.fixture()
16+
def mock_workunit_definition():
17+
mock = MagicMock()
18+
mock.registration.workunit_id = 42
19+
return mock
20+
21+
22+
@pytest.fixture()
23+
def spec():
24+
return SaveLinkSpec(name="test_link", url="https://example.com", entity_type="Workunit")
25+
26+
27+
def test_save_link_no_existing(mock_client, mock_workunit_definition, spec):
28+
"""Test that _save_link works when no existing link is found."""
29+
mock_client.read.return_value = ResultContainer(results=[], total_pages_api=None, errors=[])
30+
mock_client.save.return_value = ResultContainer(results=[{"id": 123}], total_pages_api=None, errors=[])
31+
32+
_save_link(spec, mock_client, mock_workunit_definition)
33+
34+
mock_client.save.assert_called_once()
35+
saved_data = mock_client.save.call_args[0][1]
36+
assert saved_data["name"] == "test_link"
37+
assert saved_data["url"] == "https://example.com"
38+
assert saved_data["parentid"] == 42
39+
assert saved_data["parentclassname"] == "Workunit"

0 commit comments

Comments
 (0)