feat: implement blog project with CI pipeline
All checks were successful
ci/woodpecker/pr/lint Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/type Pipeline was successful
ci/woodpecker/pr/comment_pr Pipeline was successful

This commit is contained in:
2026-04-25 19:15:34 +03:00
parent 9c3b44b561
commit 2e930ffbe5
46 changed files with 1315 additions and 15 deletions

View File

@@ -1,5 +1,5 @@
from contextlib import asynccontextmanager
from unittest.mock import patch
from unittest.mock import Mock, patch
import pytest
from fastapi import FastAPI
@@ -10,19 +10,19 @@ from app.main import app_factory, lifespan, main
@pytest.mark.asyncio
async def test_lifespan():
async def test_lifespan() -> None:
"""Проверяет, что lifespan является корректным асинхронным контекстным менеджером."""
app = FastAPI()
# Проверяем, что lifespan - это asynccontextmanager
assert isinstance(lifespan, asynccontextmanager(lifespan).__class__)
assert isinstance(lifespan, asynccontextmanager(lifespan).__class__) # type: ignore[arg-type]
# Проверяем, что контекстный менеджер работает (ничего не ломается)
async with lifespan(app):
pass # Просто убеждаемся, что yield отрабатывает
def test_app_factory():
"""Проверяет, что app_factory создаёт правильное приложение FastAPI с переданным lifespan."""
def test_app_factory() -> None:
"""Проверяет, что app_factory создаёт приложение FastAPI с переданным lifespan."""
app = app_factory()
assert isinstance(app, FastAPI)
# Проверяем, что lifespan приложения установлен на функцию lifespan
@@ -30,7 +30,7 @@ def test_app_factory():
@patch("app.main.uvicorn.run")
def test_main(mock_uvicorn_run):
def test_main(mock_uvicorn_run: Mock) -> None:
"""Проверяет, что main вызывает uvicorn.run с правильными параметрами."""
main()
mock_uvicorn_run.assert_called_once_with(