OverwriteRules
This commit is contained in:
parent
3a26a2e0c2
commit
709201547c
8 changed files with 252 additions and 19 deletions
120
tests/Rules/RulesTest.php
Normal file
120
tests/Rules/RulesTest.php
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Rules;
|
||||
|
||||
use Icefox\DTO\Support\RuleFactory;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Tests\Rules\WithEmptyOverwriteRules;
|
||||
use Tests\Rules\WithMergedRules;
|
||||
use Tests\Rules\WithOverwriteRules;
|
||||
|
||||
describe('rules array shape', function () {
|
||||
it('returns inferred rules shape from RuleFactory::infer (inferred only)', function () {
|
||||
$parameters = RuleFactory::getParametersMeta(WithMergedRules::class);
|
||||
$rules = RuleFactory::infer($parameters, '');
|
||||
|
||||
expect($rules)->toBe([
|
||||
'value' => ['required', 'numeric'],
|
||||
]);
|
||||
});
|
||||
|
||||
it('returns inferred rules shape regardless of OverwriteRules attribute', function () {
|
||||
$parameters = RuleFactory::getParametersMeta(WithOverwriteRules::class);
|
||||
$rules = RuleFactory::infer($parameters, '');
|
||||
|
||||
expect($rules)->toBe([
|
||||
'value' => ['required', 'numeric'],
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getRules method', function () {
|
||||
it('returns merged rules from DataObject::getRules()', function () {
|
||||
$rules = WithMergedRules::getRules();
|
||||
|
||||
expect($rules)->toBe([
|
||||
'value' => ['required', 'numeric', 'max:20'],
|
||||
]);
|
||||
});
|
||||
|
||||
it('returns only custom rules from DataObject::getRules() with OverwriteRules', function () {
|
||||
$rules = WithOverwriteRules::getRules();
|
||||
|
||||
expect($rules)->toBe([
|
||||
'value' => ['numeric', 'max:20'],
|
||||
]);
|
||||
});
|
||||
|
||||
it('returns empty rules from DataObject::getRules() with OverwriteRules and no custom rules', function () {
|
||||
$rules = WithEmptyOverwriteRules::getRules();
|
||||
|
||||
expect($rules)->toBe([]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('rules merging', function () {
|
||||
it('merges custom rules with inferred rules by default', function () {
|
||||
$object = WithMergedRules::fromArray([
|
||||
'value' => 10,
|
||||
]);
|
||||
|
||||
expect($object->value)->toBe(10);
|
||||
});
|
||||
|
||||
it('fails validation when merged rule is violated', function () {
|
||||
expect(fn() => WithMergedRules::fromArray([
|
||||
'value' => 25,
|
||||
]))->toThrow(ValidationException::class);
|
||||
});
|
||||
|
||||
it('fails validation when required rule is violated (inferred)', function () {
|
||||
expect(fn() => WithMergedRules::fromArray([
|
||||
]))->toThrow(ValidationException::class);
|
||||
});
|
||||
});
|
||||
|
||||
describe('rules overwrite', function () {
|
||||
it('uses only custom rules when OverwriteRules attribute is present', function () {
|
||||
$object = WithOverwriteRules::fromArray([
|
||||
'value' => 10,
|
||||
]);
|
||||
|
||||
expect($object->value)->toBe(10);
|
||||
});
|
||||
|
||||
it('fails validation when custom rule is violated', function () {
|
||||
expect(fn() => WithOverwriteRules::fromArray([
|
||||
'value' => 25,
|
||||
]))->toThrow(ValidationException::class);
|
||||
});
|
||||
|
||||
it('does not enforce inferred required rule when overwritten', function () {
|
||||
$object = WithOverwriteRules::fromArray([]);
|
||||
|
||||
expect($object)->toBeInstanceOf(WithOverwriteRules::class);
|
||||
});
|
||||
|
||||
it('does not enforce inferred numeric rule when overwritten', function () {
|
||||
$rules = WithOverwriteRules::rules();
|
||||
expect($rules)->toHaveKey('value');
|
||||
expect($rules['value'])->toBe(['numeric', 'max:20']);
|
||||
});
|
||||
});
|
||||
|
||||
describe('empty rules overwrite', function () {
|
||||
it('allows any value when rules are empty with OverwriteRules', function () {
|
||||
$object = WithEmptyOverwriteRules::fromArray([
|
||||
'value' => 999,
|
||||
]);
|
||||
|
||||
expect($object->value)->toBe(999);
|
||||
});
|
||||
|
||||
it('allows missing value when rules are empty with OverwriteRules', function () {
|
||||
$object = WithEmptyOverwriteRules::fromArray([]);
|
||||
|
||||
expect($object)->toBeInstanceOf(WithEmptyOverwriteRules::class);
|
||||
});
|
||||
});
|
||||
23
tests/Rules/WithEmptyOverwriteRules.php
Normal file
23
tests/Rules/WithEmptyOverwriteRules.php
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Rules;
|
||||
|
||||
use Icefox\DTO\Attributes\OverwriteRules;
|
||||
use Icefox\DTO\DataObject;
|
||||
|
||||
readonly class WithEmptyOverwriteRules
|
||||
{
|
||||
use DataObject;
|
||||
|
||||
public function __construct(
|
||||
public int $value,
|
||||
) {}
|
||||
|
||||
#[OverwriteRules]
|
||||
public static function rules(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
23
tests/Rules/WithMergedRules.php
Normal file
23
tests/Rules/WithMergedRules.php
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Rules;
|
||||
|
||||
use Icefox\DTO\DataObject;
|
||||
|
||||
readonly class WithMergedRules
|
||||
{
|
||||
use DataObject;
|
||||
|
||||
public function __construct(
|
||||
public int $value,
|
||||
) {}
|
||||
|
||||
public static function rules(): array
|
||||
{
|
||||
return [
|
||||
'value' => ['max:20'],
|
||||
];
|
||||
}
|
||||
}
|
||||
25
tests/Rules/WithOverwriteRules.php
Normal file
25
tests/Rules/WithOverwriteRules.php
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Rules;
|
||||
|
||||
use Icefox\DTO\Attributes\OverwriteRules;
|
||||
use Icefox\DTO\DataObject;
|
||||
|
||||
readonly class WithOverwriteRules
|
||||
{
|
||||
use DataObject;
|
||||
|
||||
public function __construct(
|
||||
public int $value,
|
||||
) {}
|
||||
|
||||
#[OverwriteRules]
|
||||
public static function rules(): array
|
||||
{
|
||||
return [
|
||||
'value' => ['numeric', 'max:20'],
|
||||
];
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue