mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 09:57:37 +03:00 
			
		
		
		
	Refactor aiohttp tutorial tests section
This commit is contained in:
		
							parent
							
								
									b474b391af
								
							
						
					
					
						commit
						c84bbd8c51
					
				| 
						 | 
					@ -635,30 +635,32 @@ The search works!
 | 
				
			||||||
Make some refactoring
 | 
					Make some refactoring
 | 
				
			||||||
---------------------
 | 
					---------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Our ``index`` view has two hardcoded config values:
 | 
					Our ``index`` handler has two hardcoded config values:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Default search query
 | 
					- Default search query
 | 
				
			||||||
- Default results limit
 | 
					- Default results limit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Let's make some refactoring. We will move these values to the config.
 | 
					Let's make some refactoring. We will move these values to the config.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Edit ``views.py``:
 | 
					Edit ``handlers.py``:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code-block:: python
 | 
					.. code-block:: python
 | 
				
			||||||
   :emphasize-lines: 11-12,14-15
 | 
					   :emphasize-lines: 13-14,16-17
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   """Handlers module."""
 | 
					   """Handlers module."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   from aiohttp import web
 | 
					   from aiohttp import web
 | 
				
			||||||
 | 
					   from dependency_injector.wiring import Provide
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   from .services import SearchService
 | 
					   from .services import SearchService
 | 
				
			||||||
 | 
					   from .containers import Container
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   async def index(
 | 
					   async def index(
 | 
				
			||||||
           request: web.Request,
 | 
					           request: web.Request,
 | 
				
			||||||
           search_service: SearchService,
 | 
					           search_service: SearchService = Provide[Container.search_service],
 | 
				
			||||||
           default_query: str,
 | 
					           default_query: str = Provide[Container.config.default.query],
 | 
				
			||||||
           default_limit: int,
 | 
					           default_limit: int = Provide[Container.config.default.limit.as_int()],
 | 
				
			||||||
   ) -> web.Response:
 | 
					   ) -> web.Response:
 | 
				
			||||||
       query = request.query.get('query', default_query)
 | 
					       query = request.query.get('query', default_query)
 | 
				
			||||||
       limit = int(request.query.get('limit', default_limit))
 | 
					       limit = int(request.query.get('limit', default_limit))
 | 
				
			||||||
| 
						 | 
					@ -673,48 +675,7 @@ Edit ``views.py``:
 | 
				
			||||||
           },
 | 
					           },
 | 
				
			||||||
       )
 | 
					       )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Now we need to inject these values. Let's update the container.
 | 
					Let's update the config.
 | 
				
			||||||
 | 
					 | 
				
			||||||
Edit ``containers.py``:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: python
 | 
					 | 
				
			||||||
   :emphasize-lines: 31-32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   """Application containers module."""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   from dependency_injector import containers, providers
 | 
					 | 
				
			||||||
   from dependency_injector.ext import aiohttp
 | 
					 | 
				
			||||||
   from aiohttp import web
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   from . import giphy, services, views
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   class ApplicationContainer(containers.DeclarativeContainer):
 | 
					 | 
				
			||||||
       """Application container."""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       app = aiohttp.Application(web.Application)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       config = providers.Configuration()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       giphy_client = providers.Factory(
 | 
					 | 
				
			||||||
           giphy.GiphyClient,
 | 
					 | 
				
			||||||
           api_key=config.giphy.api_key,
 | 
					 | 
				
			||||||
           timeout=config.giphy.request_timeout,
 | 
					 | 
				
			||||||
       )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       search_service = providers.Factory(
 | 
					 | 
				
			||||||
           services.SearchService,
 | 
					 | 
				
			||||||
           giphy_client=giphy_client,
 | 
					 | 
				
			||||||
       )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       index_view = aiohttp.View(
 | 
					 | 
				
			||||||
           views.index,
 | 
					 | 
				
			||||||
           search_service=search_service,
 | 
					 | 
				
			||||||
           default_query=config.search.default_query,
 | 
					 | 
				
			||||||
           default_limit=config.search.default_limit,
 | 
					 | 
				
			||||||
       )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Finally let's update the config.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Edit ``config.yml``:
 | 
					Edit ``config.yml``:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -723,26 +684,21 @@ Edit ``config.yml``:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   giphy:
 | 
					   giphy:
 | 
				
			||||||
     request_timeout: 10
 | 
					     request_timeout: 10
 | 
				
			||||||
   search:
 | 
					   default:
 | 
				
			||||||
     default_query: "Dependency Injector"
 | 
					     query: "Dependency Injector"
 | 
				
			||||||
     default_limit: 10
 | 
					     limit: 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The refactoring is done. We've made it cleaner - hardcoded values are now moved to the config.
 | 
					The refactoring is done. We've made it cleaner - hardcoded values are now moved to the config.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
In the next section we will add some tests.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Tests
 | 
					Tests
 | 
				
			||||||
-----
 | 
					-----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
It would be nice to add some tests. Let's do it.
 | 
					In this section we will add some tests.
 | 
				
			||||||
 | 
					 | 
				
			||||||
We will use `pytest <https://docs.pytest.org/en/stable/>`_ and
 | 
					 | 
				
			||||||
`coverage <https://coverage.readthedocs.io/>`_.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Create ``tests.py`` module in the ``giphynavigator`` package:
 | 
					Create ``tests.py`` module in the ``giphynavigator`` package:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code-block:: bash
 | 
					.. code-block:: bash
 | 
				
			||||||
   :emphasize-lines: 8
 | 
					   :emphasize-lines: 9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   ./
 | 
					   ./
 | 
				
			||||||
   ├── giphynavigator/
 | 
					   ├── giphynavigator/
 | 
				
			||||||
| 
						 | 
					@ -750,16 +706,17 @@ Create ``tests.py`` module in the ``giphynavigator`` package:
 | 
				
			||||||
   │   ├── application.py
 | 
					   │   ├── application.py
 | 
				
			||||||
   │   ├── containers.py
 | 
					   │   ├── containers.py
 | 
				
			||||||
   │   ├── giphy.py
 | 
					   │   ├── giphy.py
 | 
				
			||||||
 | 
					   │   ├── handlers.py
 | 
				
			||||||
   │   ├── services.py
 | 
					   │   ├── services.py
 | 
				
			||||||
   │   ├── tests.py
 | 
					   │   └── tests.py
 | 
				
			||||||
   │   └── views.py
 | 
					 | 
				
			||||||
   ├── venv/
 | 
					   ├── venv/
 | 
				
			||||||
 | 
					   ├── config.yml
 | 
				
			||||||
   └── requirements.txt
 | 
					   └── requirements.txt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
and put next into it:
 | 
					and put next into it:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code-block:: python
 | 
					.. code-block:: python
 | 
				
			||||||
   :emphasize-lines: 30,57,71
 | 
					   :emphasize-lines: 32,59,73
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   """Tests module."""
 | 
					   """Tests module."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -773,7 +730,9 @@ and put next into it:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   @pytest.fixture
 | 
					   @pytest.fixture
 | 
				
			||||||
   def app():
 | 
					   def app():
 | 
				
			||||||
       return create_app()
 | 
					       app = create_app()
 | 
				
			||||||
 | 
					       yield app
 | 
				
			||||||
 | 
					       app.container.unwire()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   @pytest.fixture
 | 
					   @pytest.fixture
 | 
				
			||||||
