Ознакомиться с основными видами автоматизированного тестирования. Научиться писать модульные и функциональные тесты при помощи фреймоврка PHPUnit. Научиться тестировать приложение в фреймворке Laravel.
Репозиторий форкать нельзя!
git clone <link to repositry>
cd <repository_name>
cp .env.example .env
composer install
php artisan key:generate
cp .env .env.dusk.local
php artisan migrate:fresh
git checkout -b develop
Разработку ведите в ветви develop
.
Также рекомендуется использовать Homestead для поднятия приложения.
Прежде всего вам необходимо реализовать следующие интерфейсы:
Сервисы и репозитории должны быть зарегистрированы как сервис контейнеры в виде интерфейса на реализацию.
Миграции моделей и модели уже созданы в App\Entity.
Разрешается добавлять вспомогательные методы, если это необходимо.
Для работы с почтой используйте драйвер для разработки.
- MarketService
addLot
- выставление лота продажы валюты. Метод должен соответствовать следующим ограничениям:- Пользователь не может иметь более одной активной сессии продажи одной и той же валюты
- Дата закрытия сессии не может быть меньше чем дата открытия
- Цена лота не может быть отрицательной
- В случае успешного выполнения должен быть добавлен лот
buyLot
- покупка валюты из лота. Метод должен соответствовать следующим ограничениям:- Из кошелька продавца должна быть извлечена купленная валюта
- В кошелек покупателя должна быть добавлена валюта
- Пользователь не может покупать собственную валюту
- Пользователь не может покупать больше валюты чем содержит лот
- Пользователь не может купить меньше одной единицы валюты
- Пользователь не может купить валюту из закрытого лота
- После успешного выполнения должна быть добавлена сделка (
Trade
) - После успешного выполнения на почту продавца должно отправиться электронное письмо App\Mail\TradeCreated (Отправляйте при помощи фасада Mail::send()).
getLot
- возвращает информацию о лоте по идентификатору. Метод должен соответствовать следующим ограничениям:- Количество валюты должно соответствовать количеству валюты в кошельке пользователя.
- Даты закрытия и открытия должны быть представлены строкой в формате:
yyyy/mm/dd hh:mm:ss
- Цена за единицу валюты должна быть в формате:
00,00
getLotList
- возвращает массив объектов типаLotResponse
.
- WalletService
addWallet
- добавляет кошелек пользователю. Пользователь не может иметь более одного кошелька.addMoney
- добавляет единицы заданной валюты в кошелек пользователя. Пользователь не может иметь более одной записи с одной валютой в кошельке.takeMoney
- сокращает количество валюты в кошельке пользователя. Значение количества валюты не должно превышать количество валюты в кошельке пользователя.
- CurrencyService
addCurrency
- добавляет валюту в справочник.
Вам необходимо написать модульные тесты для методов сервиса MarketService (addLot
, buyLot
, getLot
, getLotList
).
В этом задании вы должны использовать создание моков, стабов, а также использовать ассершены, предоставляемые PHPUnit и Laravel.
При создании модульных тестов нельзя проводит никаких операций с базой данных!
Для выполнения этого задания вам необходимо использовать реализованные сервисы и средства работы с пользователями, предоставляемые фреймворком.
Для начала вам нужно добавить следующие роуты:
- Добавление лота
POST /api/v1/lots
Content-type: application/json
Status code: 201
Request data:
{
"currency_id": <int>,
"date_time_open": <int>,
"date_time_close": <int>,
"price": <float>
}
- Покупка валюты
POST /api/v1/trades
Content-type: application/json
Status code: 201
Request data:
{
"lot_id": <int>,
"amount": <float>
}
- Детальная информация о лоте
GET /api/v1/lots/{id}
Content-type: application/json
Status code: 200
Response:
{
"id": <int>,
"user_name": <string>,
"currency_name": <string>,
"amount": <float>,
"date_time_open": <string>,
"date_time_close": <string>,
"price": <string>
}
- Список всех лотов
GET /api/v1/lots
Content-type: application/json
Status code: 200
Response:
[
{
"id": <int>,
"user": <string>,
"currency": <string>,
"amount": <float>,
"date_time_open": <string>,
"date_time_close": <string>,
"price": <string>
},
...
]
Добавлять лоты и покупать валюту могут только зарегистрированные пользователи.
В случае возникновения ошибки необходимо вернуть следующий ответ:
Content-type: application/json
Status code: 400
{
error: {
message: <string>,
status_code: <int>
}
}
Если доступ запрещен, то код статуса ответа должен быть 403
.
Используя средства тестирования API и базы данных, предоставляемые фреймворком Laravel, написать тесты для тестирования роутов API. Для создания фейковых данных рекомендуется использовать фабрики Laravel.
Добавьте view с формой добавления лота по маршруту /market/lots/add
.
В случае успешного добавления лота должно выводиться сообщение: "Lot has been added successfully!".
В случае не удачного добавления должна быть надпись: "Sorry, error has been occurred: <error text>
",
где <error text>
- текст ошибки.
Используя Dusk необходимо протестировать отображение формы и вывод соответствующих сообщений.
Зайдите на виртуальную машину через ssh из папки, где установлен Homestead
vagrant ssh
Перейдите в директорию проекта и запустите
php artisan serve --host=192.168.10.10 --port=8080
Установите в '.env.dusk.local' строку
APP_URL=http://192.168.10.10:8080
Теперь можно запустить тесты.
php artisan dusk
- Создайте репозиторий на github и запушьте обе ветки
master
иdevelop
. - Установите в вашем github аккаунте Travis CI.
- В репозитории перейдите в
Settings->Integrations&Services
и выберите вAdd service
Travis CI. - Перейдите на сайт travis-ci.org, авторизуйтесь с вашего github аккаунта и включите ваш репозиторий.
- Пошлите пулл реквест из ветки
develop
, где должны быть все изменения, в веткуmaster
, но не принимайте его. - Оставьте ссылку на github репозиторий в личном кабинете.