Skip to content

Commit

Permalink
manual written present attribute rule always overwrites a generated r…
Browse files Browse the repository at this point in the history
…equired rule
  • Loading branch information
rubenvanassche committed Jul 5, 2023
1 parent d5cdc09 commit 34c2363
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
7 changes: 7 additions & 0 deletions src/RuleInferrers/AttributesRuleInferrer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

namespace Spatie\LaravelData\RuleInferrers;

use Spatie\LaravelData\Attributes\Validation\Present;
use Spatie\LaravelData\Attributes\Validation\Required;
use Spatie\LaravelData\Support\DataProperty;
use Spatie\LaravelData\Support\Validation\PropertyRules;
use Spatie\LaravelData\Support\Validation\RequiringRule;
use Spatie\LaravelData\Support\Validation\RuleNormalizer;
use Spatie\LaravelData\Support\Validation\ValidationContext;
use Spatie\LaravelData\Support\Validation\ValidationRule;
Expand All @@ -23,6 +26,10 @@ public function handle(
->attributes
->filter(fn (object $attribute) => $attribute instanceof ValidationRule)
->each(function (ValidationRule $rule) use ($rules) {
if($rule instanceof Present && $rules->hasType(RequiringRule::class)) {
$rules->removeType(RequiringRule::class);
}

$rules->add(
...$this->rulesDenormalizer->execute($rule)
);
Expand Down
2 changes: 1 addition & 1 deletion tests/DataTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Spatie\LaravelData\Attributes\DataCollectionOf;
use Spatie\LaravelData\Attributes\MapOutputName;
use Spatie\LaravelData\Attributes\Validation\Min;
use Spatie\LaravelData\Attributes\Validation\Present;
use Spatie\LaravelData\Attributes\WithCast;
use Spatie\LaravelData\Attributes\WithCastable;
use Spatie\LaravelData\Attributes\WithTransformer;
Expand Down Expand Up @@ -66,7 +67,6 @@
use Spatie\LaravelData\Tests\Fakes\UnionData;
use Spatie\LaravelData\Transformers\DateTimeInterfaceTransformer;
use Spatie\LaravelData\WithData;

use function Spatie\Snapshots\assertMatchesSnapshot;

it('can create a resource', function () {
Expand Down
16 changes: 16 additions & 0 deletions tests/ValidationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
use Spatie\LaravelData\Attributes\Validation\Max;
use Spatie\LaravelData\Attributes\Validation\Min;
use Spatie\LaravelData\Attributes\Validation\Nullable;
use Spatie\LaravelData\Attributes\Validation\Present;
use Spatie\LaravelData\Attributes\Validation\Required;
use Spatie\LaravelData\Attributes\Validation\RequiredIf;
use Spatie\LaravelData\Attributes\Validation\RequiredWith;
Expand Down Expand Up @@ -2202,3 +2203,18 @@ public static function rules(ValidationContext $context): array
'default' => ['required', 'string', 'min:10'],
], ['default' => 'something']);
});

it('a manual written present attribute rule always overwrites a generated required rule', function () {
$dataClass = new class () extends Data {
#[Present]
public array $array;
};

DataValidationAsserter::for($dataClass)
->assertOk(['array' => []])
->assertOk(['array' => ['a', 'b']])
->assertErrors(['array' => null])
->assertRules([
'array' => ['array', 'present'],
], []);
});

0 comments on commit 34c2363

Please sign in to comment.