Сервис на FastAPI для создания задач через REST API. Задачи создаются со статусом NEW, затем воркер-паблишер ставит их в очередь RabbitMQ, а воркер-консьюмер обрабатывает их асинхронно. Все задачи находятся в app/tasks, есть задачи которые всегда вызывают ошибку
- FastAPI
- PostgreSQL в качестве основной БД, SQLAlchemy, asyncpg alembic для миграций
- RabbitMQ + aio-pika
- Docker, docker-compose для локальной отладки
- testcontainers для автоматического запуска PostgreSQL в тестах
- API Сервис (
app): FastAPI сервис, который создает задачи со статусом NEW - Воркер-паблишер (
publisher): Воркер, который опрашивает задачи со статусом NEW и публикует их в RabbitMQ (помечает как PENDING) - Воркер-консьюмер (
consumer): Воркер, который потребляет задачи из RabbitMQ и обрабатывает их
Сборка и запуск одной командой
make run
- Документация API: http://localhost:8000/docs
Сервис запускает 5 сервисов:
rabbitmq- Брокер сообщенийpostgres- База данныхapp: FastAPI инстанс на uvicornpublisher: Воркер, который публикует задачи со статусом PENDING в очередь (в 3 инстансах)consumer: Воркер, который обрабатывает задачи из очереди (в 3 инстансах)
Примечание: кол-во инстансов publisher и consumer можно изменить через значение replicas в docker-compose.yml
Набор тестов включает как модульные, так и интеграционные тесты:
-
Модульные тесты (
tests/unit/):test_task_model.py- Методы модели Task и переходы статусовtest_task_service.py- Бизнес-логика TaskService (create, list, get, cancel)test_repository.py- Тесты репозитория для работы с БДtest_task_registry.py- Реестр типов задачtest_task_implementations.py- Реализации различных типов задачtest_publisher.py- RabbitMQ издатель с мокированиемtest_consumer.py- Тесты потребителя задач
-
Интеграционные тесты (
tests/integration/):test_api_tasks.py- Полное тестирование API endpoints с HTTP клиентом
Особенности тестового окружения:
- Используется testcontainers для автоматического запуска PostgreSQL контейнера
- Не требуется ручная настройка PostgreSQL - контейнер запускается и останавливается автоматически
- Тесты используют реальную PostgreSQL БД для максимальной совместимости с production
Требования для запуска тестов:
- Docker должен быть запущен (для testcontainers)
- Python 3.13+
Запуск тестов:
make testИли напрямую:
pytest tests- POST
/api/v1/tasks— создать задачу - GET
/api/v1/tasks— список задач с фильтрами и пагинацией - GET
/api/v1/tasks/{task_id}— детали задачи - GET
/api/v1/tasks/{task_id}/status— только статус - DELETE
/api/v1/tasks/{task_id}— отменить