| 
						 | 
					@ -836,8 +795,8 @@ and put next into it:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       assert response.status == 200
 | 
					       assert response.status == 200
 | 
				
			||||||
       data = await response.json()
 | 
					       data = await response.json()
 | 
				
			||||||
       assert data['query'] == app.container.config.search.default_query()
 | 
					       assert data['query'] == app.container.config.default.query()
 | 
				
			||||||
       assert data['limit'] == app.container.config.search.default_limit()
 | 
					       assert data['limit'] == app.container.config.default.limit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Now let's run it and check the coverage:
 | 
					Now let's run it and check the coverage:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -847,7 +806,7 @@ Now let's run it and check the coverage:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You should see:
 | 
					You should see:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code-block:: bash
 | 
					.. code-block::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   platform darwin -- Python 3.8.3, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
 | 
					   platform darwin -- Python 3.8.3, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
 | 
				
			||||||
   plugins: cov-2.10.0, aiohttp-0.3.0, asyncio-0.14.0
 | 
					   plugins: cov-2.10.0, aiohttp-0.3.0, asyncio-0.14.0
 | 
				
			||||||
| 
						 | 
					@ -859,15 +818,14 @@ You should see:
 | 
				
			||||||
   Name                            Stmts   Miss  Cover
 | 
					   Name                            Stmts   Miss  Cover
 | 
				
			||||||
   ---------------------------------------------------
 | 
					   ---------------------------------------------------
 | 
				
			||||||
   giphynavigator/__init__.py          0      0   100%
 | 
					   giphynavigator/__init__.py          0      0   100%
 | 
				
			||||||
   giphynavigator/__main__.py          5      5     0%
 | 
					   giphynavigator/application.py      12      0   100%
 | 
				
			||||||
   giphynavigator/application.py      10      0   100%
 | 
					   giphynavigator/containers.py        6      0   100%
 | 
				
			||||||
   giphynavigator/containers.py       10      0   100%
 | 
					 | 
				
			||||||
   giphynavigator/giphy.py            14      9    36%
 | 
					   giphynavigator/giphy.py            14      9    36%
 | 
				
			||||||
 | 
					   giphynavigator/handlers.py          9      0   100%
 | 
				
			||||||
   giphynavigator/services.py          9      1    89%
 | 
					   giphynavigator/services.py          9      1    89%
 | 
				
			||||||
   giphynavigator/tests.py            35      0   100%
 | 
					   giphynavigator/tests.py            37      0   100%
 | 
				
			||||||
   giphynavigator/views.py             7      0   100%
 | 
					 | 
				
			||||||
   ---------------------------------------------------
 | 
					   ---------------------------------------------------
 | 
				
			||||||
   TOTAL                              90     15    83%
 | 
					   TOTAL                              87     10    89%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					.. note::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user