mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 18:07:44 +03:00 
			
		
		
		
	Update examples
This commit is contained in:
		
							parent
							
								
									be7abb3ec7
								
							
						
					
					
						commit
						d950c0d7ef
					
				| 
						 | 
				
			
			@ -18,7 +18,7 @@ In this tutorial we will use:
 | 
			
		|||
 | 
			
		||||
- Python 3
 | 
			
		||||
- Docker
 | 
			
		||||
- Docker-compose
 | 
			
		||||
- Docker Compose
 | 
			
		||||
 | 
			
		||||
Start from the scratch or jump to the section:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -47,28 +47,27 @@ response it will log:
 | 
			
		|||
Prerequisites
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
We will use `Docker <https://www.docker.com/>`_ and
 | 
			
		||||
`docker-compose <https://docs.docker.com/compose/>`_ in this tutorial. Let's check the versions:
 | 
			
		||||
We will use `docker compose <https://docs.docker.com/compose/>`_ in this tutorial. Let's check the versions:
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker --version
 | 
			
		||||
   docker-compose --version
 | 
			
		||||
   docker compose version
 | 
			
		||||
 | 
			
		||||
The output should look something like:
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   Docker version 20.10.5, build 55c4c88
 | 
			
		||||
   docker-compose version 1.29.0, build 07737305
 | 
			
		||||
   Docker version 27.3.1, build ce12230
 | 
			
		||||
   Docker Compose version v2.29.7
 | 
			
		||||
 | 
			
		||||
.. note::
 | 
			
		||||
 | 
			
		||||
   If you don't have ``Docker`` or ``docker-compose`` you need to install them before proceeding.
 | 
			
		||||
   If you don't have ``Docker`` or ``docker compose`` you need to install them before proceeding.
 | 
			
		||||
   Follow these installation guides:
 | 
			
		||||
 | 
			
		||||
   - `Install Docker <https://docs.docker.com/get-docker/>`_
 | 
			
		||||
   - `Install docker-compose <https://docs.docker.com/compose/install/>`_
 | 
			
		||||
   - `Install docker compose <https://docs.docker.com/compose/install/>`_
 | 
			
		||||
 | 
			
		||||
The prerequisites are satisfied. Let's get started with the project layout.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -129,13 +128,13 @@ Put next lines into the ``requirements.txt`` file:
 | 
			
		|||
   pytest-cov
 | 
			
		||||
 | 
			
		||||
Second, we need to create the ``Dockerfile``. It will describe the daemon's build process and
 | 
			
		||||
specify how to run it. We will use ``python:3.9-buster`` as a base image.
 | 
			
		||||
specify how to run it. We will use ``python:3.13-bookworm`` as a base image.
 | 
			
		||||
 | 
			
		||||
Put next lines into the ``Dockerfile`` file:
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   FROM python:3.10-buster
 | 
			
		||||
   FROM python:3.13-bookworm
 | 
			
		||||
 | 
			
		||||
   ENV PYTHONUNBUFFERED=1
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -155,8 +154,6 @@ Put next lines into the ``docker-compose.yml`` file:
 | 
			
		|||
 | 
			
		||||
.. code-block:: yaml
 | 
			
		||||
 | 
			
		||||
   version: "3.7"
 | 
			
		||||
 | 
			
		||||
   services:
 | 
			
		||||
 | 
			
		||||
     monitor:
 | 
			
		||||
| 
						 | 
				
			
			@ -171,7 +168,7 @@ Run in the terminal:
 | 
			
		|||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose build
 | 
			
		||||
   docker compose build
 | 
			
		||||
 | 
			
		||||
The build process may take a couple of minutes. You should see something like this in the end:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -184,7 +181,7 @@ After the build is done run the container:
 | 
			
		|||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose up
 | 
			
		||||
   docker compose up
 | 
			
		||||
 | 
			
		||||
The output should look like:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -461,7 +458,7 @@ Run in the terminal:
 | 
			
		|||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose up
 | 
			
		||||
   docker compose up
 | 
			
		||||
 | 
			
		||||
The output should look like:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -705,7 +702,7 @@ Run in the terminal:
 | 
			
		|||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose up
 | 
			
		||||
   docker compose up
 | 
			
		||||
 | 
			
		||||
