Это репозиторий для выполнения тестового задания на стажировку в Авито.
Инструкция - в INSTRUCTIONS.md.
Подробное условие задания - в TASK.md.
Описание API — в api.yaml.
Результаты нагрузочного тестирования - в loadtest/RESULTS.md.
Конфигурация линтера - в .golangci.yaml.
Запустить сервис в Docker (работает без .env файла):
# linux
make up
# windows
.\tasks.ps1 up
# или просто
docker compose up -d --buildSwagger API доступен по адресу: http://localhost:8080/docs/index.html
Для защищённых эндпоинтов нажмите кнопку Authorize. В открывшемся окне введите
Bearer <токен>.
Остановить сервис, запущенный в Docker:
# linux
make down
# windows
.\tasks.ps1 down
# или просто
docker compose down
# если нужно очистить БД (volume)
docker compose down -vЗаполнить БД тестовыми данными (seed) в Docker:
# linux
make seed
# windows
.\tasks.ps1 seedПрогнать unit-тесты cо статистикой покрытия:
# linux
make test
# windows
.\tasks.ps1 testПрогнать integration-тесты cо статистикой покрытия:
# linux
make test-integration
# windows
.\tasks.ps1 test-integrationПрогнать E2E-тесты с testcontainers для тестовой БД PostgreSQL:
# linux
make test-e2e
# windows
.\tasks.ps1 test-e2eПровести нагрузочное тестирование (load testing):
# linux
make loadtest
# windows
.\tasks.ps1 loadtestПеред нагрузочным тестированием сначала необходимо запустить команды:
# linux make up make seed # windows .\tasks.ps1 up .\tasks.ps1 seed
Прогнать линтер:
# linux
make lint
# windows
.\tasks.ps1 lintДля опционального поля createConferenceLink: true в POST /bookings/create используется мок внешнего сервиса (internal/bookings/conference), без реального HTTP.
Принятые решения при ошибках:
- Мок недоступен / вернул ошибку — бронь не создаётся. Клиент получает 500 с кодом
INTERNAL_ERROR(в Swagger для этого сценария предусмотрен общий ответ 500). Ссылка на конференцию в БД не появляется, состояние данных согласовано. - Мок успешен, но запись брони в БД не удалась (редкий сбой инфраструктуры) — в реальной системе могла бы остаться «висячая» конференция у провайдера; в моке побочных эффектов нет.
- Гонка двух запросов на один слот — проверка «нет активной брони» выполняется внутри транзакции перед
INSERT; второй запрос получает 409SLOT_ALREADY_BOOKEDс сообщениемslot is already booked, как вapi.yaml.
Имитация сбоя замоканного сервиса: в .env задайте CONFERENCE_MOCK_FAIL=1 или true — любой вызов создания ссылки будет завершаться ошибкой (удобно для ручных проверок).