Skip to content

Commit 7405e07

Browse files
committed
Validate implementation-specific query parameters according to specification
1 parent d91bc79 commit 7405e07

File tree

2 files changed

+32
-8
lines changed

2 files changed

+32
-8
lines changed

src/JsonApi.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ public function handle(Request $request): Response
115115
{
116116
// $this->validateRequest($request);
117117

118+
$this->validateQueryParameters($request);
119+
118120
$context = new Context($this, $request);
119121

120122
foreach ($this->extensions as $extension) {
@@ -151,6 +153,18 @@ public function handle(Request $request): Response
151153
throw new BadRequestException();
152154
}
153155

156+
private function validateQueryParameters(Request $request): void
157+
{
158+
foreach ($request->getQueryParams() as $key => $value) {
159+
if (
160+
! preg_match('/[^a-z]/', $key)
161+
&& ! in_array($key, ['include', 'fields', 'filter', 'page', 'sort'])
162+
) {
163+
throw (new BadRequestException('Invalid query parameter: '.$key))->setSourceParameter($key);
164+
}
165+
}
166+
}
167+
154168
private function validateRequest(Request $request): void
155169
{
156170
// TODO

tests/specification/QueryParametersTest.php

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Tobyz\Tests\JsonApiServer\specification;
1313

14+
use Tobyz\JsonApiServer\Exception\BadRequestException;
1415
use Tobyz\JsonApiServer\JsonApi;
1516
use Tobyz\Tests\JsonApiServer\AbstractTestCase;
1617
use Tobyz\Tests\JsonApiServer\MockAdapter;
@@ -25,20 +26,29 @@ class QueryParametersTest extends AbstractTestCase
2526
*/
2627
private $api;
2728

28-
/**
29-
* @var MockAdapter
30-
*/
31-
private $adapter;
32-
3329
public function setUp(): void
3430
{
3531
$this->api = new JsonApi('http://example.com');
36-
37-
$this->adapter = new MockAdapter();
32+
$this->api->resourceType('users', new MockAdapter());
3833
}
3934

4035
public function test_bad_request_error_if_unknown_query_parameters()
4136
{
42-
$this->markTestIncomplete();
37+
$request = $this->buildRequest('GET', '/users/1')
38+
->withQueryParams(['unknown' => 'value']);
39+
40+
$this->expectException(BadRequestException::class);
41+
42+
$this->api->handle($request);
43+
}
44+
45+
public function test_supports_custom_query_parameters()
46+
{
47+
$request = $this->buildRequest('GET', '/users/1')
48+
->withQueryParams(['camelCase' => 'value']);
49+
50+
$response = $this->api->handle($request);
51+
52+
$this->assertEquals(200, $response->getStatusCode());
4353
}
4454
}

0 commit comments

Comments
 (0)