Тестовое задания для kt.team (backend php)
https://kt.team/hr/test-backend
Выполнил art-ps 01.12.2019. Затраченое время ~5 часов.
Запуск приложения в docker
- Склонировать себе репозиторий.
$ git clone git@github.com:art-ps/ktteam.git
- Перейти в папку с приложением:
$ cd ktteam
- Скопировать файл с настройками
$ cp .env.docker .env
- Установить зависимости:
$ docker-compose run --rm --no-deps ktteam-app composer install
- Запустить приложение. Оно будет доступно по адресу "http://localhost:8000":
$ docker-compose up -d
- Для запуска миграций выполнить:
$ docker-compose run --rm --no-deps ktteam-app php console.php migrate
- Для заполнения базы тестовыми данными выполнить:
$ docker-compose run --rm --no-deps ktteam-app php console.php seed
- Для запуска тестов выполнить:
$ cp .env.testing.docker .env.testing
$ docker-compose run --rm ktteam-app ./vendor/bin/phpunit -c ./tests/config.xml --order-by=defects --stop-on-defect
Для запуска приложения без docker'a
- Склонировать себе репозиторий.
$ git clone git@github.com:art-ps/ktteam.git
- Перейти в папку с приложением:
$ cd ktteam
- Скопировать файл с настройками
$ cp .env.local .env
-
В файле .env изменить настройки подключения к БД
-
Создать две базы данных:
mysql>CREATE DATABASE ktteam;
mysql>CREATE DATABASE testing;
- Установить зависимости:
$ composer install
- Для запуска миграций выполнить:
$ php console.php migrate
- Для заполнения базы тестовыми данными выполнить:
$ php console.php seed
- В папке приложения выполнить
php -S 0.0.0.0:8000 -t web/
-
Приложение доступно на http://localhost:8000
-
Для запуска тестов сначала скопировать файл с настройками подключения:
$ cp .env.testing.local .env.testing
При необходимости изменить настройки подключения к БД в файле , затем запустить тесты:
$ ./vendor/bin/phpunit -c ./tests/config.xml --order-by=defects --stop-on-defect
API
В приложении реализованы следующие маршруты:
1) 'GET' /task
Получить список всех задач.
Результаты можно фильтровать передав в теле запроса JSON с параметрами, например:
{"status": "planned", "user_id" : 2}
выбрать задачи со статусом "planned" и пользователем с id = 2
Пример ответа:
{
"status": true,
"message": [
{
"id": 1,
"name": "Read a book",
"description": "Find, buy and read \"PHP Internals\" book",
"status": "planned",
"user_id": 1,
"created_at": "2019-11-30 20:19:04",
"updated_at": "2019-11-30 20:19:04"
},
{
"id": 2,
"name": "This is new task",
"description": "This task is just created",
"status": "planned",
"user_id": 1,
"created_at": "2019-11-30 20:19:04",
"updated_at": "2019-11-30 21:15:35"
},
{
"id": 3,
"name": "Have a cup of coffee",
"description": "Go to kitchen and drink a coffee",
"status": "planned",
"user_id": 2,
"created_at": "2019-11-30 20:19:04",
"updated_at": "2019-11-30 20:19:04"
}
]
}
2) 'GET' /task/{id}
Получить задачу по id.
Пример ответа:
{
"status": true,
"message": {
"id": 3,
"name": "Have a cup of coffee",
"description": "Go to kitchen and drink a coffee",
"status": "planned",
"user_id": 2,
"created_at": "2019-11-30 20:19:04",
"updated_at": "2019-11-30 20:19:04",
"user": {
"id": 2,
"name": "Second User",
"email": "secondemail@example.com",
"created_at": "2019-11-30 20:19:04",
"updated_at": "2019-11-30 20:19:04"
}
}
}
3) 'POST' /task
Создать задачу.
В теле запроса передаётся JSON с параметрами для создания задачи, например:
{"name" : "This is new task", "description" : "This task is just created", "user_id" : 1}
Пример ответа:
{
"status": true,
"message": {
"name": "This is new task",
"description": "This task is just created",
"user_id": 1,
"updated_at": "2019-11-30 20:56:23",
"created_at": "2019-11-30 20:56:23",
"id": 5
}
}
4) 'PUT' /task/{id}
Редактирование задачи по id.
В теле запроса передаётся JSON с параметрами для редактирования задачи, например:
-
поменять имя и описания задачи:
{"name" : "This is new name of the task", "description" : "This is new deescription"}
-
поменять статус задачи c "запланирован" на "сделано"
{"status" : "done"}
-
поменять пользователя задачи на пользователя с id = 1
{"user_id" : 1}
Пример ответа:
{
"status": true,
"message": ["Success"]
}
5) 'DELETE' /task/{id}
Удаление задачи по id.
Пример ответа:
{
"status": true,
"message": ["Success"]
}
6) 'GET' /user
Список пользователей
Пример ответа:
{
"status": true,
"message": [
{
"id": 1,
"name": "First User",
"email": "firstemail@example.com",
"created_at": "2019-11-30 20:19:04",
"updated_at": "2019-11-30 20:19:04"
},
{
"id": 2,
"name": "Second User",
"email": "secondemail@example.com",
"created_at": "2019-11-30 20:19:04",
"updated_at": "2019-11-30 20:19:04"
}
]
}
Тестирование маршрутов в Insomnia
Запросы для Insomnia можно импортировать из файла "Insomnia_export.json"