diff --git a/src/Resolvers/DataFromSomethingResolver.php b/src/Resolvers/DataFromSomethingResolver.php index 2bc2765b..fcdec677 100644 --- a/src/Resolvers/DataFromSomethingResolver.php +++ b/src/Resolvers/DataFromSomethingResolver.php @@ -71,7 +71,8 @@ protected function createFromCustomCreationMethod(string $class, array $payloads $customCreationMethods = $this->dataConfig ->getDataClass($class) ->methods - ->filter(fn(DataMethod $method) => $method->isCustomCreationMethod + ->filter( + fn (DataMethod $method) => $method->isCustomCreationMethod && ! in_array($method->name, $this->ignoredMagicalMethods) ); diff --git a/tests/DataTest.php b/tests/DataTest.php index bfe1f6b5..16b71c58 100644 --- a/tests/DataTest.php +++ b/tests/DataTest.php @@ -10,16 +10,17 @@ use Illuminate\Validation\ValidationException; use Inertia\LazyProp; -use Spatie\LaravelData\Concerns\WireableData; use function PHPUnit\Framework\assertFalse; use Spatie\LaravelData\Attributes\DataCollectionOf; + use Spatie\LaravelData\Attributes\MapOutputName; use Spatie\LaravelData\Attributes\Validation\In; use Spatie\LaravelData\Attributes\WithCast; use Spatie\LaravelData\Attributes\WithTransformer; use Spatie\LaravelData\Casts\DateTimeInterfaceCast; use Spatie\LaravelData\Concerns\DataTrait; +use Spatie\LaravelData\Concerns\WireableData; use Spatie\LaravelData\Contracts\DataObject; use Spatie\LaravelData\Data; use Spatie\LaravelData\DataCollection; @@ -116,7 +117,7 @@ DataPropertyBlueprintFactory::new('name')->lazy()->withType('string') )->create(); - $data = new $dataClass(Lazy::create(fn() => 'test')); + $data = new $dataClass(Lazy::create(fn () => 'test')); expect($data->toArray())->toBe([]); @@ -150,8 +151,8 @@ )->create(); $data = new $dataClass( - Lazy::create(fn() => LazyData::from('Hello')), - Lazy::create(fn() => LazyData::collection(['is', 'it', 'me', 'your', 'looking', 'for',])), + Lazy::create(fn () => LazyData::from('Hello')), + Lazy::create(fn () => LazyData::collection(['is', 'it', 'me', 'your', 'looking', 'for',])), ); expect((clone $data)->toArray())->toBe([]); @@ -196,7 +197,7 @@ DataPropertyBlueprintFactory::dataCollection('songs', MultiLazyData::class)->lazy() )->create(); - $collection = Lazy::create(fn() => MultiLazyData::collection([ + $collection = Lazy::create(fn () => MultiLazyData::collection([ DummyDto::rick(), DummyDto::bon(), ])); @@ -253,7 +254,7 @@ public function __construct( public static function create(string $name): static { return new self( - Lazy::when(fn() => $name === 'Ruben', fn() => $name) + Lazy::when(fn () => $name === 'Ruben', fn () => $name) ); } }; @@ -277,7 +278,7 @@ public function __construct( public static function create(string $name): static { return new self( - Lazy::when(fn() => $name === 'Ruben', fn() => $name) + Lazy::when(fn () => $name === 'Ruben', fn () => $name) ); } }; @@ -339,7 +340,7 @@ public function __construct( public static function create(string $name): static { return new self( - Lazy::inertia(fn() => $name) + Lazy::inertia(fn () => $name) ); } }; @@ -569,7 +570,7 @@ public function __construct( $data = new class ( $dataObject = new SimpleData('Test'), $dataCollection = SimpleData::collection([new SimpleData('A'), new SimpleData('B')]), - Lazy::create(fn() => new SimpleData('Lazy')), + Lazy::create(fn () => new SimpleData('Lazy')), 'Test', $transformable = new DateTime('16 may 1994') ) extends Data { @@ -703,7 +704,7 @@ public function __construct(public string $name) $transformed = $data->additional([ 'company' => 'Spatie', - 'alt_name' => fn(Data $data) => "{$data->name} from Spatie", + 'alt_name' => fn (Data $data) => "{$data->name} from Spatie", ])->toArray(); expect($transformed)->toMatchArray([ @@ -1003,7 +1004,7 @@ public function __construct( public Data $nestedData, #[ WithTransformer(ConfidentialDataCollectionTransformer::class), - DataCollectionOf(SimpleData::class) + DataCollectionOf(SimpleData::class) ] public DataCollection $nestedDataCollection, ) { @@ -1197,7 +1198,7 @@ public function __construct( }); it('will not include lazy optional values when transforming', function () { - $data = new class ('Hello World', Lazy::create(fn() => Optional::make())) extends Data { + $data = new class ('Hello World', Lazy::create(fn () => Optional::make())) extends Data { public function __construct( public string $string, public string|Optional|Lazy $lazy_optional_string, @@ -1247,7 +1248,7 @@ public function __construct( public DataCollection $nested_collection, #[ MapOutputName('nested_other_collection'), - DataCollectionOf(SimpleDataWithMappedProperty::class) + DataCollectionOf(SimpleDataWithMappedProperty::class) ] public DataCollection $nested_renamed_collection, ) { @@ -1427,7 +1428,7 @@ public static function pipeline(): DataPipeline expect( MultiLazyData::from(DummyDto::rick()) - ->includeWhen('name', fn(MultiLazyData $data) => $data->artist->resolve() === 'Rick Astley') + ->includeWhen('name', fn (MultiLazyData $data) => $data->artist->resolve() === 'Rick Astley') ->toArray() ) ->toMatchArray([ @@ -1452,7 +1453,7 @@ public static function pipeline(): DataPipeline it('can conditionally include using class defaults', function () { PartialClassConditionalData::setDefinitions(includeDefinitions: [ - 'string' => fn(PartialClassConditionalData $data) => $data->enabled, + 'string' => fn (PartialClassConditionalData $data) => $data->enabled, ]); expect(PartialClassConditionalData::createLazy(enabled: false)) @@ -1466,7 +1467,7 @@ public static function pipeline(): DataPipeline it('can conditionally include using class defaults nested', function () { PartialClassConditionalData::setDefinitions(includeDefinitions: [ - 'nested.string' => fn(PartialClassConditionalData $data) => $data->enabled, + 'nested.string' => fn (PartialClassConditionalData $data) => $data->enabled, ]); expect(PartialClassConditionalData::createLazy(enabled: true)) @@ -1476,8 +1477,8 @@ public static function pipeline(): DataPipeline it('can conditionally include using class defaults multiple', function () { PartialClassConditionalData::setDefinitions(includeDefinitions: [ - 'nested.string' => fn(PartialClassConditionalData $data) => $data->enabled, - 'string' => fn(PartialClassConditionalData $data) => $data->enabled, + 'nested.string' => fn (PartialClassConditionalData $data) => $data->enabled, + 'string' => fn (PartialClassConditionalData $data) => $data->enabled, ]); expect(PartialClassConditionalData::createLazy(enabled: false)) @@ -1495,8 +1496,8 @@ public static function pipeline(): DataPipeline it('can conditionally exclude', function () { $data = new MultiLazyData( - Lazy::create(fn() => 'Rick Astley')->defaultIncluded(), - Lazy::create(fn() => 'Never gonna give you up')->defaultIncluded(), + Lazy::create(fn () => 'Rick Astley')->defaultIncluded(), + Lazy::create(fn () => 'Never gonna give you up')->defaultIncluded(), 1989 ); @@ -1515,7 +1516,7 @@ public static function pipeline(): DataPipeline expect( (clone $data) - ->exceptWhen('name', fn(MultiLazyData $data) => $data->artist->resolve() === 'Rick Astley') + ->exceptWhen('name', fn (MultiLazyData $data) => $data->artist->resolve() === 'Rick Astley') ->toArray() ) ->toMatchArray([ @@ -1529,7 +1530,7 @@ public static function pipeline(): DataPipeline public NestedLazyData $nested; }; - $data->nested = new NestedLazyData(Lazy::create(fn() => SimpleData::from('Hello World'))->defaultIncluded()); + $data->nested = new NestedLazyData(Lazy::create(fn () => SimpleData::from('Hello World'))->defaultIncluded()); expect($data->toArray())->toMatchArray([ 'nested' => ['simple' => ['string' => 'Hello World']], @@ -1541,7 +1542,7 @@ public static function pipeline(): DataPipeline it('can conditionally exclude using class defaults', function () { PartialClassConditionalData::setDefinitions(excludeDefinitions: [ - 'string' => fn(PartialClassConditionalData $data) => $data->enabled, + 'string' => fn (PartialClassConditionalData $data) => $data->enabled, ]); expect(PartialClassConditionalData::createDefaultIncluded(enabled: false)) @@ -1562,7 +1563,7 @@ public static function pipeline(): DataPipeline it('can conditionally exclude using class defaults nested', function () { PartialClassConditionalData::setDefinitions(excludeDefinitions: [ - 'nested.string' => fn(PartialClassConditionalData $data) => $data->enabled, + 'nested.string' => fn (PartialClassConditionalData $data) => $data->enabled, ]); expect(PartialClassConditionalData::createDefaultIncluded(enabled: false)) @@ -1583,8 +1584,8 @@ public static function pipeline(): DataPipeline it('can conditionally exclude using multiple class defaults', function () { PartialClassConditionalData::setDefinitions(excludeDefinitions: [ - 'string' => fn(PartialClassConditionalData $data) => $data->enabled, - 'nested.string' => fn(PartialClassConditionalData $data) => $data->enabled, + 'string' => fn (PartialClassConditionalData $data) => $data->enabled, + 'nested.string' => fn (PartialClassConditionalData $data) => $data->enabled, ]); expect(PartialClassConditionalData::createDefaultIncluded(enabled: false)) @@ -1620,15 +1621,15 @@ public static function pipeline(): DataPipeline expect( (clone $data) - ->onlyWhen('second', fn(MultiData $data) => $data->second === 'World') + ->onlyWhen('second', fn (MultiData $data) => $data->second === 'World') ->toArray() ) ->toMatchArray(['second' => 'World']); expect( (clone $data) - ->onlyWhen('first', fn(MultiData $data) => $data->first === 'Hello') - ->onlyWhen('second', fn(MultiData $data) => $data->second === 'World') + ->onlyWhen('first', fn (MultiData $data) => $data->first === 'Hello') + ->onlyWhen('second', fn (MultiData $data) => $data->second === 'World') ->toArray() ) ->toMatchArray([ @@ -1662,7 +1663,7 @@ public static function pipeline(): DataPipeline it('can conditionally define only using class defaults', function () { PartialClassConditionalData::setDefinitions(onlyDefinitions: [ - 'string' => fn(PartialClassConditionalData $data) => $data->enabled, + 'string' => fn (PartialClassConditionalData $data) => $data->enabled, ]); expect(PartialClassConditionalData::create(enabled: false)) @@ -1680,7 +1681,7 @@ public static function pipeline(): DataPipeline it('can conditionally define only using class defaults nested', function () { PartialClassConditionalData::setDefinitions(onlyDefinitions: [ - 'nested.string' => fn(PartialClassConditionalData $data) => $data->enabled, + 'nested.string' => fn (PartialClassConditionalData $data) => $data->enabled, ]); expect(PartialClassConditionalData::create(enabled: false)) @@ -1700,8 +1701,8 @@ public static function pipeline(): DataPipeline it('can conditionally define only using multiple class defaults', function () { PartialClassConditionalData::setDefinitions(onlyDefinitions: [ - 'string' => fn(PartialClassConditionalData $data) => $data->enabled, - 'nested.string' => fn(PartialClassConditionalData $data) => $data->enabled, + 'string' => fn (PartialClassConditionalData $data) => $data->enabled, + 'nested.string' => fn (PartialClassConditionalData $data) => $data->enabled, ]); expect(PartialClassConditionalData::create(enabled: false)) @@ -1736,7 +1737,7 @@ public static function pipeline(): DataPipeline expect( (clone $data) - ->exceptWhen('second', fn(MultiData $data) => $data->second === 'World') + ->exceptWhen('second', fn (MultiData $data) => $data->second === 'World') ) ->toArray() ->toMatchArray([ @@ -1745,8 +1746,8 @@ public static function pipeline(): DataPipeline expect( (clone $data) - ->exceptWhen('first', fn(MultiData $data) => $data->first === 'Hello') - ->exceptWhen('second', fn(MultiData $data) => $data->second === 'World') + ->exceptWhen('first', fn (MultiData $data) => $data->first === 'Hello') + ->exceptWhen('second', fn (MultiData $data) => $data->second === 'World') ->toArray() )->toBeEmpty(); }); @@ -1769,7 +1770,7 @@ public static function pipeline(): DataPipeline it('can conditionally define except using class defaults', function () { PartialClassConditionalData::setDefinitions(exceptDefinitions: [ - 'string' => fn(PartialClassConditionalData $data) => $data->enabled, + 'string' => fn (PartialClassConditionalData $data) => $data->enabled, ]); expect(PartialClassConditionalData::create(enabled: false)) @@ -1790,7 +1791,7 @@ public static function pipeline(): DataPipeline it('can conditionally define except using class defaults nested', function () { PartialClassConditionalData::setDefinitions(exceptDefinitions: [ - 'nested.string' => fn(PartialClassConditionalData $data) => $data->enabled, + 'nested.string' => fn (PartialClassConditionalData $data) => $data->enabled, ]); expect(PartialClassConditionalData::create(enabled: false)) @@ -1812,8 +1813,8 @@ public static function pipeline(): DataPipeline it('can conditionally define except using multiple class defaults', function () { PartialClassConditionalData::setDefinitions(exceptDefinitions: [ - 'string' => fn(PartialClassConditionalData $data) => $data->enabled, - 'nested.string' => fn(PartialClassConditionalData $data) => $data->enabled, + 'string' => fn (PartialClassConditionalData $data) => $data->enabled, + 'nested.string' => fn (PartialClassConditionalData $data) => $data->enabled, ]); expect(PartialClassConditionalData::create(enabled: false)) diff --git a/tests/Resolvers/DataFromSomethingResolverTest.php b/tests/Resolvers/DataFromSomethingResolverTest.php index c0f712ff..c9529b1b 100644 --- a/tests/Resolvers/DataFromSomethingResolverTest.php +++ b/tests/Resolvers/DataFromSomethingResolverTest.php @@ -7,13 +7,14 @@ use Illuminate\Validation\Rule; use Illuminate\Validation\ValidationException; -use Spatie\LaravelData\Resolvers\DataFromSomethingResolver; use function Pest\Laravel\handleExceptions; use function Pest\Laravel\mock; use function Pest\Laravel\postJson; use Spatie\LaravelData\Data; + use Spatie\LaravelData\Optional; +use Spatie\LaravelData\Resolvers\DataFromSomethingResolver; use Spatie\LaravelData\Tests\Fakes\DataWithMultipleArgumentCreationMethod; use Spatie\LaravelData\Tests\Fakes\DummyDto; @@ -97,7 +98,7 @@ public static function fromModel(Model $model) it('can resolve validation dependencies for messages', function () { $requestMock = mock(Request::class); $requestMock->expects('input')->andReturns('value'); - $this->app->bind(Request::class, fn() => $requestMock); + $this->app->bind(Request::class, fn () => $requestMock); $data = new class () extends Data { public string $name; @@ -135,7 +136,7 @@ public static function messages(Request $request): array it('can resolve validation dependencies for attributes ', function () { $requestMock = mock(Request::class); $requestMock->expects('input')->andReturns('value'); - $this->app->bind(Request::class, fn() => $requestMock); + $this->app->bind(Request::class, fn () => $requestMock); $data = new class () extends Data { public string $name; @@ -173,7 +174,7 @@ public static function attributes(Request $request): array it('can resolve validation dependencies for redirect url', function () { $requestMock = mock(Request::class); $requestMock->expects('input')->andReturns('value'); - $this->app->bind(Request::class, fn() => $requestMock); + $this->app->bind(Request::class, fn () => $requestMock); $data = new class () extends Data { public string $name; @@ -205,7 +206,7 @@ public static function redirect(Request $request): string it('can resolve validation dependencies for error bag', function () { $requestMock = mock(Request::class); $requestMock->expects('input')->andReturns('value'); - $this->app->bind(Request::class, fn() => $requestMock); + $this->app->bind(Request::class, fn () => $requestMock); $data = new class () extends Data { public string $name; @@ -252,7 +253,7 @@ public static function fromRequest(Request $request) } }; - Route::post('/', fn(Request $request) => $data::from($request)); + Route::post('/', fn (Request $request) => $data::from($request)); postJson('/', [])->assertJsonValidationErrorFor('string');