## Домашнее задание №15 «Докеризация и интеграционное тестирование Календаря»

Данное задание состоит из двух частей.

Не забываем про https://github.com/golang-standards/project-layout.

### 1) Докеризация сервиса
Необходимо:
* создать Dockerfile для каждого из процессов (Календарь, Рассыльщик, Планировщик);
* собрать образы и проверить их локальный запуск;
* создать docker-compose файл, который запускает PostgreSQL, RabbitMQ и все микросервисы вместе
(для "неродных" сервисов использовать официальные образы из Docker Hub);
* при желании доработать конфигурацию так, чтобы она поддерживала переменные окружения
(если вы используете библиотеку, то скорее всего она уже это умеет); в противном случае
придется "подкладывать" конфиг сервису с помощью Dockerfile / docker-compose -
при этом можно "заполнять" конфигурационный файл из переменных окружения, например
```bash
$ envsubst < config_template.json > config.json
```
* если миграции выполняются руками, а не на старте сервиса, то также в docker-compose
должен запускаться one-shot скрипт, который делает это (применяет SQL миграции,
создавая структуру БД).
* порты серверов, предоставляющих API, пробросить на host.

У преподавателя должна быть возможность запустить весь проект с помощью команды 
`make up` (внутри `docker-compose up`) и погасить с помощью `make down`.

HTTP API, например, после запуска должно быть доступно по URL **http://localhost:8888/**.

### 2) Интеграционное тестирование 
Необходимо:
* создать отдельный пакет для интеграционных тестов.
* реализовать интеграционные тесты на языке Go; при желании можно использовать
[godog](https://github.com/cucumber/godog) / [ginkgo](https://github.com/onsi/ginkgo), но
обязательным требованием это **не является**.
* создать docker-compose файл, поднимающий все сервисы проекта + контейнер с интеграционными тестами;
* расширить Makefile командой `integration-tests`, `make integration-tests` будет запускать интеграционные тесты;
**не стоит смешивать это с `make test`, иначе CI-пайплайн не пройдёт.**
* прикрепить в Merge Request вывод команды `make integration-tests`.

Преподаватель может запустить интеграционные тесты с помощью команды `make integration-tests`:
- команда должна поднять окружение (`docker-compose`), прогнать тесты и подчистить окружение за собой;
- в случае успешного выполнения команда должна возвращать 0, иначе  1.

### Критерии оценки
- Проект полностью запускается и останавливается с помощью `make up` / `make down` - 3 балла
- Интеграционные тесты запускаются с помощью `make integration-tests`. Команда возвращает верный код ответа - 1 балл
- Интеграционные тесты покрывают бизнес сценарии:
    - добавление события и обработка бизнес ошибок - 2 балла
    - получение листинга событий на день/неделю/месяц - 2 балла
    - отправка уведомлений (необходимо доработать sender так, чтобы он информировал куда-то о статусе уведомления (БД/кролик)) - 2 балла

#### Зачёт от 7 баллов
