Skip to content

Commit 759f9bc

Browse files
committed
test: collection (basic)
1 parent 9e19751 commit 759f9bc

File tree

2 files changed

+142
-1
lines changed

2 files changed

+142
-1
lines changed

tests/Feature/CollectionTest.php

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
<?php
2+
3+
namespace Test\Feature;
4+
5+
use DateTimeInterface;
6+
use Illuminate\Foundation\Testing\RefreshDatabase;
7+
use Illuminate\Http\Request;
8+
use Illuminate\Support\Collection;
9+
use Test\app\Http\Resources\CommentResource;
10+
use Test\app\Http\Resources\PostResource;
11+
use Test\app\Models\Comment;
12+
use Test\app\Models\Post;
13+
use Test\app\Models\User;
14+
use Test\Support\UseLocalApp;
15+
use Test\TestCase;
16+
17+
class CollectionTest extends TestCase
18+
{
19+
use RefreshDatabase, UseLocalApp;
20+
21+
public function setUp(): void
22+
{
23+
parent::setUp();
24+
$this->useLocalApp();
25+
}
26+
27+
public function testGetIndex()
28+
{
29+
$users = $this->dataSeed();
30+
31+
$expected = $this->getJsonResult($users);
32+
33+
$response = $this->get('user');
34+
$response->assertJson($expected);
35+
}
36+
37+
private function dataSeed()
38+
{
39+
$users = User::factory()->count(10)->create();
40+
41+
foreach ($users as $udx => $user) {
42+
$posts = Post::factory()->for($user)->count(3)->create();
43+
foreach ($posts as $post) {
44+
foreach ($users->except($udx)->random(5) as $u) {
45+
Comment::factory()->for($post)->for($u)->create();
46+
}
47+
}
48+
}
49+
50+
return $users;
51+
}
52+
53+
private function getJsonResult(Collection $users, ?array $attributes = null, ?array $relationships = null)
54+
{
55+
$request = new Request(array_merge(
56+
($attributes !== null ? ['fields' => ['user' => implode(',', $attributes)]] : []),
57+
($relationships !== null ? ['include' => implode(',', $relationships)] : []),
58+
));
59+
60+
$data = $users->map(fn(User $user) => [
61+
'id' => $user->id,
62+
'type' => 'user',
63+
'attributes' => array_filter(array_intersect_key([
64+
'name' => $user->name,
65+
'email' => $user->email,
66+
], array_fill_keys($attributes ?? ['name', 'email'], true))),
67+
'relationships' => [
68+
'posts' => array_filter([
69+
'data' => $user->posts->map(fn(Post $post) => ['type' => 'post', 'id' => $post->id])->all(),
70+
'links' => [
71+
'self' => "https://api.example.com/user/{$user->id}/relationships/posts",
72+
'related' => "https://api.example.com/user/{$user->id}/posts",
73+
]
74+
]),
75+
'comments' => array_filter([
76+
// when loaded only
77+
'data' => in_array('comments', $relationships ?? [])
78+
? $user->comments->map(fn(Comment $comment) => [
79+
'type' => 'comment',
80+
'id' => $comment->id
81+
])->all()
82+
: null,
83+
'links' => [
84+
'self' => "https://api.example.com/user/{$user->id}/relationships/comments",
85+
'related' => "https://api.example.com/user/{$user->id}/comments",
86+
]
87+
]),
88+
],
89+
'meta' => [
90+
'created_at' => $user->created_at->format(DateTimeInterface::ATOM),
91+
'updated_at' => $user->updated_at->format(DateTimeInterface::ATOM),
92+
],
93+
]);
94+
95+
$include = $users
96+
->map(fn(User $user) => collect()
97+
->merge(
98+
in_array('posts', $relationships ?? [])
99+
? $user->posts->mapInto(PostResource::class)->map->toArray($request)
100+
: []
101+
)
102+
->merge(
103+
in_array('comments', $relationships ?? [])
104+
? $user->comments->mapInto(CommentResource::class)->map->toArray($request)
105+
: []
106+
))
107+
->reduce(fn(Collection $all, Collection $value) => $all->merge($value), collect());
108+
109+
return collect(array_filter([
110+
'data' => $data,
111+
'included' => $include->all(),
112+
"meta" => [
113+
'current_page' => 1,
114+
'from' => 1,
115+
'last_page' => 1,
116+
'links' => [
117+
[
118+
'active' => false,
119+
'label' => "&laquo; Previous",
120+
'url' => null,
121+
],
122+
[
123+
'active' => true,
124+
'label' => '1',
125+
'url' => "http://localhost/user?page=1",
126+
],
127+
[
128+
'active' => false,
129+
'label' => "Next &raquo;",
130+
'url' => null,
131+
],
132+
],
133+
'path' => 'http://localhost/user',
134+
'per_page' => 15,
135+
'to' => 10,
136+
'total' => 10,
137+
],
138+
]))
139+
->toArray();
140+
}
141+
}

tests/app/Http/Controllers/AsApiController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ abstract protected function getResourceClass(): string;
1515
*
1616
* @return \Illuminate\Http\Response
1717
*/
18-
public function index($request)
18+
public function index(Request $request)
1919
{
2020
$modelClass = $this->getModelClass();
2121

0 commit comments

Comments
 (0)