Первая фиксация
This commit is contained in:
commit
252b261720
|
@ -0,0 +1 @@
|
||||||
|
/vendor
|
|
@ -0,0 +1,91 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mirzaev\Feip;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ошибка
|
||||||
|
*
|
||||||
|
* Сборщик ошибок
|
||||||
|
*
|
||||||
|
* @property string ERROR_100 Не установлен обязательный параметр
|
||||||
|
* @property string ERROR_200 Неподходящее значение параметра
|
||||||
|
* @property array $errors Собранные ошибки
|
||||||
|
*
|
||||||
|
* @method public function __construct(int $type, string $target = null, string $message = null) Создать ошибку
|
||||||
|
* @method public static function get(int $number = null) Получить одну, либо все ошибки
|
||||||
|
*
|
||||||
|
* @package Mirzaev\Feip\Error
|
||||||
|
* @author Арсен Мирзаев <red@hood.su>
|
||||||
|
*
|
||||||
|
* @todo Я бы вместо этого подключил библеотеку на PSR-7, да сделал там сбор и возврат всех ТИПОВ ошибок
|
||||||
|
*/
|
||||||
|
class Error
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Ошибка #100
|
||||||
|
*
|
||||||
|
* Не установлен обязательный параметр
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected const ERROR_100 = 'Не установлен обязательный параметр';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ошибка #200
|
||||||
|
*
|
||||||
|
* Неподходящее значение параметра
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected const ERROR_200 = 'Неподходящее значение параметра';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ошибки
|
||||||
|
*
|
||||||
|
* Собранные ошибки за время выполнения
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected static array $errors = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Создать ошибку
|
||||||
|
*
|
||||||
|
* @param int $type Тип ошибки
|
||||||
|
* @param string|null $target Причина ошибки
|
||||||
|
* @param string|null $message Сообщение об ошибке
|
||||||
|
*
|
||||||
|
* @todo Я бы переименовал $type (Тип ошибки) в $code (Код ошибки), но уже поздно
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct(int $type, string $target = null, string $message = null)
|
||||||
|
{
|
||||||
|
self::$errors[] = [
|
||||||
|
'type' => $type,
|
||||||
|
'target' => $target ?? 'request',
|
||||||
|
'value' => $message ?? constant('self::ERROR_' . $type)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получить одну, либо все ошибки
|
||||||
|
*
|
||||||
|
* @param int|null $number Номер ошибки
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function get(int $number = null): array
|
||||||
|
{
|
||||||
|
// Одна ошибка
|
||||||
|
if (isset($number)) {
|
||||||
|
// Если передан номер ошибки
|
||||||
|
return self::$errors[$number];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Все ошибки
|
||||||
|
return self::$errors;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mirzaev\Feip\Methods;
|
||||||
|
|
||||||
|
use Mirzaev\Feip\Methods\MethodAbstract,
|
||||||
|
Mirzaev\Feip\Error,
|
||||||
|
Mirzaev\Feip\Params\Bar,
|
||||||
|
Mirzaev\Feip\Params\Email,
|
||||||
|
Mirzaev\Feip\Params\Users;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Foo
|
||||||
|
*
|
||||||
|
* @property string $bar bar
|
||||||
|
* @property string $email Почта
|
||||||
|
* @property array $users Пользователи
|
||||||
|
*
|
||||||
|
* @method public function __construct(array $params) Сборщик
|
||||||
|
* @method public filter(string $var, $params) Фильтрация входящих параметров
|
||||||
|
* @method public function json() Возвращает json-строку собранную из объекта
|
||||||
|
* @method private static function camelCase(string $text) Конвертация в camelCase (lower)
|
||||||
|
*
|
||||||
|
* @see Mirzaev\Feip\Tests\Bar
|
||||||
|
*
|
||||||
|
* @package Mirzaev\Feip\Methods\Bar
|
||||||
|
* @author Арсен Мирзаев <red@hood.su>
|
||||||
|
*/
|
||||||
|
class BarMethod extends MethodAbstract
|
||||||
|
{
|
||||||
|
use Bar, Email, Users;
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mirzaev\Feip\Methods;
|
||||||
|
|
||||||
|
use Mirzaev\Feip\Methods\MethodAbstract,
|
||||||
|
Mirzaev\Feip\Params\Foo,
|
||||||
|
Mirzaev\Feip\Params\Bar,
|
||||||
|
Mirzaev\Feip\Params\Baz;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Foo
|
||||||
|
*
|
||||||
|
* @property int $foo foo
|
||||||
|
* @property string $bar bar
|
||||||
|
* @property string $baz baz
|
||||||
|
*
|
||||||
|
* @method public function __construct(array $params) Сборщик
|
||||||
|
* @method public filter(string $var, $params) Фильтрация входящих параметров
|
||||||
|
* @method public function json() Возвращает json-строку собранную из объекта
|
||||||
|
* @method private static function camelCase(string $text) Конвертация в camelCase (lower)
|
||||||
|
*
|
||||||
|
* @see Mirzaev\Feip\Tests\Foo
|
||||||
|
*
|
||||||
|
* @package Mirzaev\Feip\Methods
|
||||||
|
* @author Арсен Мирзаев <red@hood.su>
|
||||||
|
*/
|
||||||
|
class FooMethod extends MethodAbstract
|
||||||
|
{
|
||||||
|
use Foo, Bar, Baz;
|
||||||
|
}
|
|
@ -0,0 +1,182 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mirzaev\Feip\Methods;
|
||||||
|
|
||||||
|
use Mirzaev\Feip\Error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MethodAbstract
|
||||||
|
*
|
||||||
|
* @param array $ignore Список игнорируемых свойств
|
||||||
|
*
|
||||||
|
* @method public function __construct(array $params) Сборщик
|
||||||
|
* @method public filter(string $var, $params) Фильтрация входящих параметров
|
||||||
|
* @method public function json() Возвращает json-строку собранную из объекта
|
||||||
|
* @method private static function camelCase(string $text) Конвертация в camelCase (lower)
|
||||||
|
*
|
||||||
|
* @package Mirzaev\Feip\Methods
|
||||||
|
* @author Арсен Мирзаев <red@hood.su>
|
||||||
|
*/
|
||||||
|
class MethodAbstract
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Список игнорируемых свойств
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected array $ignore = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Сборщик
|
||||||
|
*
|
||||||
|
* Получает параметры и присваивает к одноимённым свойствам
|
||||||
|
*
|
||||||
|
* @param array $params Параметры
|
||||||
|
*/
|
||||||
|
public function __construct(array $params)
|
||||||
|
{
|
||||||
|
// Обработка входящих параметров
|
||||||
|
foreach ($this as $var => $value) {
|
||||||
|
// Перебор свойств объекта
|
||||||
|
|
||||||
|
// Вызов метода Before
|
||||||
|
$method = $this::camelCase($var . 'Before');
|
||||||
|
if (method_exists($this, $method)) {
|
||||||
|
// Если есть метод before, то вызвать его
|
||||||
|
$this::$method();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Список игнорируемых параметров
|
||||||
|
if (in_array($var, $this->ignore) || $var === 'ignore') {
|
||||||
|
// Если найден в списке, то пропустить
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Нет значения
|
||||||
|
if (empty($params[$var])) {
|
||||||
|
// Если переданный параметр имеет пустое значение
|
||||||
|
new Error(100, $var);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Массив
|
||||||
|
if (is_array($params[$var])) {
|
||||||
|
// Массив
|
||||||
|
if (is_array($value)) {
|
||||||
|
// Если тип идентичного параметру свойства является массивом
|
||||||
|
$this->$var = $this->filter($var, $params[$var]);
|
||||||
|
} else {
|
||||||
|
new Error(200, $var);
|
||||||
|
}
|
||||||
|
} else if (null !== $filtered = $this->filter($var, $params[$var])) {
|
||||||
|
// Иначе, если получено скалярное значение и результат его фильтрации
|
||||||
|
$this->$var = $filtered;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Вызов метода After
|
||||||
|
$method = $this::camelCase($var . 'After');
|
||||||
|
if (method_exists($this, $method)) {
|
||||||
|
// Если есть метод after, то вызвать его
|
||||||
|
$this::$method();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Фильтр
|
||||||
|
*
|
||||||
|
* @param string|int $var Свойство объекта
|
||||||
|
* @param mixed $params Параметры
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function filter($var, $params)
|
||||||
|
{
|
||||||
|
// Инициализация
|
||||||
|
$response = [];
|
||||||
|
|
||||||
|
if (!is_array($params)) {
|
||||||
|
// Если передан скалярный параметр
|
||||||
|
$params = [$var => $params];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Обработка
|
||||||
|
foreach ($params as $key => $value) {
|
||||||
|
// Перебор входных параметров
|
||||||
|
|
||||||
|
|
||||||
|
// Массив
|
||||||
|
if (is_array($value)) {
|
||||||
|
// Если передан массив, то войти в цикл для обработки
|
||||||
|
$response[$key] = $this->filter($key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Инициализация метода
|
||||||
|
$method = $this::camelCase($key);
|
||||||
|
// Скалярное значение
|
||||||
|
if (method_exists($this, $method)) {
|
||||||
|
// Если существует фильтр для параметра
|
||||||
|
if ($value_filtered = $this::$method($value)) {
|
||||||
|
// Если фильтрация вернула результат
|
||||||
|
$response[$key] = $value_filtered;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Деинициализация
|
||||||
|
if (count($params) === 1) {
|
||||||
|
// Если в начале был передан скалярный параметр
|
||||||
|
$response = array_pop($response);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Конвертация в json
|
||||||
|
*
|
||||||
|
* Возвращает строку json со значеним из всех свойств объекта
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function json(): string
|
||||||
|
{
|
||||||
|
// Инициализация
|
||||||
|
$response = [
|
||||||
|
'response' => [],
|
||||||
|
'errors' => Error::get()
|
||||||
|
];
|
||||||
|
|
||||||
|
// Генерация ответа
|
||||||
|
foreach ($this as $var => $value) {
|
||||||
|
// Перебор свойств объекта
|
||||||
|
|
||||||
|
if (in_array($var, $this->ignore) || $var === 'ignore') {
|
||||||
|
// Если добавлен в чёрный список, то пропустить
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$response['response'][$var] = $value;
|
||||||
|
}
|
||||||
|
var_dump($this->ignore);
|
||||||
|
|
||||||
|
return json_encode($response);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Конвертация в camelCase (lower)
|
||||||
|
*
|
||||||
|
* Возвращает строку в формате camelCase (lower)
|
||||||
|
*
|
||||||
|
* @param string|int $text Строка для конвертации
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private static function camelCase($text): string
|
||||||
|
{
|
||||||
|
return (string) preg_replace_callback('/_(.?)/', fn ($m) => strtoupper($m[1]), $text);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mirzaev\Feip\Params;
|
||||||
|
|
||||||
|
use Mirzaev\Feip\Error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Параметр возраста
|
||||||
|
*
|
||||||
|
* @property int $age Возраст
|
||||||
|
*
|
||||||
|
* @package Mirzaev\Feip\Params
|
||||||
|
* @author Арсен Мирзаев <red@hood.su>
|
||||||
|
*/
|
||||||
|
trait Age
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Возраст: параметр
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
protected int $age = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возраст: фильтр
|
||||||
|
*
|
||||||
|
* @param string|int|float $target Значение для фильтрации
|
||||||
|
*
|
||||||
|
* @return int|null
|
||||||
|
*/
|
||||||
|
public static function age($target): ?int
|
||||||
|
{
|
||||||
|
// Очистка
|
||||||
|
if ($sanitized = filter_var($target, FILTER_CALLBACK, array('options' => [self::class, 'onlyNumbers']))) {
|
||||||
|
// Если очищение вернуло результат
|
||||||
|
|
||||||
|
// Проверка
|
||||||
|
if ($sanitized !== (int) $target) {
|
||||||
|
// Если очищенное значение не совпадает с отправленным
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
} else if (filter_var($sanitized, FILTER_VALIDATE_INT) && $sanitized > 0 && $sanitized <= 150) {
|
||||||
|
return (int) $sanitized;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возраст: очистка
|
||||||
|
*
|
||||||
|
* @param string|int|float $target Значение для очистки
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public static function onlyNumbers($target): int
|
||||||
|
{
|
||||||
|
// Поиск цифр
|
||||||
|
preg_match_all('/[0-9]*/', $target, $match);
|
||||||
|
|
||||||
|
// Инициализация
|
||||||
|
$result = '';
|
||||||
|
|
||||||
|
// Конкатанация найденных цифр
|
||||||
|
foreach ($match[0] as $number) {
|
||||||
|
$result .= $number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// В задании было сказано: для номеров тип string
|
||||||
|
return (int) $result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mirzaev\Feip\Params;
|
||||||
|
|
||||||
|
use Mirzaev\Feip\Error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Параметр bar
|
||||||
|
*
|
||||||
|
* @property string $bar bar
|
||||||
|
*
|
||||||
|
* @package Mirzaev\Feip\Params
|
||||||
|
* @author Арсен Мирзаев <red@hood.su>
|
||||||
|
*/
|
||||||
|
trait Bar
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* bar: параметр
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected string $bar = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bar: фильтр
|
||||||
|
*
|
||||||
|
* @param string|int|float $target Значение для фильтрации
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public static function bar($target): ?string
|
||||||
|
{
|
||||||
|
// Очистка
|
||||||
|
if ($sanitized = filter_var($target, FILTER_SANITIZE_STRING)) {
|
||||||
|
// Если очищение вернуло результат
|
||||||
|
|
||||||
|
// Проверка
|
||||||
|
if ($sanitized !== $target) {
|
||||||
|
// Если очищенное значение не совпадает с отправленным
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (string) $sanitized;
|
||||||
|
} else {
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mirzaev\Feip\Params;
|
||||||
|
|
||||||
|
use Mirzaev\Feip\Error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Параметр baz
|
||||||
|
*
|
||||||
|
* @property string $baz baz
|
||||||
|
*
|
||||||
|
* @package Mirzaev\Feip\Params
|
||||||
|
* @author Арсен Мирзаев <red@hood.su>
|
||||||
|
*/
|
||||||
|
trait Baz
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* baz: параметр
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected string $baz = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* baz: фильтр
|
||||||
|
*
|
||||||
|
* @param string|int|float $target Значение для фильтрации
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public static function baz($target): ?string
|
||||||
|
{
|
||||||
|
// Очистка
|
||||||
|
if ($sanitized = filter_var($target, FILTER_CALLBACK, array('options' => [self::class, 'phoneNumberRus']))) {
|
||||||
|
// Если очищение вернуло результат
|
||||||
|
|
||||||
|
// Проверка
|
||||||
|
if ($sanitized !== $target || !preg_match('/^7[0-9]{10}$/', $sanitized)) {
|
||||||
|
// Если очищенное значение не совпадает с отправленным
|
||||||
|
// или если не совпадает с паттерном "7**********" (российский номер)
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
// В задании было указано: для номеров тип string
|
||||||
|
return (string) $sanitized;
|
||||||
|
} else {
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* baz: очистка
|
||||||
|
*
|
||||||
|
* @param string|int|float $target Значение для очистки
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public static function phoneNumberRus($target): string
|
||||||
|
{
|
||||||
|
// Поиск цифр
|
||||||
|
preg_match_all('/[0-9]*/', $target, $match);
|
||||||
|
|
||||||
|
// Инициализация
|
||||||
|
$result = '';
|
||||||
|
|
||||||
|
// Конкатанация найденных цифр
|
||||||
|
foreach ($match[0] as $number) {
|
||||||
|
$result .= $number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Конвертация под Российский номер
|
||||||
|
$result[0] = 7;
|
||||||
|
|
||||||
|
// В задании было сказано: для номеров тип string
|
||||||
|
return (string) $result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mirzaev\Feip\Params;
|
||||||
|
|
||||||
|
use Mirzaev\Feip\Error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Параметр почты
|
||||||
|
*
|
||||||
|
* @property string $email Почта
|
||||||
|
*
|
||||||
|
* @package Mirzaev\Feip\Params
|
||||||
|
* @author Арсен Мирзаев <red@hood.su>
|
||||||
|
*/
|
||||||
|
trait Email
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Почта: параметр
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected string $email = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Почта: фильтр
|
||||||
|
*
|
||||||
|
* @param string|int|float $target Значение для фильтрации
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public static function email($target): ?string
|
||||||
|
{
|
||||||
|
// Очистка
|
||||||
|
if ($sanitized = filter_var($target, FILTER_SANITIZE_EMAIL)) {
|
||||||
|
// Если очищение вернуло результат
|
||||||
|
|
||||||
|
// Проверка
|
||||||
|
if ($sanitized !== $target || !preg_match("/[0-9A-z]+@[A-z]+\.[A-z]+/", $sanitized)) {
|
||||||
|
// Если очищенное значение не совпадает с отправленным
|
||||||
|
// или если не совпадает с паттерном "email"
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (string) $sanitized;
|
||||||
|
} else {
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mirzaev\Feip\Params;
|
||||||
|
|
||||||
|
use Mirzaev\Feip\Error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Параметр имени
|
||||||
|
*
|
||||||
|
* @property string $first_name Имя
|
||||||
|
*
|
||||||
|
* @package Mirzaev\Feip\Params
|
||||||
|
* @author Арсен Мирзаев <red@hood.su>
|
||||||
|
*/
|
||||||
|
trait FirstName
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Имя: параметр
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected string $first_name = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Имя: фильтр
|
||||||
|
*
|
||||||
|
* @param mixed $target Значение для фильтрации
|
||||||
|
*
|
||||||
|
* @return array|null
|
||||||
|
*/
|
||||||
|
public static function firstName($target): ?array
|
||||||
|
{
|
||||||
|
// Очистка
|
||||||
|
if ($sanitized = filter_var($target, FILTER_SANITIZE_STRING)) {
|
||||||
|
// Если очищение вернуло результат
|
||||||
|
|
||||||
|
// Проверка
|
||||||
|
if ($sanitized !== $target) {
|
||||||
|
// Если очищенное значение не совпадает с отправленным
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (array) $sanitized;
|
||||||
|
} else {
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mirzaev\Feip\Params;
|
||||||
|
|
||||||
|
use Mirzaev\Feip\Error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Параметр foo
|
||||||
|
*
|
||||||
|
* @property int $foo foo
|
||||||
|
*
|
||||||
|
* @package Mirzaev\Params\Filters
|
||||||
|
* @author Арсен Мирзаев <red@hood.su>
|
||||||
|
*/
|
||||||
|
trait Foo
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* foo: параметр
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
protected int $foo = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* foo: фильтр
|
||||||
|
*
|
||||||
|
* @param string|int|float $target Значение для фильтрации
|
||||||
|
*
|
||||||
|
* @return int|null
|
||||||
|
*/
|
||||||
|
public static function foo($target): ?int
|
||||||
|
{
|
||||||
|
// Очистка
|
||||||
|
if ($sanitized = filter_var($target, FILTER_SANITIZE_NUMBER_INT)) {
|
||||||
|
// Если очищение вернуло результат
|
||||||
|
|
||||||
|
// Проверка
|
||||||
|
if ($sanitized !== $target || !filter_var($sanitized, FILTER_VALIDATE_INT)) {
|
||||||
|
// Если очищенное значение не совпадает с отправленным
|
||||||
|
// или если не прошло проверку FILTER_VALIDATE_INT (но её невозможно не пройти здесь, просто так добавил)
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int) $sanitized;
|
||||||
|
} else {
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mirzaev\Feip\Params;
|
||||||
|
|
||||||
|
use Mirzaev\Feip\Error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Параметр фамилии
|
||||||
|
*
|
||||||
|
* @property string $second_name Фамилия
|
||||||
|
*
|
||||||
|
* @package Mirzaev\Feip\Params
|
||||||
|
* @author Арсен Мирзаев <red@hood.su>
|
||||||
|
*/
|
||||||
|
trait SecondName
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Фамилия: параметр
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected string $second_name = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Фамилия: фильтр
|
||||||
|
*
|
||||||
|
* @param mixed $target Значение для фильтрации
|
||||||
|
*
|
||||||
|
* @return array|null
|
||||||
|
*/
|
||||||
|
public static function secondName($target): ?array
|
||||||
|
{
|
||||||
|
// Очистка
|
||||||
|
if ($sanitized = filter_var($target, FILTER_SANITIZE_STRING)) {
|
||||||
|
// Если очищение вернуло результат
|
||||||
|
|
||||||
|
// Проверка
|
||||||
|
if ($sanitized !== $target) {
|
||||||
|
// Если очищенное значение не совпадает с отправленным
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (array) $sanitized;
|
||||||
|
} else {
|
||||||
|
new Error(200, __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mirzaev\Feip\Params;
|
||||||
|
|
||||||
|
use Mirzaev\Feip\Error,
|
||||||
|
Mirzaev\Feip\Methods\MethodAbstract,
|
||||||
|
Mirzaev\Feip\Params\FirstName,
|
||||||
|
Mirzaev\Feip\Params\SecondName,
|
||||||
|
Mirzaev\Feip\Params\Age;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Параметр пользователей
|
||||||
|
*
|
||||||
|
* @property array $users Пользователи
|
||||||
|
*
|
||||||
|
* @package Mirzaev\Feip\Params
|
||||||
|
* @author Арсен Мирзаев <red@hood.su>
|
||||||
|
*/
|
||||||
|
trait Users
|
||||||
|
{
|
||||||
|
use FirstName, SecondName, Age;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Пользователи: параметр
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected array $users = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Before
|
||||||
|
*
|
||||||
|
* Вызывается перед обработкой
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function usersBefore(): void
|
||||||
|
{
|
||||||
|
$this->ignore[] = 'first_name';
|
||||||
|
$this->ignore[] = 'second_name';
|
||||||
|
$this->ignore[] = 'age';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* After
|
||||||
|
*
|
||||||
|
* Вызывается после обработки
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function usersAfter(): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
actor: BarTester
|
||||||
|
modules:
|
||||||
|
enabled:
|
||||||
|
- \Helper\Foo
|
||||||
|
- REST:
|
||||||
|
url: http://feip.loc/api/bar
|
||||||
|
depends: PhpBrowser
|
|
@ -0,0 +1,107 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class BarCest
|
||||||
|
{
|
||||||
|
public function tryPostJsonToFilter(BarTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"bar": "asd",
|
||||||
|
"email": "test@mail.ru",
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"first_name": "Arsen",
|
||||||
|
"second_name": "Mirzaev",
|
||||||
|
"age": "19"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"bar":"asd","email":"test@mail.ru","users":{"first_name":["Arsen"],"second_name":["Mirzaev"],"age":19}},"errors":[]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButUsersHasSecond(BarTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"bar": "asd",
|
||||||
|
"email": "test@mail.ru",
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"first_name": "Arsen",
|
||||||
|
"second_name": "Mirzaev",
|
||||||
|
"age": "19"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"first_name": "Ivan",
|
||||||
|
"second_name": "Voronkov",
|
||||||
|
"age": "18"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"bar":"asd","email":"test@mail.ru","users":[{"first_name":["Arsen"],"second_name":["Mirzaev"],"age":19},{"first_name":["Ivan"],"second_name":["Voronkov"],"age":18}]},"errors":[]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButBarIsArray(BarTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"bar": [
|
||||||
|
{
|
||||||
|
"first_name": "Arsen",
|
||||||
|
"second_name": "Mirzaev",
|
||||||
|
"age": "19"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"email": "test@mail.ru",
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"first_name": "Arsen",
|
||||||
|
"second_name": "Mirzaev",
|
||||||
|
"age": "19"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"bar":"","email":"test@mail.ru","users":{"first_name":["Arsen"],"second_name":["Mirzaev"],"age":19}},"errors":[{"type":200,"target":"bar","value":"\u041d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430"}]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButEmailHasWrongValue(BarTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"bar": "asd",
|
||||||
|
"email": "test@mail",
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"first_name": "Arsen",
|
||||||
|
"second_name": "Mirzaev",
|
||||||
|
"age": "19"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"bar":"asd","email":"test@mail","users":{"first_name":["Arsen"],"second_name":["Mirzaev"],"age":19}},"errors":[{"type":200,"target":"email","value":"\u041d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430"}]}');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
actor: FooTester
|
||||||
|
modules:
|
||||||
|
enabled:
|
||||||
|
- \Helper\Foo
|
||||||
|
- REST:
|
||||||
|
url: http://feip.loc/api/foo
|
||||||
|
depends: PhpBrowser
|
|
@ -0,0 +1,191 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class FooCest
|
||||||
|
{
|
||||||
|
public function tryPostJsonToFilter(FooTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"foo": "123",
|
||||||
|
"bar": "asd",
|
||||||
|
"baz": "79502885623"
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"foo":123,"bar":"asd","baz":"79502885623"},"errors":[]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButFooIsEmpty(FooTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"foo": "",
|
||||||
|
"bar": "asd",
|
||||||
|
"baz": "79502885623"
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"foo":0,"bar":"asd","baz":"79502885623"},"errors":[{"type":100,"target":"foo","value":"\u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440"}]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButFooHasWrongValue(FooTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"foo": "123абв",
|
||||||
|
"bar": "asd",
|
||||||
|
"baz": "79502885623"
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"foo":123,"bar":"asd","baz":"79502885623"},"errors":[{"type":200,"target":"foo","value":"\u041d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430"}]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButFooWithoutValue(FooTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"bar": "asd",
|
||||||
|
"baz": "79502885623"
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"foo":0,"bar":"asd","baz":"79502885623"},"errors":[{"type":100,"target":"foo","value":"\u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440"}]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButBarIsEmpty(FooTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"foo": "123",
|
||||||
|
"bar": "",
|
||||||
|
"baz": "79502885623"
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"foo":123,"bar":"","baz":"79502885623"},"errors":[{"type":100,"target":"bar","value":"\u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440"}]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButBarWithoutValue(FooTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"foo": "123",
|
||||||
|
"baz": "79502885623"
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"foo":123,"bar":"","baz":"79502885623"},"errors":[{"type":100,"target":"bar","value":"\u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440"}]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButBazIsEmpty(FooTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"foo": "123",
|
||||||
|
"bar": "asd",
|
||||||
|
"baz": ""
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"foo":123,"bar":"asd","baz":""},"errors":[{"type":100,"target":"baz","value":"\u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440"}]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButBazHasWrongValue(FooTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"foo": "123",
|
||||||
|
"bar": "asd",
|
||||||
|
"baz": "8 (950) 288-56-23"
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"foo":123,"bar":"asd","baz":"79502885623"},"errors":[{"type":200,"target":"baz","value":"\u041d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430"}]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButBazHasTooShortValue(FooTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"foo": "123",
|
||||||
|
"bar": "asd",
|
||||||
|
"baz": "260557"
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"foo":123,"bar":"asd","baz":"760557"},"errors":[{"type":200,"target":"baz","value":"\u041d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430"}]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButBazWithoutValue(FooTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"foo": "123",
|
||||||
|
"bar": "asd"
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"foo":123,"bar":"asd","baz":""},"errors":[{"type":100,"target":"baz","value":"\u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440"}]}');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryPostJsonToFilterButBarIsArray(FooTester $I)
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('User-Agent', 'FEIP Tester');
|
||||||
|
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
$I->sendPOST(
|
||||||
|
'/index.php',
|
||||||
|
[
|
||||||
|
'{
|
||||||
|
"foo": "123",
|
||||||
|
"bar": {
|
||||||
|
"bar_foo": "100",
|
||||||
|
"bar_bar": "sad"
|
||||||
|
},
|
||||||
|
"baz": "79502885623"
|
||||||
|
}'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$I->seeResponseContains('{"response":{"foo":123,"bar":"","baz":"79502885623"},"errors":[{"type":200,"target":"bar","value":"\u041d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430"}]}');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
./*
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inherited Methods
|
||||||
|
* @method void wantToTest($text)
|
||||||
|
* @method void wantTo($text)
|
||||||
|
* @method void execute($callable)
|
||||||
|
* @method void expectTo($prediction)
|
||||||
|
* @method void expect($prediction)
|
||||||
|
* @method void amGoingTo($argumentation)
|
||||||
|
* @method void am($role)
|
||||||
|
* @method void lookForwardTo($achieveValue)
|
||||||
|
* @method void comment($description)
|
||||||
|
* @method void pause()
|
||||||
|
*
|
||||||
|
* @SuppressWarnings(PHPMD)
|
||||||
|
*/
|
||||||
|
class BarTester extends \Codeception\Actor
|
||||||
|
{
|
||||||
|
use _generated\BarTesterActions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define custom actions here
|
||||||
|
*/
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inherited Methods
|
||||||
|
* @method void wantToTest($text)
|
||||||
|
* @method void wantTo($text)
|
||||||
|
* @method void execute($callable)
|
||||||
|
* @method void expectTo($prediction)
|
||||||
|
* @method void expect($prediction)
|
||||||
|
* @method void amGoingTo($argumentation)
|
||||||
|
* @method void am($role)
|
||||||
|
* @method void lookForwardTo($achieveValue)
|
||||||
|
* @method void comment($description)
|
||||||
|
* @method void pause()
|
||||||
|
*
|
||||||
|
* @SuppressWarnings(PHPMD)
|
||||||
|
*/
|
||||||
|
class FooTester extends \Codeception\Actor
|
||||||
|
{
|
||||||
|
use _generated\FooTesterActions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define custom actions here
|
||||||
|
*/
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
namespace Helper;
|
||||||
|
|
||||||
|
// here you can define custom actions
|
||||||
|
// all public methods declared in helper class will be available in $I
|
||||||
|
|
||||||
|
class Bar extends \Codeception\Module
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
namespace Helper;
|
||||||
|
|
||||||
|
// here you can define custom actions
|
||||||
|
// all public methods declared in helper class will be available in $I
|
||||||
|
|
||||||
|
class Foo extends \Codeception\Module
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,29 @@
|
||||||
|
|
||||||
|
```php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Dotenv\Dotenv;
|
||||||
|
use VK\Core as VK;
|
||||||
|
use VK\API\Methods\Message;
|
||||||
|
|
||||||
|
// Подключение зависимостей и настроек
|
||||||
|
require_once './vendor/autoload.php';
|
||||||
|
Dotenv::createImmutable(__DIR__)->load();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Инициализация и настрйока ядра
|
||||||
|
*
|
||||||
|
* @return object Экземпляр класса ядра
|
||||||
|
**/
|
||||||
|
VK::init()->log();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Сборка робота из ядра фреймворка
|
||||||
|
*
|
||||||
|
* @return int Идентификатор робота (0)
|
||||||
|
**/
|
||||||
|
VK::init()->build()->robot();
|
||||||
|
|
||||||
|
// Отправка сообщения (ID робота, кому, сообщение)
|
||||||
|
Message::post(0, 214547089, 'Робот роботает!!!', 1);
|
||||||
|
```
|
|
@ -0,0 +1,9 @@
|
||||||
|
paths:
|
||||||
|
tests: Mirzaev/Feip/Tests
|
||||||
|
output: Mirzaev/Feip/Tests/_output
|
||||||
|
data: Mirzaev/Feip/Tests/_data
|
||||||
|
support: Mirzaev/Feip/Tests/_support
|
||||||
|
|
||||||
|
settings:
|
||||||
|
shuffle: false
|
||||||
|
lint: true
|
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
"name": "mirzaev/feip",
|
||||||
|
"description": "FEIP test project: \"sanitizer\"",
|
||||||
|
"type": "project",
|
||||||
|
"license": "AGPL-3.0-or-later",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Arsen Mirzaev",
|
||||||
|
"email": "red@hood.su",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpdocumentor/phpdocumentor": ">=2.9",
|
||||||
|
"codeception/codeception": "^4.1",
|
||||||
|
"codeception/module-asserts": "^1.0.0",
|
||||||
|
"codeception/module-phpbrowser": "^1.0",
|
||||||
|
"codeception/module-rest": "^1.0.0"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Mirzaev\\Feip\\": "Mirzaev/Feip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue