diff --git a/rapyuta_io_sdk_v2/async_client.py b/rapyuta_io_sdk_v2/async_client.py index 0abd63f..f9328ec 100644 --- a/rapyuta_io_sdk_v2/async_client.py +++ b/rapyuta_io_sdk_v2/async_client.py @@ -17,6 +17,7 @@ import httpx from munch import Munch +from yaml import safe_load from rapyuta_io_sdk_v2.config import Configuration from rapyuta_io_sdk_v2.utils import handle_and_munchify_response, handle_server_errors @@ -1235,7 +1236,6 @@ async def commit_revision( json=config_tree_revision, ) - @handle_and_munchify_response async def get_key_in_revision( self, tree_name: str, @@ -1243,7 +1243,7 @@ async def get_key_in_revision( key: str, project_guid: str = None, **kwargs, - ) -> Munch: + ): """Get a key in a revision. Args: @@ -1256,10 +1256,14 @@ async def get_key_in_revision( Munch: Key details as a Munch object. """ - return await self.c.get( + result = await self.c.get( url=f"{self.v2api_host}/v2/configtrees/{tree_name}/revisions/{revision_id}/{key}/", headers=self.config.get_headers(project_guid=project_guid, **kwargs), ) + # The data received from the API is always in string format. To use + # appropriate data-type in Python (as well in exports), we are + # passing it through YAML parser. + return safe_load(result.text) @handle_and_munchify_response async def put_key_in_revision( diff --git a/rapyuta_io_sdk_v2/client.py b/rapyuta_io_sdk_v2/client.py index 3c413ba..98391d1 100644 --- a/rapyuta_io_sdk_v2/client.py +++ b/rapyuta_io_sdk_v2/client.py @@ -17,6 +17,7 @@ import httpx from munch import Munch +from yaml import safe_load from rapyuta_io_sdk_v2.config import Configuration from rapyuta_io_sdk_v2.utils import handle_and_munchify_response, handle_server_errors @@ -1218,7 +1219,6 @@ def commit_revision( json=config_tree_revision, ) - @handle_and_munchify_response def get_key_in_revision( self, tree_name: str, @@ -1226,7 +1226,7 @@ def get_key_in_revision( key: str, project_guid: str = None, **kwargs, - ) -> Munch: + ): """Get a key in a revision. Args: @@ -1239,10 +1239,14 @@ def get_key_in_revision( Munch: Key details as a Munch object. """ - return self.c.get( - url=f"{self.v2api_host}/v2/configtrees/{tree_name}/revisions/{revision_id}/{key}/", + result = self.c.get( + url=f"{self.v2api_host}/v2/configtrees/{tree_name}/revisions/{revision_id}/{key}", headers=self.config.get_headers(project_guid=project_guid, **kwargs), ) + # The data received from the API is always in string format. To use + # appropriate data-type in Python (as well in exports), we are + # passing it through YAML parser. + return safe_load(result.text) @handle_and_munchify_response def put_key_in_revision( diff --git a/tests/async_tests/test_configtree_async.py b/tests/async_tests/test_configtree_async.py index 8976496..ab16df6 100644 --- a/tests/async_tests/test_configtree_async.py +++ b/tests/async_tests/test_configtree_async.py @@ -276,27 +276,57 @@ async def test_commit_revision_success(client, mocker: AsyncMock): # noqa: F811 @pytest.mark.asyncio -async def test_get_key_in_revision(client, mocker: AsyncMock): # noqa: F811 +async def test_get_key_in_revision_str(client, mocker: AsyncMock): # noqa: F811 # Mock the httpx.AsyncClient.get method mock_get = mocker.patch("httpx.AsyncClient.get") # Set up the mock response - mock_get.return_value = httpx.Response( - status_code=200, - json={ - "metadata": {"guid": "test_revision_guid", "name": "test_revision"}, - }, + mock_get.return_value = httpx.Response(status_code=200, text="test_value") + + # Call the get_key_in_revision method + response = await client.get_key_in_revision( + tree_name="mock_configtree_name", revision_id="mock_revision_id", key="mock_key" ) + # Validate the response + assert isinstance(response, str) + assert response == "test_value" + + +@pytest.mark.asyncio +async def test_get_key_in_revision_int(client, mocker: AsyncMock): # noqa: F811 + # Mock the httpx.AsyncClient.get method + mock_get = mocker.patch("httpx.AsyncClient.get") + + # Set up the mock response + mock_get.return_value = httpx.Response(status_code=200, text="999") + # Call the get_key_in_revision method response = await client.get_key_in_revision( tree_name="mock_configtree_name", revision_id="mock_revision_id", key="mock_key" ) # Validate the response - assert isinstance(response, Munch) - assert response.metadata.guid == "test_revision_guid" - assert response.metadata.name == "test_revision" + assert isinstance(response, int) + assert response == 999 + + +@pytest.mark.asyncio +async def test_get_key_in_revision_bool(client, mocker: AsyncMock): # noqa: F811 + # Mock the httpx.AsyncClient.get method + mock_get = mocker.patch("httpx.AsyncClient.get") + + # Set up the mock response + mock_get.return_value = httpx.Response(status_code=200, text="false") + + # Call the get_key_in_revision method + response = await client.get_key_in_revision( + tree_name="mock_configtree_name", revision_id="mock_revision_id", key="mock_key" + ) + + # Validate the response + assert isinstance(response, bool) + assert not response @pytest.mark.asyncio diff --git a/tests/sync_tests/test_configtree.py b/tests/sync_tests/test_configtree.py index 3d2f27a..8cf6dd1 100644 --- a/tests/sync_tests/test_configtree.py +++ b/tests/sync_tests/test_configtree.py @@ -258,16 +258,14 @@ def test_commit_revision_success(client, mocker: MockFixture): # noqa: F811 assert response.metadata.name == "test_revision" -def test_get_key_in_revision(client, mocker: MockFixture): # noqa: F811 +def test_get_key_in_revision_str(client, mocker: MockFixture): # noqa: F811 # Mock the httpx.Client.get method mock_get = mocker.patch("httpx.Client.get") # Set up the mock response mock_get.return_value = httpx.Response( status_code=200, - json={ - "metadata": {"guid": "test_revision_guid", "name": "test_revision"}, - }, + text="test_value", ) # Call the get_key_in_revision method @@ -276,9 +274,48 @@ def test_get_key_in_revision(client, mocker: MockFixture): # noqa: F811 ) # Validate the response - assert isinstance(response, Munch) - assert response.metadata.guid == "test_revision_guid" - assert response.metadata.name == "test_revision" + assert isinstance(response, str) + assert response == "test_value" + + +def test_get_key_in_revision_int(client, mocker: MockFixture): # noqa: F811 + # Mock the httpx.Client.get method + mock_get = mocker.patch("httpx.Client.get") + + # Set up the mock response + mock_get.return_value = httpx.Response( + status_code=200, + text="1500", + ) + + # Call the get_key_in_revision method + response = client.get_key_in_revision( + tree_name="mock_configtree_name", revision_id="mock_revision_id", key="mock_key" + ) + + # Validate the response + assert isinstance(response, int) + assert response == 1500 + + +def test_get_key_in_revision_bool(client, mocker: MockFixture): # noqa: F811 + # Mock the httpx.Client.get method + mock_get = mocker.patch("httpx.Client.get") + + # Set up the mock response + mock_get.return_value = httpx.Response( + status_code=200, + text="true", + ) + + # Call the get_key_in_revision method + response = client.get_key_in_revision( + tree_name="mock_configtree_name", revision_id="mock_revision_id", key="mock_key" + ) + + # Validate the response + assert isinstance(response, bool) + assert response def test_put_key_in_revision_success(client, mocker: MockFixture): # noqa: F811