https://github.com/shasoka/test_for_hitalent
Тестовое задание на позицию "Junior Python разработчик" в компании Hitalent 🤐
https://github.com/shasoka/test_for_hitalent
alembic asyncpg docker fastapi postgresql pydantic pytest rest-api sqlalchemy
Last synced: about 1 month ago
JSON representation
Тестовое задание на позицию "Junior Python разработчик" в компании Hitalent 🤐
- Host: GitHub
- URL: https://github.com/shasoka/test_for_hitalent
- Owner: shasoka
- Created: 2025-09-24T20:47:31.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2025-09-24T22:53:33.000Z (9 months ago)
- Last Synced: 2025-10-05T01:19:21.617Z (8 months ago)
- Topics: alembic, asyncpg, docker, fastapi, postgresql, pydantic, pytest, rest-api, sqlalchemy
- Language: Python
- Homepage:
- Size: 83 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## Тестовое задание: API-сервис для вопросов и ответов
### 1. Развертывание
1. В `./app/` создать `.env` файл с содержимым вида:
```dotenv
# Переменные для pydantic-settings
APP_CONFIG__DB__URL=postgresql+asyncpg://mega_usr:super_pass@db:5432/cool_db
# Переменные для docker-compose
POSTGRES_USER=mega_usr
POSTGRES_PASSWORD=super_pass
POSTGRES_DB=cool_db
```
2. Для обычного запуска - из корня проекта:
```bash
docker compose -f docker-compose.yaml -p hitalent_prod up --build -d
```
Интерактивная документация `Swagger UI` будет доступна по адресу [`http://localhost:8000/`](http://localhost:8000/) (приложение само сделает редирект на `/docs`).
Для прогона тестов - тоже из корня проекта:
```bash
docker compose -f docker-compose.test.yaml -p hitalent_test up --build --abort-on-container-exit test-fastapi
```
Здесь `--abort-on-container-exit` должен положить оба контейнера (и БД, и само приложение), но для чистоты логов я делал `attach` только к контейнеру с приложением (`test-fastapi`), поэтому БД остается жить. Можно не делать `attach`, тогда оба контейнера исправно остановятся.
После завершения тестов:
```bash
docker compose -f docker-compose.test.yaml -p hitalent_test down -v
```
`hitalent_prod` и `hitalent_test` - названия групп контейнеров, они могут быть любыми. После каждого тестового прогона НЕ обязательно ронять контейнеры с `-v`, т. к. БД от старта к старту будет чистая, но можно делать (и я делал) для уверенности в результате 🙂
### 2. Тезисно о проекте
- 📚 Стек: `FastAPI`, `SQLAlchemy` с асинхронным двжиком `asyncpg`, `Pydantic` и `pydantic-settings` для конфигурации, для миграций использовал `Alembic`, тесты с `pytest` и `pytest-asyncio`, пакетный менеджер `poetry`.
- ✍️ Ко всему написаны docstring'и (кроме тестов и интерактивной документации, решил не тратить время на `Given-When-Then` и `Swagger` и сдать задание раньше).
- 🧪 Интеграционные тесты для всех кейсов `Questions API` (`Answers API` обделил по той же причине, что и документацию к тестам).
- 📃 Имеется логгер в файл (без временной ротации). Логи хранятся в корне проекта, поэтому можно:
```bash
docker exec -it api_service tail -n 100 ../app.log
```
- 🤓 Соблюдены все функциональные и нефункциональные требования, а также рекомендации на тему чистоты и читаемости кода.
- 😶🌫️ `README` писал сам!