From 5fe8558993fbaf0485e1ea2195becec6ab6f0a29 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 7 Jan 2021 11:16:37 +1000 Subject: [PATCH] Add some filters tests --- tests/feature/FieldFiltersTest.php | 97 ---------------------- tests/feature/FiltersTest.php | 126 +++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 97 deletions(-) delete mode 100644 tests/feature/FieldFiltersTest.php create mode 100644 tests/feature/FiltersTest.php diff --git a/tests/feature/FieldFiltersTest.php b/tests/feature/FieldFiltersTest.php deleted file mode 100644 index 358dc82..0000000 --- a/tests/feature/FieldFiltersTest.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Tobyz\Tests\JsonApiServer\feature; - -use Psr\Http\Message\ServerRequestInterface; -use Tobyz\JsonApiServer\JsonApi; -use Tobyz\JsonApiServer\Context; -use Tobyz\JsonApiServer\Schema\Type; -use Tobyz\Tests\JsonApiServer\AbstractTestCase; -use Tobyz\Tests\JsonApiServer\MockAdapter; - -class FieldFiltersTest extends AbstractTestCase -{ - /** - * @var JsonApi - */ - private $api; - - /** - * @var MockAdapter - */ - private $adapter; - - public function setUp(): void - { - $this->api = new JsonApi('http://example.com'); - $this->adapter = new MockAdapter(); - } - - public function test_resources_can_be_filtered_by_id() - { - $this->markTestIncomplete(); - } - - public function test_attributes_are_not_filterable_by_default() - { - $this->markTestIncomplete(); - } - - public function test_attributes_can_be_explicitly_not_filterable() - { - $this->markTestIncomplete(); - } - - public function test_attributes_can_be_filterable_by_their_value() - { - $this->markTestIncomplete(); - } - - public function test_attributes_can_be_filterable_with_custom_logic() - { - $this->markTestIncomplete(); - } - - public function test_attributes_filterable_callback_receives_correct_parameters() - { - $this->markTestIncomplete(); - } - - // to_one, to_many... - - public function test_types_can_have_custom_filters() - { - $called = false; - - $this->api->resource('users', $this->adapter, function (Type $type) use (&$called) { - $type->filter('name', function (...$args) use (&$called) { - $this->assertSame($this->adapter->query, $args[0]); - $this->assertEquals('value', $args[1]); - $this->assertInstanceOf(Context::class, $args[2]); - - $called = true; - }); - }); - - $this->api->handle( - $this->buildRequest('GET', '/users') - ->withQueryParams(['filter' => ['name' => 'value']]) - ); - - $this->assertTrue($called); - } - - public function test_types_can_have_a_default_filter() - { - $this->markTestIncomplete(); - } -} diff --git a/tests/feature/FiltersTest.php b/tests/feature/FiltersTest.php new file mode 100644 index 0000000..1a38fd3 --- /dev/null +++ b/tests/feature/FiltersTest.php @@ -0,0 +1,126 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Tobyz\Tests\JsonApiServer\feature; + +use Tobyz\JsonApiServer\Exception\BadRequestException; +use Tobyz\JsonApiServer\JsonApi; +use Tobyz\JsonApiServer\Context; +use Tobyz\JsonApiServer\Schema\Type; +use Tobyz\Tests\JsonApiServer\AbstractTestCase; +use Tobyz\Tests\JsonApiServer\MockAdapter; + +class FiltersTest extends AbstractTestCase +{ + /** + * @var JsonApi + */ + private $api; + + /** + * @var MockAdapter + */ + private $adapter; + + public function setUp(): void + { + $this->api = new JsonApi('/'); + + $models = []; + for ($i = 1; $i <= 100; $i++) { + $models[] = (object) ['type' => 'users', 'id' => $i]; + } + + $this->adapter = new MockAdapter($models, 'users'); + } + + public function test_resources_can_be_filtered_by_id() + { + $this->api->resource('users', $this->adapter); + + $this->api->handle( + $this->buildRequest('GET', '/users') + ->withQueryParams(['filter' => ['id' => '1,2']]) + ); + + $this->assertContains(['ids', ['1', '2']], $this->adapter->query->filter ?? null); + } + + public function test_attributes_are_not_filterable_by_default() + { + $this->api->resource('users', $this->adapter, function (Type $type) { + $type->attribute('test'); + }); + + $this->expectException(BadRequestException::class); + + $this->api->handle( + $this->buildRequest('GET', '/users') + ->withQueryParams(['filter' => ['test' => 'value']]) + ); + } + + public function test_attributes_can_be_explicitly_filterable() + { + $this->api->resource('users', $this->adapter, function (Type $type) use (&$attribute) { + $attribute = $type->attribute('test')->filterable(); + }); + + $this->api->handle( + $this->buildRequest('GET', '/users') + ->withQueryParams(['filter' => ['test' => 'value']]) + ); + + $this->assertContains([$attribute, '=', 'value'], $this->adapter->query->filter ?? null); + } + + // public function test_attributes_can_be_conditionally_filterable() + // { + // $this->api->resource('users', $this->adapter, function (Type $type) use (&$attribute) { + // $attribute = $type->attribute('test')->filterable(); + // }); + // + // $this->api->handle( + // $this->buildRequest('GET', '/users') + // ->withQueryParams(['filter' => ['test' => 'value']]) + // ); + // + // $this->assertContains([$attribute, '=', 'value'], $this->adapter->query->filter ?? null); + // } + + public function test_attributes_can_be_filterable_by_their_value() + { + $this->markTestIncomplete(); + } + + // to_one, to_many... + + public function test_types_can_have_custom_filters() + { + $called = false; + + $this->api->resource('users', $this->adapter, function (Type $type) use (&$called) { + $type->filter('name', function ($query, $value, Context $context) use (&$called) { + $this->assertSame($this->adapter->query, $query); + $this->assertEquals('value', $value); + + $called = true; + }); + }); + + $this->api->handle( + $this->buildRequest('GET', '/users') + ->withQueryParams(['filter' => ['name' => 'value']]) + ); + + $this->assertTrue($called); + } +}