Skip to content

Commit e35a745

Browse files
committed
add unit tests for ScenarioOps and AsyncScenarioOps
1 parent 82f3597 commit e35a745

3 files changed

Lines changed: 141 additions & 3 deletions

File tree

tests/sdk/conftest.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,8 @@ def mock_async_stream() -> AsyncMock:
273273
"""
274274

275275
async def async_iter():
276-
# Empty async iterator
277-
if False:
278-
yield
276+
return
277+
yield # Make this a generator
279278

280279
stream = AsyncMock()
281280
stream.__aiter__ = Mock(return_value=async_iter())

tests/sdk/test_async_ops.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
MockDevboxView,
1616
MockObjectView,
1717
MockScorerView,
18+
MockScenarioView,
1819
MockSnapshotView,
1920
MockBlueprintView,
2021
create_mock_httpx_response,
@@ -1067,6 +1068,82 @@ async def test_create_from_object_with_agent_setup(
10671068
)
10681069

10691070

1071+
class TestAsyncScenarioOps:
1072+
"""Tests for AsyncScenarioOps class."""
1073+
1074+
def test_from_id(self, mock_async_client: AsyncMock) -> None:
1075+
"""Test from_id method."""
1076+
from runloop_api_client.sdk import AsyncScenario
1077+
from runloop_api_client.sdk.async_ import AsyncScenarioOps
1078+
1079+
ops = AsyncScenarioOps(mock_async_client)
1080+
scenario = ops.from_id("scn_123")
1081+
1082+
assert isinstance(scenario, AsyncScenario)
1083+
assert scenario.id == "scn_123"
1084+
1085+
@pytest.mark.asyncio
1086+
async def test_list_empty(self, mock_async_client: AsyncMock) -> None:
1087+
"""Test list method with empty results."""
1088+
from runloop_api_client.sdk.async_ import AsyncScenarioOps
1089+
1090+
async def async_iter():
1091+
return
1092+
yield # Make this a generator
1093+
1094+
mock_async_client.scenarios.list = AsyncMock(return_value=async_iter())
1095+
1096+
ops = AsyncScenarioOps(mock_async_client)
1097+
scenarios = await ops.list(limit=10)
1098+
1099+
assert len(scenarios) == 0
1100+
mock_async_client.scenarios.list.assert_awaited_once()
1101+
1102+
@pytest.mark.asyncio
1103+
async def test_list_single(self, mock_async_client: AsyncMock, scenario_view: MockScenarioView) -> None:
1104+
"""Test list method with single result."""
1105+
from runloop_api_client.sdk import AsyncScenario
1106+
from runloop_api_client.sdk.async_ import AsyncScenarioOps
1107+
1108+
async def async_iter():
1109+
yield scenario_view
1110+
1111+
mock_async_client.scenarios.list = AsyncMock(return_value=async_iter())
1112+
1113+
ops = AsyncScenarioOps(mock_async_client)
1114+
scenarios = await ops.list(limit=10)
1115+
1116+
assert len(scenarios) == 1
1117+
assert isinstance(scenarios[0], AsyncScenario)
1118+
assert scenarios[0].id == "scn_123"
1119+
mock_async_client.scenarios.list.assert_awaited_once()
1120+
1121+
@pytest.mark.asyncio
1122+
async def test_list_multiple(self, mock_async_client: AsyncMock) -> None:
1123+
"""Test list method with multiple results."""
1124+
from runloop_api_client.sdk import AsyncScenario
1125+
from runloop_api_client.sdk.async_ import AsyncScenarioOps
1126+
1127+
scenario_view1 = MockScenarioView(id="scn_001", name="scenario-1")
1128+
scenario_view2 = MockScenarioView(id="scn_002", name="scenario-2")
1129+
1130+
async def async_iter():
1131+
yield scenario_view1
1132+
yield scenario_view2
1133+
1134+
mock_async_client.scenarios.list = AsyncMock(return_value=async_iter())
1135+
1136+
ops = AsyncScenarioOps(mock_async_client)
1137+
scenarios = await ops.list(limit=10)
1138+
1139+
assert len(scenarios) == 2
1140+
assert isinstance(scenarios[0], AsyncScenario)
1141+
assert isinstance(scenarios[1], AsyncScenario)
1142+
assert scenarios[0].id == "scn_001"
1143+
assert scenarios[1].id == "scn_002"
1144+
mock_async_client.scenarios.list.assert_awaited_once()
1145+
1146+
10701147
class TestAsyncRunloopSDK:
10711148
"""Tests for AsyncRunloopSDK class."""
10721149

tests/sdk/test_ops.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
MockDevboxView,
1414
MockObjectView,
1515
MockScorerView,
16+
MockScenarioView,
1617
MockSnapshotView,
1718
MockBlueprintView,
1819
create_mock_httpx_response,
@@ -960,6 +961,67 @@ def test_create_from_object_with_agent_setup(self, mock_client: Mock, agent_view
960961
)
961962

962963

964+
class TestScenarioOps:
965+
"""Tests for ScenarioOps class."""
966+
967+
def test_from_id(self, mock_client: Mock) -> None:
968+
"""Test from_id method."""
969+
from runloop_api_client.sdk import Scenario
970+
from runloop_api_client.sdk.sync import ScenarioOps
971+
972+
ops = ScenarioOps(mock_client)
973+
scenario = ops.from_id("scn_123")
974+
975+
assert isinstance(scenario, Scenario)
976+
assert scenario.id == "scn_123"
977+
978+
def test_list_empty(self, mock_client: Mock) -> None:
979+
"""Test list method with empty results."""
980+
from runloop_api_client.sdk.sync import ScenarioOps
981+
982+
mock_client.scenarios.list.return_value = []
983+
984+
ops = ScenarioOps(mock_client)
985+
scenarios = ops.list(limit=10)
986+
987+
assert len(scenarios) == 0
988+
mock_client.scenarios.list.assert_called_once()
989+
990+
def test_list_single(self, mock_client: Mock, scenario_view: MockScenarioView) -> None:
991+
"""Test list method with single result."""
992+
from runloop_api_client.sdk import Scenario
993+
from runloop_api_client.sdk.sync import ScenarioOps
994+
995+
mock_client.scenarios.list.return_value = [scenario_view]
996+
997+
ops = ScenarioOps(mock_client)
998+
scenarios = ops.list(limit=10)
999+
1000+
assert len(scenarios) == 1
1001+
assert isinstance(scenarios[0], Scenario)
1002+
assert scenarios[0].id == "scn_123"
1003+
mock_client.scenarios.list.assert_called_once()
1004+
1005+
def test_list_multiple(self, mock_client: Mock) -> None:
1006+
"""Test list method with multiple results."""
1007+
from runloop_api_client.sdk import Scenario
1008+
from runloop_api_client.sdk.sync import ScenarioOps
1009+
1010+
scenario_view1 = MockScenarioView(id="scn_001", name="scenario-1")
1011+
scenario_view2 = MockScenarioView(id="scn_002", name="scenario-2")
1012+
mock_client.scenarios.list.return_value = [scenario_view1, scenario_view2]
1013+
1014+
ops = ScenarioOps(mock_client)
1015+
scenarios = ops.list(limit=10)
1016+
1017+
assert len(scenarios) == 2
1018+
assert isinstance(scenarios[0], Scenario)
1019+
assert isinstance(scenarios[1], Scenario)
1020+
assert scenarios[0].id == "scn_001"
1021+
assert scenarios[1].id == "scn_002"
1022+
mock_client.scenarios.list.assert_called_once()
1023+
1024+
9631025
class TestRunloopSDK:
9641026
"""Tests for RunloopSDK class."""
9651027

0 commit comments

Comments
 (0)