You should see:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -813,7 +810,7 @@ Run in the terminal:
 | 
			
		|||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose up
 | 
			
		||||
   docker compose up
 | 
			
		||||
 | 
			
		||||
You should see:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -965,15 +962,16 @@ Run in the terminal:
 | 
			
		|||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose run --rm monitor py.test monitoringdaemon/tests.py --cov=monitoringdaemon
 | 
			
		||||
   docker compose run --rm monitor py.test monitoringdaemon/tests.py --cov=monitoringdaemon
 | 
			
		||||
 | 
			
		||||
You should see:
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   platform linux -- Python 3.10.0, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
 | 
			
		||||
   platform linux -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
 | 
			
		||||
   rootdir: /code
 | 
			
		||||
   plugins: asyncio-0.16.0, cov-3.0.0
 | 
			
		||||
   plugins: cov-6.0.0, asyncio-0.24.0
 | 
			
		||||
   asyncio: mode=Mode.STRICT, default_loop_scope=None
 | 
			
		||||
   collected 2 items
 | 
			
		||||
 | 
			
		||||
   monitoringdaemon/tests.py ..                                    [100%]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -98,8 +98,9 @@ The output should be something like:
 | 
			
		|||
 | 
			
		||||
.. code-block::
 | 
			
		||||
 | 
			
		||||
   platform darwin -- Python 3.10.0, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
 | 
			
		||||
   plugins: asyncio-0.16.0, anyio-3.3.4, aiohttp-0.3.0, cov-3.0.0
 | 
			
		||||
   platform linux -- Python 3.12.3, pytest-8.3.2, pluggy-1.5.0
 | 
			
		||||
   plugins: cov-6.0.0, anyio-4.4.0, asyncio-0.24.0, aiohttp-1.0.5
 | 
			
		||||
   asyncio: mode=Mode.STRICT, default_loop_scope=None
 | 
			
		||||
   collected 3 items
 | 
			
		||||
 | 
			
		||||
   giphynavigator/tests.py ...                                     [100%]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,11 +3,15 @@
 | 
			
		|||
from unittest import mock
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
import pytest_asyncio
 | 
			
		||||
 | 
			
		||||
from giphynavigator.application import create_app
 | 
			
		||||
from giphynavigator.giphy import GiphyClient
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
pytestmark = pytest.mark.asyncio
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.fixture
 | 
			
		||||
def app():
 | 
			
		||||
    app = create_app()
 | 
			
		||||
| 
						 | 
				
			
			@ -15,9 +19,9 @@ def app():
 | 
			
		|||
    app.container.unwire()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.fixture
 | 
			
		||||
def client(app, aiohttp_client, loop):
 | 
			
		||||
    return loop.run_until_complete(aiohttp_client(app))
 | 
			
		||||
@pytest_asyncio.fixture
 | 
			
		||||
async def client(app, aiohttp_client):
 | 
			
		||||
    return await aiohttp_client(app)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def test_index(client, app):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,4 +2,5 @@ dependency-injector
 | 
			
		|||
aiohttp
 | 
			
		||||
pyyaml
 | 
			
		||||
pytest-aiohttp
 | 
			
		||||
pytest-asyncio
 | 
			
		||||
pytest-cov
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
FROM python:3.10-buster
 | 
			
		||||
FROM python:3.13-bookworm
 | 
			
		||||
 | 
			
		||||
ENV PYTHONUNBUFFERED=1
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,13 +13,13 @@ Build the Docker image:
 | 
			
		|||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose build
 | 
			
		||||
   docker compose build
 | 
			
		||||
 | 
			
		||||
Run the docker-compose environment:
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
    docker-compose up
 | 
			
		||||
    docker compose up
 | 
			
		||||
 | 
			
		||||
The output should be something like:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -59,15 +59,16 @@ To run the tests do:
 | 
			
		|||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose run --rm monitor py.test monitoringdaemon/tests.py --cov=monitoringdaemon
 | 
			
		||||
   docker compose run --rm monitor py.test monitoringdaemon/tests.py --cov=monitoringdaemon
 | 
			
		||||
 | 
			
		||||
The output should be something like:
 | 
			
		||||
 | 
			
		||||
