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']] 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)