feat: add MoneyValidator

fix: MoneyValidator

MoneyValidator

fix: moneyvalidator (fakt)

moneyValidator
This commit is contained in:
Ondrej Vlach 2024-01-17 14:13:27 +01:00
parent 1437ce4558
commit 3cb6f7488f
Signed by: ovlach
GPG Key ID: 4FF1A23B4914DE70
4 changed files with 107 additions and 0 deletions

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Entity\QRCode; namespace App\Entity\QRCode;
use App\Validator\Currency; use App\Validator\Currency;
use App\Validator\Money;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
/** /**
@ -15,6 +16,7 @@ class QRCodeMoney
message: 'messages.not_valid_amount', message: 'messages.not_valid_amount',
)] )]
#[Assert\NotBlank(message: 'messages.fill_value')] #[Assert\NotBlank(message: 'messages.fill_value')]
#[Money(message: 'messages.not_valid_amount')]
private ?string $amount; private ?string $amount;
// TODO: getCurrencies validation // TODO: getCurrencies validation

31
src/Validator/Money.php Normal file
View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace App\Validator;
use Symfony\Component\Validator\Constraint;
#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Money extends Constraint
{
public const NOT_CURRENCY_ERROR = '478618e7-95ba-473d-9101-cabd45e49115';
protected const ERROR_NAMES = [
self::NOT_CURRENCY_ERROR => 'NOT_CURRENCY_ERROR',
];
public string $message = 'This value should be currency.';
/**
* @param mixed|null $options
* @param string|null $message
* @param array<string>|null $groups
* @param mixed|null $payload
*/
public function __construct(mixed $options = null, string $message = null, array $groups = null, mixed $payload = null)
{
parent::__construct($options ?? [], $groups, $payload);
$this->message = $message ?? $this->message;
}
}

View File

@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace App\Validator;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;
class MoneyValidator extends ConstraintValidator {
public function validate(mixed $value, Constraint $constraint): void
{
if (!$constraint instanceof Money) {
throw new UnexpectedTypeException($constraint, Money::class);
}
if (null === $value || '' === $value) {
return ;
}
if (is_string($value) === false) {
throw new UnexpectedValueException($value, "string");
}
if (preg_match('/^\d+([\.,]\d{0,2})?$/', $value)) {
return ;
}
$this->context->buildViolation($constraint->message)
->setParameter('{{ string }}', $value)
->addViolation();
}
}

View File

@ -0,0 +1,40 @@
<?php
declare(strict_types=1);
namespace App\Tests\Validator;
use App\Validator\Money;
use App\Validator\MoneyValidator;
class MoneyValidatorTest extends ValidatorTestCase
{
/**
* @dataProvider successDp
* @param string $generatedValue
* @return void
*/
public function testSuccess(string $generatedValue): void {
$moneyValidator = new MoneyValidator();
$moneyValidator->initialize($this->createExecutionContext(false));
$moneyValidator->validate($generatedValue, new Money(['message' => 'foo']));
}
private function successDp(): array {
return [['122'], ['122.0'], ['122,00'], ['122'], ['2.05'], ['2,04']];
}
/**
* @dataProvider failureDp
* @param string $generatedValue
* @return void
*/
public function testFailure(string $generatedValue): void {
$moneyValidator = new MoneyValidator();
$moneyValidator->initialize($this->createExecutionContext(true));
$moneyValidator->validate($generatedValue, new Money(['message' => 'foo']));
}
private function failureDp(): array {
return [['122.b'], ['a.a'], ['a'], ['2.040'], ['2,a']];
}
}