Skip to content

Commit 9f6ab5e

Browse files
committed
Add method base ResourceCollection tests
1 parent 96d9d8d commit 9f6ab5e

File tree

2 files changed

+136
-2
lines changed

2 files changed

+136
-2
lines changed

tests/Unit/JsonApiResourceCollectionRegisterTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use Brainstud\JsonApi\Tests\TestCase;
1010
use Illuminate\Support\Facades\Route;
1111

12-
class JsonApiCollectionResourceRegisterTest extends TestCase
12+
class JsonApiResourceCollectionRegisterTest extends TestCase
1313
{
1414
public function testBasicResourceCollectionResource()
1515
{
@@ -34,7 +34,7 @@ public function testCollectionResourceWithRelations()
3434
$author = Account::factory()->has(Post::factory())->create();
3535

3636
Route::get('test-route', fn () => AccountResourceCollection::make(Account::with('posts')->get()));
37-
$response = $this->getJson('test-route?include=posts');
37+
$response = $this->getJson('test-route');
3838

3939
$response->assertExactJson([
4040
'data' => [
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
<?php
2+
3+
namespace Brainstud\JsonApi\Tests\Unit;
4+
5+
use Brainstud\JsonApi\Tests\Models\Developer;
6+
use Brainstud\JsonApi\Tests\Models\PullRequest;
7+
use Brainstud\JsonApi\Tests\Models\Review;
8+
use Brainstud\JsonApi\Tests\Resources\DeveloperResourceCollection;
9+
use Brainstud\JsonApi\Tests\TestCase;
10+
use Illuminate\Support\Facades\Route;
11+
12+
class JsonApiResourceCollectionTest extends TestCase
13+
{
14+
public function testBasicResourceCollectionResource()
15+
{
16+
$developers = Developer::factory()->count(3)->create();
17+
18+
Route::get('test-route', fn () => DeveloperResourceCollection::make(Developer::all()));
19+
$response = $this->getJson('test-route');
20+
21+
$expcetedData = $developers->map(fn (Developer $developer) => $this->createJsonResource($developer));
22+
23+
$response->assertExactJson([
24+
'data' => $expcetedData->toArray(),
25+
]);
26+
}
27+
28+
public function testCollectionResourceWithRelations()
29+
{
30+
$others = Developer::factory(3)->create();
31+
$developer = Developer::factory()
32+
->has(PullRequest::factory(1))
33+
->create();
34+
35+
Route::get('test-route', fn () => DeveloperResourceCollection::make(Developer::with('pullRequests')->get()));
36+
$response = $this->getJson('test-route?inludes=pullRequests');
37+
38+
ray(json_decode($response->getContent(), true));
39+
40+
$response->assertExactJson([
41+
'data' => [
42+
...$this->createJsonResource($others),
43+
$this->createJsonResource($developer, ['pull_requests' => $developer->pullRequests]),
44+
],
45+
'included' => [
46+
$this->createJsonResource(
47+
$developer->pullRequests->first(),
48+
links: ['view' => ['href' => $developer->pullRequests->first()->getShowUrl()]]
49+
),
50+
],
51+
]);
52+
}
53+
54+
public function testCollectionResourceEnlargeResourceDepth1()
55+
{
56+
$someBloke = Developer::factory()->create();
57+
58+
$authorClaire = Developer::factory()
59+
->has(
60+
PullRequest::factory()
61+
->has(Review::factory()->for($someBloke, 'reviewer')->count(2))
62+
)
63+
->create();
64+
65+
$prsClaire = $authorClaire->pullRequests;
66+
$firstPrClaire = $authorClaire->pullRequests->first();
67+
68+
Review::factory()
69+
->for($authorClaire, 'reviewer')
70+
->for($firstPrClaire)
71+
->create();
72+
73+
$authorTom = Developer::factory()
74+
->has(
75+
PullRequest::factory()
76+
->has(Review::factory()->for($authorClaire, 'reviewer')->count(2))
77+
)
78+
->create();
79+
80+
$prsTom = $authorTom->pullRequests;
81+
$firstPrTom = $prsTom->first();
82+
83+
Review::factory()
84+
->for($authorTom, 'reviewer')
85+
->for($firstPrTom)
86+
->create();
87+
88+
$includes = [
89+
'pullRequests',
90+
'pullRequests.reviews',
91+
'pullRequests.reviews.reviewer',
92+
];
93+
94+
Route::get('test-route', fn () => DeveloperResourceCollection::make([[Developer::with($includes)->find(2), 3]]));
95+
$response = $this->getJson('test-route?include'.implode(',', $includes));
96+
97+
$response->assertExactJson([
98+
'data' => [
99+
$this->createJsonResource($authorClaire, ['pull_requests' => $prsClaire]),
100+
],
101+
'included' => [
102+
$this->createJsonResource(
103+
$firstPrClaire,
104+
['reviews' => $firstPrClaire->reviews],
105+
links: ['view' => ['href' => $firstPrClaire->getShowUrl()]]
106+
),
107+
$this->createJsonResource($firstPrClaire->reviews[0], ['reviewer' => $firstPrClaire->reviews[0]->reviewer]),
108+
$this->createJsonResource($firstPrClaire->reviews[1], ['reviewer' => $firstPrClaire->reviews[1]->reviewer]),
109+
$this->createJsonResource($firstPrClaire->reviews[2], ['reviewer' => $firstPrClaire->reviews[2]->reviewer]),
110+
$this->createJsonResource($firstPrClaire->reviews[0]->reviewer),
111+
$this->createJsonResource($firstPrClaire->reviews[2]->reviewer),
112+
],
113+
]);
114+
}
115+
116+
public function testAddMetaToResources(): void
117+
{
118+
$developers = Developer::factory(3)->create();
119+
120+
Route::get(
121+
'test-route',
122+
fn () => DeveloperResourceCollection::make(Developer::all())
123+
->addMetaToResources(
124+
fn (Developer $model) => ['hello' => $model->name]
125+
)
126+
);
127+
128+
$response = $this->getJson('test-route');
129+
130+
$developers->each(fn (Developer $developer) => (
131+
$response->assertJsonFragment(['meta' => ['hello' => $developer->name]])
132+
));
133+
}
134+
}

0 commit comments

Comments
 (0)