.. code-block::
 | 
			
		||||
 | 
			
		||||
   platform linux -- Python 3.10.0, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
 | 
			
		||||
   platform linux -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
 | 
			
		||||
   rootdir: /code
 | 
			
		||||
   plugins: asyncio-0.16.0, cov-3.0.0
 | 
			
		||||
   plugins: cov-6.0.0, asyncio-0.24.0
 | 
			
		||||
   asyncio: mode=Mode.STRICT, default_loop_scope=None
 | 
			
		||||
   collected 2 items
 | 
			
		||||
 | 
			
		||||
   monitoringdaemon/tests.py ..                                    [100%]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,7 +61,7 @@ async def test_example_monitor(container, caplog):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.asyncio
 | 
			
		||||
async def test_dispatcher(container, caplog, event_loop):
 | 
			
		||||
async def test_dispatcher(container, caplog):
 | 
			
		||||
    caplog.set_level("INFO")
 | 
			
		||||
 | 
			
		||||
    example_monitor_mock = mock.AsyncMock()
 | 
			
		||||
| 
						 | 
				
			
			@ -72,6 +72,7 @@ async def test_dispatcher(container, caplog, event_loop):
 | 
			
		|||
            httpbin_monitor=httpbin_monitor_mock,
 | 
			
		||||
    ):
 | 
			
		||||
        dispatcher = container.dispatcher()
 | 
			
		||||
        event_loop = asyncio.get_running_loop()
 | 
			
		||||
        event_loop.create_task(dispatcher.start())
 | 
			
		||||
        await asyncio.sleep(0.1)
 | 
			
		||||
        dispatcher.stop()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
FROM python:3.10-buster
 | 
			
		||||
FROM python:3.13-bookworm
 | 
			
		||||
 | 
			
		||||
ENV PYTHONUNBUFFERED=1
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,13 +12,13 @@ Build the Docker image:
 | 
			
		|||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose build
 | 
			
		||||
   docker compose build
 | 
			
		||||
 | 
			
		||||
Run the docker-compose environment:
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
    docker-compose up
 | 
			
		||||
    docker compose up
 | 
			
		||||
 | 
			
		||||
The output should be something like:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -54,16 +54,16 @@ To run the tests do:
 | 
			
		|||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose run --rm example py.test fastapiredis/tests.py --cov=fastapiredis
 | 
			
		||||
   docker compose run --rm example py.test fastapiredis/tests.py --cov=fastapiredis
 | 
			
		||||
 | 
			
		||||
The output should be something like:
 | 
			
		||||
 | 
			
		||||
.. code-block::
 | 
			
		||||
 | 
			
		||||
   platform linux -- Python 3.10.9, pytest-7.2.0, pluggy-1.0.0
 | 
			
		||||
   platform linux -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
 | 
			
		||||
   rootdir: /code
 | 
			
		||||
   plugins: cov-4.0.0, asyncio-0.20.3
 | 
			
		||||
   collected 1 item
 | 
			
		||||
   plugins: cov-6.0.0, asyncio-0.24.0, anyio-4.7.0
 | 
			
		||||
   asyncio: mode=Mode.STRICT, default_loop_scope=None
 | 
			
		||||
 | 
			
		||||
   fastapiredis/tests.py .                                         [100%]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -77,4 +77,4 @@ The output should be something like:
 | 
			
		|||
   fastapiredis/services.py          7      3    57%
 | 
			
		||||
   fastapiredis/tests.py            18      0   100%
 | 
			
		||||
   -------------------------------------------------
 | 
			
		||||
   TOTAL                            52      7    87%
 | 
			
		||||
   TOTAL                            52      7    87%
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
from typing import AsyncIterator
 | 
			
		||||
 | 
			
		||||
from aioredis import from_url, Redis
 | 
			
		||||
from redis.asyncio import from_url, Redis
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def init_redis_pool(host: str, password: str) -> AsyncIterator[Redis]:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
"""Services module."""
 | 
			
		||||
 | 
			
		||||
from aioredis import Redis
 | 
			
		||||
from redis.asyncio import Redis
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Service:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
dependency-injector
 | 
			
		||||
fastapi
 | 
			
		||||
uvicorn
 | 
			
		||||
aioredis
 | 
			
		||||
