Skip to content

Commit 4b1b057

Browse files
committed
test: unit json-api-resource
1 parent c49b781 commit 4b1b057

File tree

2 files changed

+189
-24
lines changed

2 files changed

+189
-24
lines changed

src/JsonApiResource.php

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
namespace Ark4ne\JsonApi\Resource;
44

5-
use Illuminate\Http\JsonResponse;
6-
use Illuminate\Http\Request;
5+
use Ark4ne\JsonApi\Resource\Support\With;
76
use Illuminate\Http\Resources\Json\JsonResource;
87

98
abstract class JsonApiResource extends JsonResource implements Resourceable
@@ -15,11 +14,6 @@ abstract class JsonApiResource extends JsonResource implements Resourceable
1514
Concerns\Links,
1615
Concerns\Meta;
1716

18-
/**
19-
* @param \Illuminate\Http\Request $request
20-
*
21-
* @return array
22-
*/
2317
public function toArray($request, bool $minimal = false): array
2418
{
2519
$data = [
@@ -44,15 +38,10 @@ public function with($request)
4438
$with = collect($this->with);
4539

4640
if ($meta = $this->toMeta($request)) {
47-
$with['meta'] = collect($with['meta'])->merge($meta);
41+
$with = With::merge($with, ['meta' => $meta]);
4842
}
4943

50-
return collect($this->with)
51-
->map(static fn($value) => is_iterable($value)
52-
? collect($value)->unique()->all()
53-
: $value)
54-
->filter()
55-
->toArray();
44+
return With::wash($with);
5645
}
5746

5847
/**
@@ -70,14 +59,4 @@ static function (JsonApiCollection $collection): void {
7059
}
7160
});
7261
}
73-
74-
/**
75-
* @param Request $request
76-
*/
77-
public function toResponse($request): JsonResponse
78-
{
79-
return parent
80-
::toResponse($request)
81-
->header('Content-type', 'application/vnd.api+json');
82-
}
8362
}

tests/Unit/JsonApiResourceTest.php

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
<?php
2+
3+
namespace Test\Unit;
4+
5+
use Ark4ne\JsonApi\Resource\JsonApiCollection;
6+
use Ark4ne\JsonApi\Resource\JsonApiResource;
7+
use Illuminate\Http\Request;
8+
use Test\Support\Stub;
9+
use Test\TestCase;
10+
11+
class JsonApiResourceTest extends TestCase
12+
{
13+
public function testBasic()
14+
{
15+
$model = Stub::model(['id' => 1]);
16+
$resource = new class($model) extends JsonApiResource {
17+
public function toType(Request $request): string
18+
{
19+
return 'my-model';
20+
}
21+
};
22+
23+
$request = new Request();
24+
25+
$data = [
26+
'type' => 'my-model',
27+
'id' => '1',
28+
'attributes' => [
29+
'id' => '1',
30+
]
31+
];
32+
$this->assertEquals($data, $resource->toArray($request));
33+
$this->assertEquals([], $resource->with($request));
34+
$this->assertEquals(
35+
['data' => $data],
36+
$resource->toResponse($request)->getData(true)
37+
);
38+
}
39+
40+
public function testBasicMinimal()
41+
{
42+
$model = Stub::model(['id' => 1]);
43+
$resource = new class($model) extends JsonApiResource {
44+
public function toArray($request, bool $minimal = false): array
45+
{
46+
return parent::toArray($request, true);
47+
}
48+
49+
public function toType(Request $request): string
50+
{
51+
return 'my-model';
52+
}
53+
};
54+
55+
$request = new Request();
56+
57+
$data = [
58+
'type' => 'my-model',
59+
'id' => '1',
60+
];
61+
$this->assertEquals($data, $resource->toArray($request));
62+
$this->assertEquals([], $resource->with($request));
63+
$this->assertEquals(
64+
['data' => $data],
65+
$resource->toResponse($request)->getData(true)
66+
);
67+
}
68+
69+
public function testWithMeta()
70+
{
71+
$model = Stub::model(['id' => 1]);
72+
$resource = new class($model) extends JsonApiResource {
73+
public function toType(Request $request): string
74+
{
75+
return 'my-model';
76+
}
77+
78+
protected function toResourceMeta(Request $request): ?iterable
79+
{
80+
return ['self' => $this->id];
81+
}
82+
83+
protected function toMeta(Request $request): ?iterable
84+
{
85+
return ['hash' => 'azerty'];
86+
}
87+
};
88+
89+
$request = new Request();
90+
91+
$data = [
92+
'type' => 'my-model',
93+
'id' => '1',
94+
'attributes' => [
95+
'id' => '1',
96+
],
97+
'meta' => [
98+
'self' => '1'
99+
]
100+
];
101+
$this->assertEquals($data, $resource->toArray($request));
102+
$this->assertEquals([
103+
'meta' => ['hash' => 'azerty']
104+
], $resource->with($request));
105+
$this->assertEquals([
106+
'data' => $data,
107+
'meta' => ['hash' => 'azerty']
108+
], $resource->toResponse($request)->getData(true)
109+
);
110+
}
111+
112+
public function testWithMetaMinimal()
113+
{
114+
$model = Stub::model(['id' => 1]);
115+
$resource = new class($model) extends JsonApiResource {
116+
public function toArray($request, bool $minimal = false): array
117+
{
118+
return parent::toArray($request, true);
119+
}
120+
121+
public function toType(Request $request): string
122+
{
123+
return 'my-model';
124+
}
125+
126+
protected function toResourceMeta(Request $request): ?iterable
127+
{
128+
return ['self' => $this->id];
129+
}
130+
131+
protected function toMeta(Request $request): ?iterable
132+
{
133+
return ['hash' => 'azerty'];
134+
}
135+
};
136+
137+
$request = new Request();
138+
139+
$data = [
140+
'type' => 'my-model',
141+
'id' => '1',
142+
];
143+
$this->assertEquals($data, $resource->toArray($request));
144+
$this->assertEquals([
145+
'meta' => ['hash' => 'azerty']
146+
], $resource->with($request));
147+
$this->assertEquals([
148+
'data' => $data,
149+
'meta' => ['hash' => 'azerty']
150+
], $resource->toResponse($request)->getData(true)
151+
);
152+
}
153+
154+
public function testToCollection()
155+
{
156+
$resource = new class(null) extends JsonApiResource {
157+
public function toType(Request $request): string
158+
{
159+
return 'my-model';
160+
}
161+
};
162+
163+
$collection = $resource::collection(collect(Stub::model(['id' => 1])));
164+
165+
$this->assertInstanceOf(JsonApiCollection::class, $collection);
166+
$this->assertEquals($resource::class, $collection->collects);
167+
$this->assertFalse(property_exists($collection, 'preserveKeys'));
168+
}
169+
170+
public function testToCollectionPreserveKeys()
171+
{
172+
$resource = new class(null) extends JsonApiResource {
173+
public $preserveKeys = true;
174+
public function toType(Request $request): string
175+
{
176+
return 'my-model';
177+
}
178+
};
179+
180+
$collection = $resource::collection(collect(Stub::model(['id' => 1])));
181+
182+
$this->assertInstanceOf(JsonApiCollection::class, $collection);
183+
$this->assertEquals($resource::class, $collection->collects);
184+
$this->assertTrue(property_exists($collection, 'preserveKeys'));
185+
}
186+
}

0 commit comments

Comments
 (0)