Backend, Frontend, Weekend
При разработке API на Laravel часто возникает необходимость тестировать валидацию входящих данных. Один из способов — вручную писать тесты с различными вариантами входных параметров. Однако этот процесс может быть трудоемким и рутинным.
Чтобы упростить задачу, я разработал пакет laravel-request-testdata, который автоматически создает тестовые данные на основе правил валидации Laravel Request.
Ссылка на репозиторий – https://github.com/prog-time/laravel-request-testdata
Рассмотрим стандартный Laravel Request с простыми правилами:
class SimpleRequest extends FormRequest
{
public function rules(): array
{
'name' => 'required|string',
'email' => 'required|email',
}
}
Теперь используем laravel-request-testdata для получения тестовых данных:
use App\Http\Requests\SimpleRequest;
use ProgTime\RequestTestData\RequestDataGenerator;
$request = new SimpleRequest();
$testData = RequestDataGenerator::generate($request);
Выходные данные могут выглядеть так:
[
'name' => 'May Walker',
'email' => 'ola.lagua@example.com',
]
Проанализировав передаваемый Request класс, модуль возвращает массив с параметрами для запроса. Полученные данные вы можете использовать в авто-тестах вашего приложения.
При таком подходе вам нужно меньше следить за актуальностью тестов при редактирование правил валидации + это избавляет вас от необходимости вручную прописывать тестовые данные.
В процессе планирования разработки модуля я долго изучал вариации правил валидации в Laravel и постарался описать все возможные кейсы правил валидации.
Данный модуль может обрабатывать правила валидации в разном формате.
Вы можете описать правила в виде строки, как это было сделано в предыдущих примерах, а можете передать массив со списком параметром:
[
'name' => ['required', 'string', 'min:3', 'max:50'],
'age' => ['nullable', 'integer', 'min:18'],
'password' => ['required', 'string', 'min:8'],
]
По мимо типичных правил валидации, модуль также понимает такие правила, как: in, exists, unique и так далее.
[
'status' => 'required|string|in:pending,approved,rejected',
'category_id' => 'required|exists:categories,id',
'email' => 'required|email|unique:users,email',
]
В некоторых Request классах правила валидации описываются в формате Rule конструкций. Это может быть Rule::unique для проверки на уникальность или Rule::in для проверки на соответствие конкретным значениям.
[
'email' => ['required', 'email', Rule::unique('users')],
'role' => ['required', Rule::in(['admin', 'user', 'moderator'])],
]
Что касается валидации загружаемых файлов, то тут всё немного сложнее. На данный момент мой модуль может сгенерировать файлы таких типов, как: yml, xml, svg, sql, png, log, json, jpg, html, gif и csv.
Количество доступных форматов будет постепенно увеличиваться, по мере развития данного модуля.
Для данной проблемы есть обходной вариант, который мы рассмотрим ниже.
Бываю моменты когда вам нужно для тестирования передавать свои данные, которые более корректно смогут настроить проверку работы приложения.
Для этого необходимо в Request классе создать метод requestTestData(). Данный метод должен возвращать параметры запроса с заполненными тестовыми данными.
public function requestTestData(): array
{
$faker = \Faker\Factory::create();
return [
'email' => $faker->email(),
'age' => 25,
];
}
Через метод requestTestData() вы также можете передавать тестовые файлы в форматах, которые на данный момент не поддерживаются моим модулем.
Таким образом я постарался разработать полезный модуль, который позволит сократить время на написание тестов и облегчит поддержку уже написанных авто-тестов.
Данный модуль не требует дополнительной настройки, его легко можно установить через composer и использовать в своих тестах.
Я надеюсь вам понравилось моё решение. Я буду очень благодарен если вы поддержите данный модуль звёздочкой на GitHub и напишите свой комментарий под данным постом.
Спасибо за то что дочитали данный пост до конца!
Backend, Frontend, Weekend
Всем привет! В данной записи я хотел бы поделиться с вами модулем, который я разработал для Laravel.
https://github.com/prog-time/tg-logger
Это мой первый опыт в разработке публичных модулей для Laravel, поэтому прошу не судить строго!
Данный модуль позволяет легко и быстро настроить отправку логов и сообщений об ошибках в Telegram сообщество, где под каждый тип события вы можете выбрать отдельный топик. Таким образом вы можете отправлять сообщения о кастомных событиях, исключения и системные ошибки.
Конечно, есть более продвинутые решения для логирования, но они требуют более глубокую настройку. Я же хотел создать модуль, который будет быстро настраиваться и хорошо подойдёт для мелких и средних проектов.
Для начала вам нужно создать Telegram бота который будет отвечать за отправку оповещений. После этого создаём группу, включаем в ней «Темы» и добавляем созданного бота в группу (обязательно с правами администратора).
После создания бота, записываем токен бота и id группы в .env файл.
TG_LOGGER_TOKEN="token_bot"
TG_LOGGER_CHAT_ID="id_group"
Устанавливаем модуль через Composer.
composer require prog-time/tg-logger
После установки модуля, вам необходимо создать конфигурационный файл config/tg-logger.php и прописать в нём параметры для работы модуля.
Вы можете создать файл вручную или перенести заготовленную версию конфигурации, которая находится внутри модуля, прописал следующую команду.
php artisan vendor:publish --tag=config
Теперь давайте заполним созданный конфигурационный файл.
return [
'token' => env('TG_LOGGER_TOKEN'),
'chat_id' => env('TG_LOGGER_CHAT_ID'),
'topics' => [
[
'name' => 'Debug messages',
'icon_color' => '9367192',
'level' => 'debug',
],
[
'name' => 'Cron tasks',
'icon_color' => '9367192',
'level' => 'crone',
],
[
'name' => 'Errors',
'icon_color' => '9367192',
'level' => 'error, notice, warning, emergency',
]
]
];
Конфигурация tg-logger.php включает в себя следующие параметры:
После настройки tg-logger.php, вам необходимо запустить команду которая создаст темы в группе.
php artisan tglogger:create-topics
После запуска данной команды, файл tg-logger.php будет перезаписан и в нём будут указаны id тем
На этом настройка модуля закончена, ниже рассмотрим как работать с модулем TgLogger.
Для отлова всех типов ошибок вам необходимо изменить базовый обработчик логов в конфигурационном файле config/logging.php, указав в качестве обработчиков классы модуля.
'channels' => [
...
'telegram' => [
'driver' => 'monolog',
'handler' => ProgTime\TgLogger\TgHandler::class,
'formatter' => ProgTime\TgLogger\TgFormatter::class,
'level' => 'debug',
],
...
],
И в .env изменить параметр LOG_CHANNEL
LOG_CHANNEL=telegram
Вы также можете отправлять оповещения, напрямую, используя класс TgLogger и статический метод sendLog().
TgLogger::sendLog('Your message', 'level');
Большое спасибо тем кто дочитать данную статью до конца! Буду очень рад если вы поддержите данное решение на GitHub и напишете свой комментарий под данным постом.
{message}