redis>=4.2
 | 
			
		||||
 | 
			
		||||
# For testing:
 | 
			
		||||
pytest
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,13 +1,14 @@
 | 
			
		|||
from unittest import mock
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
import pytest_asyncio
 | 
			
		||||
from httpx import ASGITransport, AsyncClient
 | 
			
		||||
 | 
			
		||||
from fastapi_di_example import app, container, Service
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.fixture
 | 
			
		||||
async def client(event_loop):
 | 
			
		||||
@pytest_asyncio.fixture
 | 
			
		||||
async def client():
 | 
			
		||||
    async with AsyncClient(
 | 
			
		||||
        transport=ASGITransport(app=app),
 | 
			
		||||
        base_url="http://test",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
FROM python:3.10-buster
 | 
			
		||||
FROM python:3.13-bookworm
 | 
			
		||||
 | 
			
		||||
ENV PYTHONUNBUFFERED=1
 | 
			
		||||
ENV HOST=0.0.0.0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,13 +15,13 @@ Build the Docker image:
 | 
			
		|||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose build
 | 
			
		||||
   docker compose build
 | 
			
		||||
 | 
			
		||||
Run the docker-compose environment:
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
    docker-compose up
 | 
			
		||||
    docker compose up
 | 
			
		||||
 | 
			
		||||
The output should be something like:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -67,15 +67,15 @@ To run the tests do:
 | 
			
		|||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose run --rm webapp py.test webapp/tests.py --cov=webapp
 | 
			
		||||
   docker compose run --rm webapp py.test webapp/tests.py --cov=webapp
 | 
			
		||||
 | 
			
		||||
The output should be something like:
 | 
			
		||||
 | 
			
		||||
.. code-block::
 | 
			
		||||
 | 
			
		||||
   platform linux -- Python 3.10.0, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
 | 
			
		||||
   platform linux -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
 | 
			
		||||
   rootdir: /code
 | 
			
		||||
   plugins: cov-3.0.0
 | 
			
		||||
   plugins: cov-6.0.0, anyio-4.7.0
 | 
			
		||||
   collected 7 items
 | 
			
		||||
 | 
			
		||||
   webapp/tests.py .......                                         [100%]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
dependency-injector
 | 
			
		||||
fastapi
 | 
			
		||||
fastapi[standard]
 | 
			
		||||
uvicorn
 | 
			
		||||
pyyaml
 | 
			
		||||
sqlalchemy
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,9 +101,9 @@ The output should be something like:
 | 
			
		|||
 | 
			
		||||
.. code-block::
 | 
			
		||||
 | 
			
		||||
   platform darwin -- Python 3.10.0, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
 | 
			
		||||
   plugins: asyncio-0.16.0, cov-3.0.0
 | 
			
		||||
   collected 3 items
 | 
			
		||||
   platform linux -- Python 3.12.3, pytest-8.3.2, pluggy-1.5.0
 | 
			
		||||
   plugins: cov-6.0.0, anyio-4.4.0, asyncio-0.24.0, aiohttp-1.0.5
 | 
			
		||||
   asyncio: mode=Mode.STRICT, default_loop_scope=None
 | 
			
		||||
 | 
			
		||||
   giphynavigator/tests.py ...                                     [100%]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,13 +3,14 @@
 | 
			
		|||
from unittest import mock
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
import pytest_asyncio
 | 
			
		||||
from httpx import ASGITransport, AsyncClient
 | 
			
		||||
 | 
			
		||||
from giphynavigator.application import app
 | 
			
		||||
from giphynavigator.giphy import GiphyClient
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.fixture
 | 
			
		||||
@pytest_asyncio.fixture
 | 
			
		||||
async def client():
 | 
			
		||||
    async with AsyncClient(
 | 
			
		||||
        transport=ASGITransport(app=app),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -81,8 +81,9 @@ The output should be something like:
 | 
			
		|||
 | 
			
		||||
.. code-block::
 | 
			
		||||
 | 
			
		||||
   platform darwin -- Python 3.10.0, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
 | 
			
		||||
   plugins: cov-3.0.0, flask-1.2.0
 | 
			
		||||
   platform linux -- Python 3.12.3, pytest-8.3.2, pluggy-1.5.0
 | 
			
		||||
   plugins: cov-6.0.0, flask-1.3.0
 | 
			
		||||
   asyncio: mode=Mode.STRICT, default_loop_scope=None
 | 
			
		||||
   collected 2 items
 | 
			
		||||
 | 
			
		||||
   githubnavigator/tests.py ..                                     [100%]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
"""Application module."""
 | 
			
		||||
 | 
			
		||||
from flask import Flask
 | 
			
		||||
from flask_bootstrap import Bootstrap
 | 
			
		||||
from flask_bootstrap import Bootstrap4
 | 
			
		||||
 | 
			
		||||
from .containers import Container
 | 
			
		||||
from .blueprints import example
 | 
			
		||||
| 
						 | 
				
			
			@ -15,7 +15,7 @@ def create_app() -> Flask:
 | 
			
		|||
    app.container = container
 | 
			
		||||
    app.register_blueprint(example.blueprint)
 | 
			
		||||
 | 
			
		||||
    bootstrap = Bootstrap()
 | 
			
		||||
    bootstrap = Bootstrap4()
 | 
			
		||||
    bootstrap.init_app(app)
 | 
			
		||||
 | 
			
		||||
    return app
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -81,8 +81,9 @@ The output should be something like:
 | 
			
		|||
 | 
			
		||||
.. code-block::
 | 
			
		||||
 | 
			
		||||
   platform darwin -- Python 3.10.0, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
 | 
			
		||||
   plugins: cov-3.0.0, flask-1.2.0
 | 
			
		||||
   platform linux -- Python 3.12.3, pytest-8.3.2, pluggy-1.5.0
 | 
			
		||||
   plugins: cov-6.0.0, flask-1.3.0
 | 
			
		||||
   asyncio: mode=Mode.STRICT, default_loop_scope=None
 | 
			
		||||
   collected 2 items
 | 
			
		||||
 | 
			
		||||
   githubnavigator/tests.py ..                                     [100%]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
"""Application module."""
 | 
			
		||||
 | 
			
		||||
from flask import Flask
 | 
			
		||||
from flask_bootstrap import Bootstrap
 | 
			
		||||
from flask_bootstrap import Bootstrap4
 | 
			
		||||
 | 
			
		||||
from .containers import Container
 | 
			
		||||
from . import views
 | 
			
		||||
| 
						 | 
				
			
			@ -15,7 +15,7 @@ def create_app() -> Flask:
 | 
			
		|||
    app.container = container
 | 
			
		||||
    app.add_url_rule("/", "index", views.index)
 | 
			
		||||
 | 
			
		||||
    bootstrap = Bootstrap()
 | 
			
		||||
    bootstrap = Bootstrap4()
 | 
			
		||||
    bootstrap.init_app(app)
 | 
			
		||||
 | 
			
		||||
    return app
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,8 +58,8 @@ The output should be something like:
 | 
			
		|||
 | 
			
		||||
.. code-block::
 | 
			
		||||
 | 
			
		||||
   platform darwin -- Python 3.10.0, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
 | 
			
		||||
   plugins: cov-3.0.0
 | 
			
		||||
   platform linux -- Python 3.12.3, pytest-8.3.2, pluggy-1.5.0
 | 
			
		||||
   plugins: cov-6.0.0
 | 
			
		||||
   collected 2 items
 | 
			
		||||
 | 
			
		||||
   movies/tests.py ..                                              [100%]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ To run the application do:
 | 
			
		|||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
    export GIPHY_API_KEY=wBJ2wZG7SRqfrU9nPgPiWvORmloDyuL0
 | 
			
		||||
    python -m giphynavigator
 | 
			
		||||
    sanic giphynavigator.application:create_app
 | 
			
		||||
 | 
			
		||||
The output should be something like:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -98,8 +98,9 @@ The output should be something like:
 | 
			
		|||
 | 
			
		||||
.. code-block::
 | 
			
		||||
 | 
			
		||||
   platform darwin -- Python 3.10.0, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
 | 
			
		||||
   plugins: sanic-1.9.1, anyio-3.3.4, cov-3.0.0
 | 
			
		||||
   platform linux -- Python 3.12.3, pytest-8.3.2, pluggy-1.5.0
 | 
			
		||||
   plugins: cov-6.0.0, anyio-4.4.0, asyncio-0.24.0
 | 
			
		||||
   asyncio: mode=Mode.STRICT, default_loop_scope=None
 | 
			
		||||
   collected 3 items
 | 
			
		||||
 | 
			
		||||
   giphynavigator/tests.py ...                                     [100%]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,8 @@ from sanic import Sanic
 | 
			
		|||
from giphynavigator.application import create_app
 | 
			
		||||
from giphynavigator.giphy import GiphyClient
 | 
			
		||||
 | 
			
		||||
pytestmark = pytest.mark.asyncio
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.fixture
 | 
			
		||||
def app():
 | 
			
		||||
| 
						 | 
				
			
			@ -17,12 +19,7 @@ def app():
 | 
			
		|||
    app.ctx.container.unwire()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.fixture
 | 
			
		||||
def test_client(loop, app, sanic_client):
 | 
			
		||||
    return loop.run_until_complete(sanic_client(app))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def test_index(app, test_client):
 | 
			
		||||
async def test_index(app):
 | 
			
		||||
    giphy_client_mock = mock.AsyncMock(spec=GiphyClient)
 | 
			
		||||
    giphy_client_mock.search.return_value = {
 | 
			
		||||
        "data": [
 | 
			
		||||
| 
						 | 
				
			
			@ -32,7 +29,7 @@ async def test_index(app, test_client):
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    with app.ctx.container.giphy_client.override(giphy_client_mock):
 | 
			
		||||
        response = await test_client.get(
 | 
			
		||||
        _, response = await app.asgi_client.get(
 | 
			
		||||
            "/",
 | 
			
		||||
            params={
 | 
			
		||||
                "query": "test",
 | 
			
		||||
| 
						 | 
				
			
			@ -41,7 +38,7 @@ async def test_index(app, test_client):
 | 
			
		|||
        )
 | 
			
		||||
 | 
			
		||||
    assert response.status_code == 200
 | 
			
		||||
    data = response.json()
 | 
			
		||||
    data = response.json
 | 
			
		||||
    assert data == {
 | 
			
		||||
        "query": "test",
 | 
			
		||||
        "limit": 10,
 | 
			
		||||
| 
						 | 
				
			
			@ -52,30 +49,30 @@ async def test_index(app, test_client):
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def test_index_no_data(app, test_client):
 | 
			
		||||
async def test_index_no_data(app):
 | 
			
		||||
    giphy_client_mock = mock.AsyncMock(spec=GiphyClient)
 | 
			
		||||
    giphy_client_mock.search.return_value = {
 | 
			
		||||
        "data": [],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    with app.ctx.container.giphy_client.override(giphy_client_mock):
 | 
			
		||||
        response = await test_client.get("/")
 | 
			
		||||
        _, response = await app.asgi_client.get("/")
 | 
			
		||||
 | 
			
		||||
    assert response.status_code == 200
 | 
			
		||||
    data = response.json()
 | 
			
		||||
    data = response.json
 | 
			
		||||
    assert data["gifs"] == []
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def test_index_default_params(app, test_client):
 | 
			
		||||
async def test_index_default_params(app):
 | 
			
		||||
    giphy_client_mock = mock.AsyncMock(spec=GiphyClient)
 | 
			
		||||
    giphy_client_mock.search.return_value = {
 | 
			
		||||
        "data": [],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    with app.ctx.container.giphy_client.override(giphy_client_mock):
 | 
			
		||||
        response = await test_client.get("/")
 | 
			
		||||
        _, response = await app.asgi_client.get("/")
 | 
			
		||||
 | 
			
		||||
    assert response.status_code == 200
 | 
			
		||||
    data = response.json()
 | 
			
		||||
    data = response.json
 | 
			
		||||
    assert data["query"] == app.ctx.container.config.default.query()
 | 
			
		||||
    assert data["limit"] == app.ctx.container.config.default.limit()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
dependency-injector
 | 
			
		||||
sanic<=21.6
 | 
			
		||||
sanic
 | 
			
		||||
sanic-testing
 | 
			
		||||
aiohttp
 | 
			
		||||
pyyaml
 | 
			
		||||
pytest-sanic
 | 
			
		||||
pytest-cov
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user