From 03908da3de227b7dfc34b5d1a009c17efcdf513c Mon Sep 17 00:00:00 2001 From: Benjamin Einaudi Date: Tue, 6 Jan 2026 20:19:56 +0100 Subject: [PATCH] chore(code) remove Generator --- cloudfoundry_client/common_objects.py | 21 ++- cloudfoundry_client/doppler/client.py | 2 +- cloudfoundry_client/networking/entities.py | 4 +- .../operations/push/file_helper.py | 3 +- cloudfoundry_client/v2/events.py | 3 +- .../{fake => operations}/manifest_main.yml | 0 ...valid_entity_with_invalid_entity_type.json | 0 .../GET_invalid_entity_with_null_entity.json | 0 .../GET_invalid_entity_without_entity.json | 0 .../fake/GET_multi_page_0_response.json | 0 .../fake/GET_multi_page_1_response.json | 0 .../fixtures/{ => v2}/fake/GET_response.json | 0 .../{ => v2}/fake/GET_{id}_response.json | 0 .../v3/fake/GET_multi_page_0_response.json | 144 ++++++++++++++++++ .../v3/fake/GET_multi_page_1_response.json | 144 ++++++++++++++++++ tests/operations/push/test_push.py | 10 +- tests/v2/test_entities.py | 36 +++-- tests/v3/test_entities.py | 34 +++++ 18 files changed, 371 insertions(+), 30 deletions(-) rename tests/fixtures/{fake => operations}/manifest_main.yml (100%) rename tests/fixtures/{ => v2}/fake/GET_invalid_entity_with_invalid_entity_type.json (100%) rename tests/fixtures/{ => v2}/fake/GET_invalid_entity_with_null_entity.json (100%) rename tests/fixtures/{ => v2}/fake/GET_invalid_entity_without_entity.json (100%) rename tests/fixtures/{ => v2}/fake/GET_multi_page_0_response.json (100%) rename tests/fixtures/{ => v2}/fake/GET_multi_page_1_response.json (100%) rename tests/fixtures/{ => v2}/fake/GET_response.json (100%) rename tests/fixtures/{ => v2}/fake/GET_{id}_response.json (100%) create mode 100644 tests/fixtures/v3/fake/GET_multi_page_0_response.json create mode 100644 tests/fixtures/v3/fake/GET_multi_page_1_response.json diff --git a/cloudfoundry_client/common_objects.py b/cloudfoundry_client/common_objects.py index 71fe08b..57d97e5 100644 --- a/cloudfoundry_client/common_objects.py +++ b/cloudfoundry_client/common_objects.py @@ -1,5 +1,5 @@ import json -from collections.abc import Callable +from collections.abc import Callable, Generator from typing import TypeVar, Generic @@ -19,7 +19,7 @@ def __init__(self, *args, **kwargs): ENTITY = TypeVar('ENTITY') -class Pagination(Generic[ENTITY]): +class Pagination(Generic[ENTITY], Generator[ENTITY, None, None]): def __init__(self, first_page: JsonObject, total_result: int, next_page_loader: Callable[[JsonObject], JsonObject | None], @@ -37,10 +37,7 @@ def __init__(self, first_page: JsonObject, def total_results(self) -> int: return self._total_results - def __iter__(self): - return self - - def __next__(self) -> ENTITY: + def send(self, value) -> ENTITY: try: if self._cursor is None: self._current_page = self._first_page @@ -52,3 +49,15 @@ def __next__(self) -> ENTITY: raise self._cursor = self._resources_accessor(self._current_page).__iter__() return self._instance_creator(self._cursor.__next__()) + + def throw(self, typ, val=None, tb=None): + super().throw(typ, val, tb) + + def close(self): + super().close() + + def __iter__(self): + return self + + def __next__(self) -> ENTITY: + return self.send(None) diff --git a/cloudfoundry_client/doppler/client.py b/cloudfoundry_client/doppler/client.py index 7f4e5ad..4081e59 100644 --- a/cloudfoundry_client/doppler/client.py +++ b/cloudfoundry_client/doppler/client.py @@ -1,6 +1,6 @@ import logging import re -from typing import Generator +from collections.abc import Generator from urllib.parse import urlparse from oauth2_client.credentials_manager import CredentialManager diff --git a/cloudfoundry_client/networking/entities.py b/cloudfoundry_client/networking/entities.py index 6211de5..e28c06f 100644 --- a/cloudfoundry_client/networking/entities.py +++ b/cloudfoundry_client/networking/entities.py @@ -1,7 +1,7 @@ import logging -from collections.abc import Callable +from collections.abc import Callable, Generator from functools import reduce -from typing import Any, Generator, TYPE_CHECKING +from typing import Any, TYPE_CHECKING from urllib.parse import quote from requests import Response diff --git a/cloudfoundry_client/operations/push/file_helper.py b/cloudfoundry_client/operations/push/file_helper.py index 30acdcc..94e9b18 100644 --- a/cloudfoundry_client/operations/push/file_helper.py +++ b/cloudfoundry_client/operations/push/file_helper.py @@ -2,8 +2,7 @@ import os import stat import zipfile -from collections.abc import Callable -from typing import Generator +from collections.abc import Callable, Generator class FileHelper(object): diff --git a/cloudfoundry_client/v2/events.py b/cloudfoundry_client/v2/events.py index 9822165..c71e802 100644 --- a/cloudfoundry_client/v2/events.py +++ b/cloudfoundry_client/v2/events.py @@ -1,4 +1,5 @@ -from typing import Generator, TYPE_CHECKING +from collections.abc import Generator +from typing import TYPE_CHECKING from cloudfoundry_client.v2.entities import EntityManager, Entity diff --git a/tests/fixtures/fake/manifest_main.yml b/tests/fixtures/operations/manifest_main.yml similarity index 100% rename from tests/fixtures/fake/manifest_main.yml rename to tests/fixtures/operations/manifest_main.yml diff --git a/tests/fixtures/fake/GET_invalid_entity_with_invalid_entity_type.json b/tests/fixtures/v2/fake/GET_invalid_entity_with_invalid_entity_type.json similarity index 100% rename from tests/fixtures/fake/GET_invalid_entity_with_invalid_entity_type.json rename to tests/fixtures/v2/fake/GET_invalid_entity_with_invalid_entity_type.json diff --git a/tests/fixtures/fake/GET_invalid_entity_with_null_entity.json b/tests/fixtures/v2/fake/GET_invalid_entity_with_null_entity.json similarity index 100% rename from tests/fixtures/fake/GET_invalid_entity_with_null_entity.json rename to tests/fixtures/v2/fake/GET_invalid_entity_with_null_entity.json diff --git a/tests/fixtures/fake/GET_invalid_entity_without_entity.json b/tests/fixtures/v2/fake/GET_invalid_entity_without_entity.json similarity index 100% rename from tests/fixtures/fake/GET_invalid_entity_without_entity.json rename to tests/fixtures/v2/fake/GET_invalid_entity_without_entity.json diff --git a/tests/fixtures/fake/GET_multi_page_0_response.json b/tests/fixtures/v2/fake/GET_multi_page_0_response.json similarity index 100% rename from tests/fixtures/fake/GET_multi_page_0_response.json rename to tests/fixtures/v2/fake/GET_multi_page_0_response.json diff --git a/tests/fixtures/fake/GET_multi_page_1_response.json b/tests/fixtures/v2/fake/GET_multi_page_1_response.json similarity index 100% rename from tests/fixtures/fake/GET_multi_page_1_response.json rename to tests/fixtures/v2/fake/GET_multi_page_1_response.json diff --git a/tests/fixtures/fake/GET_response.json b/tests/fixtures/v2/fake/GET_response.json similarity index 100% rename from tests/fixtures/fake/GET_response.json rename to tests/fixtures/v2/fake/GET_response.json diff --git a/tests/fixtures/fake/GET_{id}_response.json b/tests/fixtures/v2/fake/GET_{id}_response.json similarity index 100% rename from tests/fixtures/fake/GET_{id}_response.json rename to tests/fixtures/v2/fake/GET_{id}_response.json diff --git a/tests/fixtures/v3/fake/GET_multi_page_0_response.json b/tests/fixtures/v3/fake/GET_multi_page_0_response.json new file mode 100644 index 0000000..df09c93 --- /dev/null +++ b/tests/fixtures/v3/fake/GET_multi_page_0_response.json @@ -0,0 +1,144 @@ +{ + "pagination": { + "total_results": 3, + "total_pages": 2, + "first": { + "href": "http://somewhere.org/fake" + }, + "last": { + "href": "http://somewhere.org/fake/last?page=2&per_page=2" + }, + "next": { + "href": "http://somewhere.org/fake/last?page=2&per_page=2" + }, + "previous": null + }, + "resources": [ + { + "guid": "1cb006ee-fb05-47e1-b541-c34179ddc446", + "name": "my_app", + "state": "STARTED", + "created_at": "2016-03-17T21:41:30Z", + "updated_at": "2016-03-18T11:32:30Z", + "lifecycle": { + "type": "buildpack", + "data": { + "buildpacks": [ + "java_buildpack" + ], + "stack": "cflinuxfs2" + } + }, + "relationships": { + "space": { + "data": { + "guid": "2f35885d-0c9d-4423-83ad-fd05066f8576" + } + } + }, + "links": { + "self": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc446" + }, + "space": { + "href": "http://somewhere.org/v3/spaces/2f35885d-0c9d-4423-83ad-fd05066f8576" + }, + "processes": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc446/processes" + }, + "route_mappings": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc446/route_mappings" + }, + "packages": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc446/packages" + }, + "environment_variables": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc446/environment_variables" + }, + "current_droplet": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc446/droplets/current" + }, + "droplets": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc446/droplets" + }, + "tasks": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc446/tasks" + }, + "start": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc446/actions/start", + "method": "POST" + }, + "stop": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc446/actions/stop", + "method": "POST" + } + }, + "metadata": { + "labels": {} + } + }, + { + "guid": "02b4ec9b-94c7-4468-9c23-4e906191a0f8", + "name": "my_app2", + "state": "STOPPED", + "created_at": "1970-01-01T00:00:02Z", + "updated_at": "2016-06-08T16:41:26Z", + "lifecycle": { + "type": "buildpack", + "data": { + "buildpacks": [ + "ruby_buildpack" + ], + "stack": "cflinuxfs2" + } + }, + "relationships": { + "space": { + "data": { + "guid": "2f35885d-0c9d-4423-83ad-fd05066f8576" + } + } + }, + "links": { + "self": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f8" + }, + "space": { + "href": "http://somewhere.org/v3/spaces/2f35885d-0c9d-4423-83ad-fd05066f8576" + }, + "processes": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f8/processes" + }, + "route_mappings": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f8/route_mappings" + }, + "packages": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f8/packages" + }, + "environment_variables": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f8/environment_variables" + }, + "current_droplet": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f8/droplets/current" + }, + "droplets": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f8/droplets" + }, + "tasks": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f8/tasks" + }, + "start": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f8/actions/start", + "method": "POST" + }, + "stop": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f8/actions/stop", + "method": "POST" + } + }, + "metadata": { + "labels": {} + } + } + ] +} \ No newline at end of file diff --git a/tests/fixtures/v3/fake/GET_multi_page_1_response.json b/tests/fixtures/v3/fake/GET_multi_page_1_response.json new file mode 100644 index 0000000..d28ef45 --- /dev/null +++ b/tests/fixtures/v3/fake/GET_multi_page_1_response.json @@ -0,0 +1,144 @@ +{ + "pagination": { + "total_results": 3, + "total_pages": 2, + "first": { + "href": "http://somewhere.org/fake" + }, + "last": { + "href": "http://somewhere.org/fake/last?page=2&per_page=2" + }, + "next": null, + "previous": { + "href": "http://somewhere.org/fake" + } + }, + "resources": [ + { + "guid": "1cb006ee-fb05-47e1-b541-c34179ddc447", + "name": "my_app3", + "state": "STARTED", + "created_at": "2016-03-17T21:41:30Z", + "updated_at": "2016-03-18T11:32:30Z", + "lifecycle": { + "type": "buildpack", + "data": { + "buildpacks": [ + "java_buildpack" + ], + "stack": "cflinuxfs2" + } + }, + "relationships": { + "space": { + "data": { + "guid": "2f35885d-0c9d-4423-83ad-fd05066f8576" + } + } + }, + "links": { + "self": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc447" + }, + "space": { + "href": "http://somewhere.org/v3/spaces/2f35885d-0c9d-4423-83ad-fd05066f8576" + }, + "processes": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc447/processes" + }, + "route_mappings": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc447/route_mappings" + }, + "packages": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc447/packages" + }, + "environment_variables": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc447/environment_variables" + }, + "current_droplet": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc447/droplets/current" + }, + "droplets": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc447/droplets" + }, + "tasks": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc447/tasks" + }, + "start": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc447/actions/start", + "method": "POST" + }, + "stop": { + "href": "http://somewhere.org/v3/apps/1cb006ee-fb05-47e1-b541-c34179ddc447/actions/stop", + "method": "POST" + } + }, + "metadata": { + "labels": {} + } + }, + { + "guid": "02b4ec9b-94c7-4468-9c23-4e906191a0f9", + "name": "my_app4", + "state": "STOPPED", + "created_at": "1970-01-01T00:00:02Z", + "updated_at": "2016-06-08T16:41:26Z", + "lifecycle": { + "type": "buildpack", + "data": { + "buildpacks": [ + "ruby_buildpack" + ], + "stack": "cflinuxfs2" + } + }, + "relationships": { + "space": { + "data": { + "guid": "2f35885d-0c9d-4423-83ad-fd05066f8576" + } + } + }, + "links": { + "self": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f9" + }, + "space": { + "href": "http://somewhere.org/v3/spaces/2f35885d-0c9d-4423-83ad-fd05066f8576" + }, + "processes": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f9/processes" + }, + "route_mappings": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f9/route_mappings" + }, + "packages": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f9/packages" + }, + "environment_variables": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f9/environment_variables" + }, + "current_droplet": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f9/droplets/current" + }, + "droplets": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f9/droplets" + }, + "tasks": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f9/tasks" + }, + "start": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f9/actions/start", + "method": "POST" + }, + "stop": { + "href": "http://somewhere.org/v3/apps/02b4ec9b-94c7-4468-9c23-4e906191a0f9/actions/stop", + "method": "POST" + } + }, + "metadata": { + "labels": {} + } + } + ] +} \ No newline at end of file diff --git a/tests/operations/push/test_push.py b/tests/operations/push/test_push.py index 15cef3a..41321b6 100644 --- a/tests/operations/push/test_push.py +++ b/tests/operations/push/test_push.py @@ -46,7 +46,13 @@ def test_to_host_should_remove_unwanted_characters(self): @patch.object( sys, "argv", - ["main", "push_app", AbstractTestCase.get_fixtures_path("fake", "manifest_main.yml"), "-space_guid", "space_id"], + [ + "main", + "push_app", + AbstractTestCase.get_fixtures_path("fake", "operations", "manifest_main.yml"), + "-space_guid", + "space_id" + ], ) def test_main_push(self): class FakeOperation(object): @@ -59,4 +65,4 @@ def __init__(self): "cloudfoundry_client.main.operation_commands.PushOperation", new=lambda c: push_operation ): main.main() - push_operation.push.assert_called_with("space_id", self.get_fixtures_path("fake", "manifest_main.yml")) + push_operation.push.assert_called_with("space_id", self.get_fixtures_path("fake", "operations", "manifest_main.yml")) diff --git a/tests/v2/test_entities.py b/tests/v2/test_entities.py index 35427d8..d88920e 100644 --- a/tests/v2/test_entities.py +++ b/tests/v2/test_entities.py @@ -14,7 +14,7 @@ def test_invalid_entity_without_entity_attribute(self): entity_manager = EntityManager(self.TARGET_ENDPOINT, client, "/fake/anyone") client.get.return_value = self.mock_response( - "/fake/anyone/any-id", HTTPStatus.OK, None, "fake", "GET_invalid_entity_without_entity.json" + "/fake/anyone/any-id", HTTPStatus.OK, None, "v2", "fake", "GET_invalid_entity_without_entity.json" ) self.assertRaises(InvalidEntity, lambda: entity_manager["any-id"]) @@ -24,7 +24,7 @@ def test_invalid_entity_with_null_entity(self): entity_manager = EntityManager(self.TARGET_ENDPOINT, client, "/fake/anyone") client.get.return_value = self.mock_response( - "/fake/anyone/any-id", HTTPStatus.OK, None, "fake", "GET_invalid_entity_with_null_entity.json" + "/fake/anyone/any-id", HTTPStatus.OK, None, "v2", "fake", "GET_invalid_entity_with_null_entity.json" ) self.assertRaises(InvalidEntity, lambda: entity_manager["any-id"]) @@ -34,7 +34,7 @@ def test_invalid_entity_with_invalid_entity_type(self): entity_manager = EntityManager(self.TARGET_ENDPOINT, client, "/fake/anyone") client.get.return_value = self.mock_response( - "/fake/anyone/any-id", HTTPStatus.OK, None, "fake", "GET_invalid_entity_with_invalid_entity_type.json" + "/fake/anyone/any-id", HTTPStatus.OK, None, "v2", "fake", "GET_invalid_entity_with_invalid_entity_type.json" ) self.assertRaises(InvalidEntity, lambda: entity_manager["any-id"]) @@ -79,25 +79,29 @@ def test_list(self): "/fake/first?order-direction=asc&page=1&results-per-page=20&q=space_guid%3Asome-id", HTTPStatus.OK, None, - "fake", + "v2", "fake", "GET_multi_page_0_response.json", ) second_response = self.mock_response( "/fake/next?order-direction=asc&page=2&results-per-page=50", HTTPStatus.OK, None, - "fake", + "v2", "fake", "GET_multi_page_1_response.json", ) client.get.side_effect = [first_response, second_response] - cpt = reduce( - lambda increment, _: increment + 1, + guids = reduce( + lambda c, entity: c.append(entity["metadata"]["guid"]) or c, entity_manager.list(**{"results-per-page": 20, "order-direction": "asc", "page": 1, "space_guid": "some-id"}), - 0, + [], ) client.get.assert_has_calls([call(first_response.url), call(second_response.url)], any_order=False) - self.assertEqual(cpt, 3) + self.assertEqual(guids, [ + "6fa7a340-9bda-43bf-bd5e-4e588c292679", + "7002efa8-3f54-4338-8884-117e98f21566", + "774a9f7e-895d-4825-84fc-222c1522a9a7" + ]) def test_elements_are_entities(self): client = MagicMock() @@ -107,14 +111,14 @@ def test_elements_are_entities(self): "/fake/first?order-direction=asc&page=1&results-per-page=20&q=space_guid%3Asome-id", HTTPStatus.OK, None, - "fake", + "v2", "fake", "GET_multi_page_0_response.json", ) second_response = self.mock_response( "/fake/next?order-direction=asc&page=2&results-per-page=50", HTTPStatus.OK, None, - "fake", + "v2", "fake", "GET_multi_page_1_response.json", ) client.get.side_effect = [first_response, second_response] @@ -129,7 +133,7 @@ def test_iter(self): client = MagicMock() entity_manager = EntityManager(self.TARGET_ENDPOINT, client, "/fake/something") - client.get.return_value = self.mock_response("/fake/something", HTTPStatus.OK, None, "fake", "GET_response.json") + client.get.return_value = self.mock_response("/fake/something", HTTPStatus.OK, None, "v2", "fake", "GET_response.json") cpt = reduce(lambda increment, _: increment + 1, entity_manager, 0) client.get.assert_called_with(client.get.return_value.url) @@ -140,7 +144,7 @@ def test_get_elem(self): entity_manager = EntityManager(self.TARGET_ENDPOINT, client, "/fake/something") client.get.return_value = self.mock_response( - "/fake/something/with-id", HTTPStatus.OK, None, "fake", "GET_{id}_response.json" + "/fake/something/with-id", HTTPStatus.OK, None, "v2", "fake", "GET_{id}_response.json" ) entity = entity_manager["with-id"] client.get.assert_called_with(client.get.return_value.url) @@ -151,7 +155,7 @@ def test_entity_manager_is_a_generator(self): client = MagicMock() entity_manager = EntityManager(self.TARGET_ENDPOINT, client, "/fake/something") client.get.return_value = self.mock_response( - "/fake/something/with-id", HTTPStatus.OK, None, "fake", "GET_{id}_response.json" + "/fake/something/with-id", HTTPStatus.OK, None, "v2", "fake", "GET_{id}_response.json" ) self.assertIsNotNone(getattr(entity_manager, "__iter__", None)) @@ -164,7 +168,7 @@ def test_entity_list_is_a_generator(self): client = MagicMock() entity_manager = EntityManager(self.TARGET_ENDPOINT, client, "/fake/something") client.get.return_value = self.mock_response( - "/fake/something/with-id", HTTPStatus.OK, None, "fake", "GET_{id}_response.json" + "/fake/something/with-id", HTTPStatus.OK, None, "v2", "fake", "GET_{id}_response.json" ) generator = entity_manager.list() @@ -175,7 +179,7 @@ def test_entity_list_is_a_generator(self): def test_total_results(self): client = MagicMock() entity_manager = EntityManager(self.TARGET_ENDPOINT, client, "/fake/something") - client.get.return_value = self.mock_response("/fake/something", HTTPStatus.OK, None, "fake", "GET_response.json") + client.get.return_value = self.mock_response("/fake/something", HTTPStatus.OK, None, "v2", "fake", "GET_response.json") cpt = entity_manager.list().total_results diff --git a/tests/v3/test_entities.py b/tests/v3/test_entities.py index 4daee4f..65924ef 100644 --- a/tests/v3/test_entities.py +++ b/tests/v3/test_entities.py @@ -1,4 +1,5 @@ import unittest +from functools import reduce from http import HTTPStatus from unittest.mock import MagicMock @@ -49,3 +50,36 @@ def test_elements_are_entities(self): for entity in entities_list: self.assertIsInstance(entity, Entity) + + def test_list_pagination(self): + client = MagicMock() + + entity_manager = EntityManager(self.TARGET_ENDPOINT, client, "/fake") + first_response = self.mock_response( + "/fake", + HTTPStatus.OK, + None, + "v3", "fake", + "GET_multi_page_0_response.json", + ) + second_response = self.mock_response( + "/fake/last?order-direction=asc&page=2&results-per-page=50", + HTTPStatus.OK, + None, + "v3", "fake", + "GET_multi_page_1_response.json", + ) + + client.get.side_effect = [first_response, second_response] + + guids = reduce( + lambda c, entity: c.append(entity["guid"]) or c, + entity_manager.list(), + [], + ) + self.assertEqual(guids, [ + "1cb006ee-fb05-47e1-b541-c34179ddc446", + "02b4ec9b-94c7-4468-9c23-4e906191a0f8", + "1cb006ee-fb05-47e1-b541-c34179ddc447", + "02b4ec9b-94c7-4468-9c23-4e906191a0f9", + ])