From 827f95849ed08244a269e26e58a7c1f51aa36f49 Mon Sep 17 00:00:00 2001 From: Dzianis Kotau Date: Mon, 3 Apr 2023 23:22:51 +0400 Subject: [PATCH 1/2] Allow to fetch union data properties in unified way --- src/Lazy.php | 10 +++++++++ tests/DataTest.php | 29 +++++++++++++++++++++++++ tests/Fakes/UnionData.php | 45 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 tests/Fakes/UnionData.php diff --git a/src/Lazy.php b/src/Lazy.php index 66401d67..7f1e475b 100644 --- a/src/Lazy.php +++ b/src/Lazy.php @@ -46,4 +46,14 @@ public function isDefaultIncluded(): bool { return $this->defaultIncluded ?? false; } + + public function __get(string $name): mixed + { + return $this->resolve()->$name; + } + + public function __call(string $name, array $arguments): mixed + { + return call_user_func_array([$this->resolve(), $name], $arguments); + } } diff --git a/tests/DataTest.php b/tests/DataTest.php index 299f1329..d4b0d005 100644 --- a/tests/DataTest.php +++ b/tests/DataTest.php @@ -58,6 +58,7 @@ use Spatie\LaravelData\Tests\Fakes\Transformers\ConfidentialDataTransformer; use Spatie\LaravelData\Tests\Fakes\Transformers\StringToUpperTransformer; use Spatie\LaravelData\Tests\Fakes\UlarData; +use Spatie\LaravelData\Tests\Fakes\UnionData; use Spatie\LaravelData\Transformers\DateTimeInterfaceTransformer; use Spatie\LaravelData\WithData; @@ -2278,3 +2279,31 @@ public function __construct( expect($invaded->_except)->toBeEmpty(); expect($invaded->_wrap)->toBeNull(); }); + +it('can fetch lazy union data', function () { + $data = UnionData::from(1); + + expect($data->id) + ->toBe(1) + ->and($data->simple->string) + ->toBe('A') + ->and($data->dataCollection->toCollection()->pluck('string')->toArray()) + ->toBe(['B', 'C']) + ->and($data->fakeModel->string) + ->toBe('lazy') + ; +}); + +it('can fetch non-lazy union data', function () { + $data = UnionData::from('A'); + + expect($data->id) + ->toBe(1) + ->and($data->simple->string) + ->toBe('A') + ->and($data->dataCollection->toCollection()->pluck('string')->toArray()) + ->toBe(['B', 'C']) + ->and($data->fakeModel->string) + ->toBe('non-lazy') + ; +}); diff --git a/tests/Fakes/UnionData.php b/tests/Fakes/UnionData.php new file mode 100644 index 00000000..751742af --- /dev/null +++ b/tests/Fakes/UnionData.php @@ -0,0 +1,45 @@ + SimpleData::from('A')), + dataCollection: Lazy::create(fn () => SimpleData::collection(['B', 'C'])), + fakeModel: Lazy::create(fn () => FakeModel::factory()->create([ + 'string' => 'lazy', + ])), + ); + } + + public static function fromString(string $name): self + { + return new self( + id: 1, + simple: SimpleData::from($name), + dataCollection: SimpleData::collection(['B', 'C']), + fakeModel: FakeModel::factory()->create([ + 'string' => 'non-lazy', + ]), + ); + } +} From 6a1e5f6483b2e7cfbb036c35123960f350674807 Mon Sep 17 00:00:00 2001 From: Dzianis Kotau Date: Fri, 7 Apr 2023 13:54:44 +0400 Subject: [PATCH 2/2] Tests style fix --- tests/DataTest.php | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/tests/DataTest.php b/tests/DataTest.php index d4b0d005..eb3e41d7 100644 --- a/tests/DataTest.php +++ b/tests/DataTest.php @@ -2283,27 +2283,17 @@ public function __construct( it('can fetch lazy union data', function () { $data = UnionData::from(1); - expect($data->id) - ->toBe(1) - ->and($data->simple->string) - ->toBe('A') - ->and($data->dataCollection->toCollection()->pluck('string')->toArray()) - ->toBe(['B', 'C']) - ->and($data->fakeModel->string) - ->toBe('lazy') - ; + expect($data->id)->toBe(1); + expect($data->simple->string)->toBe('A'); + expect($data->dataCollection->toCollection()->pluck('string')->toArray())->toBe(['B', 'C']); + expect($data->fakeModel->string)->toBe('lazy'); }); it('can fetch non-lazy union data', function () { $data = UnionData::from('A'); - expect($data->id) - ->toBe(1) - ->and($data->simple->string) - ->toBe('A') - ->and($data->dataCollection->toCollection()->pluck('string')->toArray()) - ->toBe(['B', 'C']) - ->and($data->fakeModel->string) - ->toBe('non-lazy') - ; + expect($data->id)->toBe(1); + expect($data->simple->string)->toBe('A'); + expect($data->dataCollection->toCollection()->pluck('string')->toArray())->toBe(['B', 'C']); + expect($data->fakeModel->string)->toBe('non-lazy'); });