From 276d11927e9f720891710185823e49380b0d5f9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=ADgor=20Fonseca?= Date: Tue, 13 Sep 2022 11:55:18 -0300 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20adding=20integration=20to=20retriev?= =?UTF-8?q?e=20Pok=C3=A9mons=20listing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/pokemon.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/controllers/pokemon.py b/src/controllers/pokemon.py index 01d8341..945d9ba 100644 --- a/src/controllers/pokemon.py +++ b/src/controllers/pokemon.py @@ -1,3 +1,7 @@ +from dataclasses import dataclass +from typing import Dict, List + +import requests from fastapi import APIRouter router = APIRouter( @@ -5,6 +9,24 @@ ) +@dataclass +class PokemonDTO: + name: str + url: str + + @router.get("") -async def root(): - return {"message": "Hello World"} +async def list_pokemon(page: int = 1): + limit = 20 + offset = page - 1 + url = f'https://pokeapi.co/api/v2/pokemon?offset={offset}&limit={limit}' + + r = requests.get(url, auth=('origin-user', + 'eyJhbGciOiJIUzI1NiJ9.eyJSb2xlIjoiQWRtaW4iLCJJc3N1ZXIiOiJJc3N1ZXIiLCJVc2VybmFtZSI6IkphdmFJblVzZSIsImV4cCI6MTY2MjA0MjMzNCwiaWF0IjoxNjYyMDQyMzM0fQ.xi3uKpbHXXxE5iTOkDrkHJfpXQhGQGjLHXwC1SE-kFI')) + + r2 = r.json() + return map_dict(r2) + + +def map_dict(response: Dict) -> List[PokemonDTO]: + return [PokemonDTO(name=item['name'], url=item['url']) for item in response['results']] From 065feb48130c22238717f6144a669fadb32ef4b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=ADgor=20Fonseca?= Date: Tue, 13 Sep 2022 11:57:39 -0300 Subject: [PATCH 2/2] =?UTF-8?q?test:=20add=20integration=20test=20for=20Po?= =?UTF-8?q?k=C3=A9mon=20listing=20route?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tests/__init__.py | 0 src/tests/integration/__init__.py | 0 src/tests/integration/controllers/__init__.py | 0 .../integration/controllers/test_pokemon.py | 18 ++++++++++++++++++ 4 files changed, 18 insertions(+) create mode 100644 src/tests/__init__.py create mode 100644 src/tests/integration/__init__.py create mode 100644 src/tests/integration/controllers/__init__.py create mode 100644 src/tests/integration/controllers/test_pokemon.py diff --git a/src/tests/__init__.py b/src/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/integration/__init__.py b/src/tests/integration/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/integration/controllers/__init__.py b/src/tests/integration/controllers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/integration/controllers/test_pokemon.py b/src/tests/integration/controllers/test_pokemon.py new file mode 100644 index 0000000..2ae22c9 --- /dev/null +++ b/src/tests/integration/controllers/test_pokemon.py @@ -0,0 +1,18 @@ +from unittest import IsolatedAsyncioTestCase +from unittest.mock import patch, ANY + +import requests + +from src.controllers.pokemon import list_pokemon + + +class TestPokemonController(IsolatedAsyncioTestCase): + async def test_1(self): + with patch.object(requests, 'get') as mocked_request: + await list_pokemon(page=1) + mocked_request.assert_called_once_with('https://pokeapi.co/api/v2/pokemon?offset=0&limit=20', auth=ANY) + + async def test_2(self): + with patch.object(requests, 'get') as mocked_request: + await list_pokemon(page=2) + mocked_request.assert_called_once_with('https://pokeapi.co/api/v2/pokemon?offset=20&limit=20', auth=ANY)