diff --git a/src/apify_client/clients/resource_clients/run_collection.py b/src/apify_client/clients/resource_clients/run_collection.py index 0e314c91..41f9634d 100644 --- a/src/apify_client/clients/resource_clients/run_collection.py +++ b/src/apify_client/clients/resource_clients/run_collection.py @@ -26,7 +26,7 @@ def list( limit: int | None = None, offset: int | None = None, desc: bool | None = None, - status: ActorJobStatus | None = None, + status: ActorJobStatus | list[ActorJobStatus] | None = None, ) -> ListPage[dict]: """List all Actor runs. @@ -40,16 +40,21 @@ def list( limit: How many runs to retrieve. offset: What run to include as first when retrieving the list. desc: Whether to sort the runs in descending order based on their start date. - status: Retrieve only runs with the provided status. + status: Retrieve only runs with the provided statuses. Returns: The retrieved Actor runs. """ + if isinstance(status, list): + status_param = [maybe_extract_enum_member_value(s) for s in status] + else: + status_param = maybe_extract_enum_member_value(status) + return self._list( limit=limit, offset=offset, desc=desc, - status=maybe_extract_enum_member_value(status), + status=status_param, ) @@ -67,7 +72,7 @@ async def list( limit: int | None = None, offset: int | None = None, desc: bool | None = None, - status: ActorJobStatus | None = None, + status: ActorJobStatus | list[ActorJobStatus] | None = None, ) -> ListPage[dict]: """List all Actor runs. @@ -81,14 +86,19 @@ async def list( limit: How many runs to retrieve. offset: What run to include as first when retrieving the list. desc: Whether to sort the runs in descending order based on their start date. - status: Retrieve only runs with the provided status. + status: Retrieve only runs with the provided statuses. Returns: The retrieved Actor runs. """ + if isinstance(status, list): + status_param = [maybe_extract_enum_member_value(s) for s in status] + else: + status_param = maybe_extract_enum_member_value(status) + return await self._list( limit=limit, offset=offset, desc=desc, - status=maybe_extract_enum_member_value(status), + status=status_param, ) diff --git a/tests/integration/test_run_collection.py b/tests/integration/test_run_collection.py new file mode 100644 index 00000000..3d1be6cd --- /dev/null +++ b/tests/integration/test_run_collection.py @@ -0,0 +1,56 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest + +if TYPE_CHECKING: + from apify_client import ApifyClient + +from apify_shared.consts import ActorJobStatus + +pytestmark = pytest.mark.integration + + +class TestRunCollectionSync: + APIFY_HELLO_WORLD_ACTOR = 'apify/hello-world' + created_runs: list[dict] + + def setup_runs(self, apify_client: ApifyClient) -> None: + self.created_runs = [] + + successfull_run = apify_client.actor(self.APIFY_HELLO_WORLD_ACTOR).call() + if successfull_run is not None: + self.created_runs.append(successfull_run) + + timed_out_run = apify_client.actor(self.APIFY_HELLO_WORLD_ACTOR).call(timeout_secs=1) + if timed_out_run is not None: + self.created_runs.append(timed_out_run) + + def teadown_runs(self, apify_client: ApifyClient) -> None: + for run in self.created_runs: + run_id = run.get('id') + if isinstance(run_id, str): + apify_client.run(run_id).delete() + + async def test_run_collection_list_multiple_statuses(self, apify_client: ApifyClient) -> None: + self.setup_runs(apify_client) + + run_collection = apify_client.actor(self.APIFY_HELLO_WORLD_ACTOR).runs() + + multiple_status_runs = run_collection.list(status=[ActorJobStatus.SUCCEEDED, ActorJobStatus.TIMED_OUT]) + single_status_runs = run_collection.list(status=ActorJobStatus.SUCCEEDED) + + assert multiple_status_runs is not None + assert single_status_runs is not None + + assert hasattr(multiple_status_runs, 'items') + assert hasattr(single_status_runs, 'items') + + assert all( + run.get('status') in [ActorJobStatus.SUCCEEDED, ActorJobStatus.TIMED_OUT] + for run in multiple_status_runs.items + ) + assert all(run.get('status') == ActorJobStatus.SUCCEEDED for run in single_status_runs.items) + + self.teadown_runs(apify_client)