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