From b1f43afd75c77a4fb5324eafe79e44f1778170cd Mon Sep 17 00:00:00 2001 From: mortazavi Date: Thu, 4 May 2023 16:53:44 +0330 Subject: [PATCH] ResourceCollectionTest completed; --- .../Contracts/BaseResourceCollection.php | 6 +- .../Http/Resources/JsonResourceTest.php | 4 +- .../Http/Resources/ResourceCollectionTest.php | 158 ++++++++++++++++++ .../Http/Resources/SampleCollection.php | 27 +++ ...WithCollectionDefaultExtractCollection.php | 25 +++ ...leWithCollectionDefaultExtractResource.php | 29 ++++ .../SampleWithDefaultExtractCollection.php | 25 +++ .../Resources/SampleWithHookCollection.php | 38 +++++ ...esource.php => SampleWithHookResource.php} | 2 +- 9 files changed, 308 insertions(+), 6 deletions(-) create mode 100644 tests/Feature/Http/Resources/ResourceCollectionTest.php create mode 100644 tests/Instances/Http/Resources/SampleCollection.php create mode 100644 tests/Instances/Http/Resources/SampleWithCollectionDefaultExtractCollection.php create mode 100644 tests/Instances/Http/Resources/SampleWithCollectionDefaultExtractResource.php create mode 100644 tests/Instances/Http/Resources/SampleWithDefaultExtractCollection.php create mode 100644 tests/Instances/Http/Resources/SampleWithHookCollection.php rename tests/Instances/Http/Resources/{SampleWithLoadedResource.php => SampleWithHookResource.php} (88%) diff --git a/src/Http/Resources/Contracts/BaseResourceCollection.php b/src/Http/Resources/Contracts/BaseResourceCollection.php index 0cceb07..6f0f2d4 100644 --- a/src/Http/Resources/Contracts/BaseResourceCollection.php +++ b/src/Http/Resources/Contracts/BaseResourceCollection.php @@ -55,7 +55,7 @@ abstract class BaseResourceCollection extends BaseJsonResource implements Counta */ public function __construct( $resource ) { parent::__construct( $resource ); - + $resource ??= []; $this->resource = $this->collectResource( $resource ); } @@ -90,12 +90,12 @@ public function toArray( $request ): array { ->mergeQueriedDataInto( $data ); } + $this->loaded( $data ); + if ( ! empty( $item->getExtra() ) ) { $data = array_merge( $data, [ 'extra' => $item->getExtra() ] ); } - $this->loaded( $data ); - return $data; } ); diff --git a/tests/Feature/Http/Resources/JsonResourceTest.php b/tests/Feature/Http/Resources/JsonResourceTest.php index 90a9cfa..a2e2691 100644 --- a/tests/Feature/Http/Resources/JsonResourceTest.php +++ b/tests/Feature/Http/Resources/JsonResourceTest.php @@ -4,7 +4,7 @@ use Hans\Tests\Valravn\Instances\Http\Resources\SampleResource; use Hans\Tests\Valravn\Instances\Http\Resources\SampleWithDefaultExtractResource; - use Hans\Tests\Valravn\Instances\Http\Resources\SampleWithLoadedResource; + use Hans\Tests\Valravn\Instances\Http\Resources\SampleWithHookResource; use Hans\Tests\Valravn\Instances\Http\Resources\SampleWithTypeOverrideResource; use Hans\Tests\Valravn\TestCase; use Hans\Valravn\Models\BaseModel; @@ -232,7 +232,7 @@ public function makeAsTypeOverride(): void { * @return void */ public function loaded(): void { - $resource = SampleWithLoadedResource::make( $this->model ); + $resource = SampleWithHookResource::make( $this->model ); self::assertEquals( [ 'data' => [ diff --git a/tests/Feature/Http/Resources/ResourceCollectionTest.php b/tests/Feature/Http/Resources/ResourceCollectionTest.php new file mode 100644 index 0000000..53c8a20 --- /dev/null +++ b/tests/Feature/Http/Resources/ResourceCollectionTest.php @@ -0,0 +1,158 @@ +models = collect(); + $object = new class extends BaseModel { + protected $fillable = [ 'name' ]; + }; + foreach ( range( 1, 5 ) as $counter ) { + $this->models->push( + clone $object->forceFill( [ 'id' => rand( 1, 999 ), 'name' => fake()->name() ] ) + ); + } + } + + /** + * @test + * + * @return void + */ + public function make(): void { + $collection = SampleCollection::make( $this->models ); + self::assertEquals( + [ + 'data' => $this->models->map( + fn( $model ) => [ + 'type' => 'samples', + 'id' => $model->id, + ] + ) + ->toArray(), + 'type' => 'samples' + ], + $this->resourceToJson( $collection ) + ); + } + + /** + * @test + * + * @return void + */ + public function toArrayAsNull(): void { + $collection = SampleCollection::make( null ); + self::assertEquals( + [ + 'data' => [], + 'type' => 'samples' + ], + $this->resourceToJson( $collection ) + ); + } + + /** + * @test + * + * @return void + */ + public function toArrayAsNullModel(): void { + $resource = SampleCollection::make( collect( [ new class extends BaseModel { } ] ) ); + self::assertEquals( + [ + 'data' => [ + [ + 'type' => 'samples', + 'id' => null, + ] + ], + 'type' => 'samples' + ], + $this->resourceToJson( $resource ) + ); + } + + /** + * @test + * + * @return void + */ + public function makeAsDefaultExtract(): void { + $resource = SampleWithDefaultExtractCollection::make( $this->models ); + self::assertEquals( + [ + 'data' => $this->models->map( + fn( $model ) => [ + 'type' => 'samples', + ...$model->toArray() + ] + ) + ->toArray(), + 'type' => 'samples' + ], + $this->resourceToJson( $resource ) + ); + } + /** + * @test + * + * @return void + */ + public function makeAsDefaultExtractInCollection(): void { + $resource = SampleWithCollectionDefaultExtractCollection::make( $this->models ); + self::assertEquals( + [ + 'data' => $this->models->map( + fn( $model ) => [ + 'type' => 'samples', + 'id' => $model->id, + 'name' => $model->name, + 'extract' => 'not default on resource' + ] + ) + ->toArray(), + 'type' => 'samples' + ], + $this->resourceToJson( $resource ) + ); + } + + /** + * @test + * + * @return void + */ + public function allLoaded(): void { + $resource = SampleWithHookCollection::make( $this->models ); + self::assertEquals( + [ + 'data' => $this->models->map( + fn( $model ) => [ + 'type' => 'samples', + 'id' => $model->id, + ] + ) + ->toArray(), + 'type' => 'samples', + 'all-loaded' => 'will you still love me when i no longer young and beautiful?' + ], + $this->resourceToJson( $resource ) + ); + } + + + } \ No newline at end of file diff --git a/tests/Instances/Http/Resources/SampleCollection.php b/tests/Instances/Http/Resources/SampleCollection.php new file mode 100644 index 0000000..1aacad2 --- /dev/null +++ b/tests/Instances/Http/Resources/SampleCollection.php @@ -0,0 +1,27 @@ + $model->id, + ]; + } + + /** + * @return string + */ + public function type(): string { + return 'samples'; + } + } \ No newline at end of file diff --git a/tests/Instances/Http/Resources/SampleWithCollectionDefaultExtractCollection.php b/tests/Instances/Http/Resources/SampleWithCollectionDefaultExtractCollection.php new file mode 100644 index 0000000..65f203b --- /dev/null +++ b/tests/Instances/Http/Resources/SampleWithCollectionDefaultExtractCollection.php @@ -0,0 +1,25 @@ + $model->id, + 'name' => $model->name, + 'extract' => 'not default on resource' + ]; + } + + /** + * @return string + */ + public function type(): string { + return 'samples'; + } + } \ No newline at end of file diff --git a/tests/Instances/Http/Resources/SampleWithDefaultExtractCollection.php b/tests/Instances/Http/Resources/SampleWithDefaultExtractCollection.php new file mode 100644 index 0000000..a54874d --- /dev/null +++ b/tests/Instances/Http/Resources/SampleWithDefaultExtractCollection.php @@ -0,0 +1,25 @@ + $model->id, + ]; + } + + /** + * @return string + */ + public function type(): string { + return 'samples'; + } + + /** + * @return void + */ + protected function allLoaded(): void { + $this->addAdditional( [ + 'all-loaded' => 'will you still love me when i no longer young and beautiful?' + ] ); + } + + + } \ No newline at end of file diff --git a/tests/Instances/Http/Resources/SampleWithLoadedResource.php b/tests/Instances/Http/Resources/SampleWithHookResource.php similarity index 88% rename from tests/Instances/Http/Resources/SampleWithLoadedResource.php rename to tests/Instances/Http/Resources/SampleWithHookResource.php index 2197124..c94a1b5 100644 --- a/tests/Instances/Http/Resources/SampleWithLoadedResource.php +++ b/tests/Instances/Http/Resources/SampleWithHookResource.php @@ -5,7 +5,7 @@ use Hans\Valravn\Http\Resources\Contracts\BaseJsonResource; use Illuminate\Database\Eloquent\Model; - class SampleWithLoadedResource extends BaseJsonResource { + class SampleWithHookResource extends BaseJsonResource { public function extract( Model $model ): ?array { return [