Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add tests for resource helpers
  • Loading branch information
TimKunze96 committed Mar 24, 2025
commit 7ef65634807983cfbf679515e98e1563a98caa3e
72 changes: 72 additions & 0 deletions tests/Database/DatabaseEloquentResourceCollectionTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<?php

namespace Illuminate\Tests\Database;

use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Resources\Json\JsonResource;
use PHPUnit\Framework\TestCase;

class DatabaseEloquentResourceCollectionTest extends TestCase
{
public function testItGuessesTheResourceName()
{
$collection = new TestCollection([
new TestModel(),
]);
$this->assertEquals('App\Http\Resources\TestModelResource', $collection->getGuessedResourceName(new TestModel()));
}

public function testItCanTransformToExplicitResource()
{
$collection = new Collection([
new TestModel(),
]);

$resource = $collection->toResourceCollection(TestResource::class);

$this->assertInstanceOf(JsonResource::class, $resource);
}

public function testItThrowsExceptionWhenResourceCannotBeFound()
{
$this->expectException(\Exception::class);
$this->expectExceptionMessage('Failed to find resource class for model [Illuminate\Tests\Database\TestModel].');

$collection = new Collection([
new TestModel(),
]);
$collection->toResourceCollection();
}

public function testItCanGuessResourceWhenNotProvided()
{
$collection = new Collection([
new TestModel(),
]);

class_alias(TestResource::class, 'App\Http\Resources\TestModelResource');

$resource = $collection->toResourceCollection();

$this->assertInstanceOf(JsonResource::class, $resource);
}
}

class TestModel extends Model
{
//
}

class TestResource extends JsonResource
{
//
}

class TestCollection extends Collection
{
public function getGuessedResourceName(object $model): string
{
return $this->guessResourceClassName($model);
}
}
63 changes: 63 additions & 0 deletions tests/Database/DatabaseEloquentResourceModelTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php

namespace Illuminate\Tests\Database;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Resources\Json\JsonResource;
use PHPUnit\Framework\TestCase;

class DatabaseEloquentResourceModelTest extends TestCase
{
public function testItCanTransformToExplicitResource()
{
$model = new TestResourceModel();
$resource = $model->toResource(TestJsonResource::class);

$this->assertInstanceOf(TestJsonResource::class, $resource);
$this->assertSame($model, $resource->resource);
}

public function testItThrowsExceptionWhenResourceCannotBeFound()
{
$this->expectException(\Exception::class);
$this->expectExceptionMessage('Failed to find resource class for model [Illuminate\Tests\Database\TestResourceModel].');

$model = new TestResourceModel();
$model->toResource();
}

public function testItCanGuessResourceWhenNotProvided()
{
$model = new TestResourceModelWithGuessableResource();

class_alias(TestJsonResource::class, 'App\Http\Resources\TestResourceModelWithGuessableResourceResource');

$resource = $model->toResource();

$this->assertInstanceOf(TestJsonResource::class, $resource);
$this->assertSame($model, $resource->resource);
}

public function testItCanGuessResourceName()
{
$model = new TestResourceModel();
$this->assertEquals('App\Http\Resources\TestResourceModelResource', $model->getGuessedResourceName());
}

}

class TestResourceModel extends Model
{
public function getGuessedResourceName(): string
{
return $this->guessResourceName();
}
}

class TestResourceModelWithGuessableResource extends Model
{
}

class TestJsonResource extends JsonResource
{
}
74 changes: 74 additions & 0 deletions tests/Pagination/PaginatorResourceTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

namespace Illuminate\Tests\Pagination;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Pagination\LengthAwarePaginator;
use PHPUnit\Framework\TestCase;

class PaginatorResourceTest extends TestCase
{
public function testItGuessesTheResourceName()
{
$paginator = new TestPaginator([
new TestModel(),
], 1, 1);

$this->assertEquals('App\Http\Resources\TestModelResource', $paginator->getGuessedResourceName(new TestModel()));
}

public function testItCanTransformToExplicitResource()
{
$paginator = new TestPaginator([
new TestModel(),
], 1, 1);

$resource = $paginator->toResourceCollection(TestResource::class);

$this->assertInstanceOf(JsonResource::class, $resource);
}

public function testItThrowsExceptionWhenResourceCannotBeFound()
{
$this->expectException(\Exception::class);
$this->expectExceptionMessage('Failed to find resource class for model [Illuminate\Tests\Pagination\TestModel].');

$paginator = new TestPaginator([
new TestModel(),
], 1, 1);

$paginator->toResourceCollection();
}

public function testItCanGuessResourceWhenNotProvided()
{
$paginator = new TestPaginator([
new TestModel(),
], 1, 1);

class_alias(TestResource::class, 'App\Http\Resources\TestModelResource');

$resource = $paginator->toResourceCollection();

$this->assertInstanceOf(JsonResource::class, $resource);
}
}

class TestModel extends Model
{
//
}

class TestResource extends JsonResource
{
//
}

class TestPaginator extends LengthAwarePaginator
{
public function getGuessedResourceName(object $model): string
{
return $this->guessResourceClassName($model);
}
}
Loading