Skip to content

Commit 9a0e008

Browse files
committed
add test
1 parent ab2564e commit 9a0e008

File tree

8 files changed

+30
-4
lines changed

8 files changed

+30
-4
lines changed

src/Laravel/ApiPlatformProvider.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
use ApiPlatform\Laravel\Controller\EntrypointController;
8080
use ApiPlatform\Laravel\Eloquent\Extension\FilterQueryExtension;
8181
use ApiPlatform\Laravel\Eloquent\Extension\QueryExtensionInterface;
82+
use ApiPlatform\Laravel\Eloquent\Filter\BooleanFilter;
8283
use ApiPlatform\Laravel\Eloquent\Filter\DateFilter;
8384
use ApiPlatform\Laravel\Eloquent\Filter\EqualsFilter;
8485
use ApiPlatform\Laravel\Eloquent\Filter\FilterInterface as EloquentFilterInterface;
@@ -419,7 +420,7 @@ public function register(): void
419420

420421
$this->app->bind(OperationMetadataFactoryInterface::class, OperationMetadataFactory::class);
421422

422-
$this->app->tag([EqualsFilter::class, PartialSearchFilter::class, DateFilter::class, OrderFilter::class, RangeFilter::class], EloquentFilterInterface::class);
423+
$this->app->tag([BooleanFilter::class, EqualsFilter::class, PartialSearchFilter::class, DateFilter::class, OrderFilter::class, RangeFilter::class], EloquentFilterInterface::class);
423424

424425
$this->app->bind(FilterQueryExtension::class, function (Application $app) {
425426
$tagged = iterator_to_array($app->tagged(EloquentFilterInterface::class));

src/Laravel/Eloquent/Extension/FilterQueryExtension.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public function apply(Builder $builder, array $uriVariables, Operation $operatio
4040
$context['operation'] = $operation;
4141

4242
foreach ($operation->getParameters() ?? [] as $parameter) {
43-
if (!($values = $parameter->getValue()) || $values instanceof ParameterNotFound) {
43+
if (null === ($values = $parameter->getValue()) || $values instanceof ParameterNotFound) {
4444
continue;
4545
}
4646

src/Laravel/Eloquent/Filter/BooleanFilter.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313

1414
namespace ApiPlatform\Laravel\Eloquent\Filter;
1515

16+
use ApiPlatform\Metadata\JsonSchemaFilterInterface;
1617
use ApiPlatform\Metadata\Parameter;
1718
use Illuminate\Database\Eloquent\Builder;
1819
use Illuminate\Database\Eloquent\Model;
1920

20-
final class BooleanFilter implements FilterInterface
21+
final class BooleanFilter implements FilterInterface, JsonSchemaFilterInterface
2122
{
2223
use QueryPropertyTrait;
2324

@@ -40,4 +41,9 @@ public function apply(Builder $builder, mixed $values, Parameter $parameter, arr
4041

4142
return $builder->{$context['whereClause'] ?? 'where'}($this->getQueryProperty($parameter), $values);
4243
}
44+
45+
public function getSchema(Parameter $parameter): array
46+
{
47+
return ['type' => 'boolean'];
48+
}
4349
}

src/Laravel/Metadata/ParameterValidationResourceMetadataCollectionFactory.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ private function addSchemaValidation(Parameter $parameter): Parameter
144144
$assertions[] = 'array';
145145
}
146146

147+
if (isset($schema['type']) && 'boolean' === $schema['type']) {
148+
$assertions[] = 'boolean';
149+
}
150+
147151
if (!$assertions) {
148152
return $parameter;
149153
}

src/Laravel/Tests/EloquentTest.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,4 +406,15 @@ public function testWithAccessor(): void
406406
$res = $this->get('/api/with_accessors/1', ['Accept' => ['application/ld+json']]);
407407
$this->assertArraySubset(['name' => 'test'], $res->json());
408408
}
409+
410+
public function testBooleanFilter(): void
411+
{
412+
BookFactory::new()->has(AuthorFactory::new())->count(10)->create();
413+
$res = $this->get('/api/books?published=notabool', ['Accept' => ['application/ld+json']]);
414+
$this->assertEquals($res->getStatusCode(), 422);
415+
416+
$res = $this->get('/api/books?published=0', ['Accept' => ['application/ld+json']]);
417+
$this->assertEquals($res->getStatusCode(), 200);
418+
$this->assertEquals($res->json()['totalItems'], 0);
419+
}
409420
}

src/Laravel/workbench/app/Models/Book.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace Workbench\App\Models;
1515

16+
use ApiPlatform\Laravel\Eloquent\Filter\BooleanFilter;
1617
use ApiPlatform\Laravel\Eloquent\Filter\DateFilter;
1718
use ApiPlatform\Laravel\Eloquent\Filter\EqualsFilter;
1819
use ApiPlatform\Laravel\Eloquent\Filter\OrderFilter;
@@ -69,12 +70,13 @@
6970
property: 'name'
7071
)]
7172
#[QueryParameter(key: 'properties', filter: PropertyFilter::class)]
73+
#[QueryParameter(key: 'published', filter: BooleanFilter::class)]
7274
class Book extends Model
7375
{
7476
use HasFactory;
7577
use HasUlids;
7678

77-
protected $visible = ['name', 'author', 'isbn', 'publication_date'];
79+
protected $visible = ['name', 'author', 'isbn', 'publication_date', 'published'];
7880
protected $fillable = ['name'];
7981

8082
public function author(): BelongsTo

src/Laravel/workbench/database/factories/BookFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public function definition(): array
3838
'isbn' => fake()->isbn13(),
3939
'publication_date' => fake()->optional()->date(),
4040
'internal_note' => fake()->text(),
41+
'published' => fake()->boolean(100),
4142
];
4243
}
4344
}

src/Laravel/workbench/database/migrations/2023_07_15_231244_create_book_table.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public function up(): void
3333
$table->string('isbn');
3434
$table->date('publication_date')->nullable();
3535
$table->text('internal_note')->nullable();
36+
$table->boolean('published')->nullable();
3637
$table->integer('author_id')->unsigned();
3738
$table->foreign('author_id')->references('id')->on('authors');
3839
$table->timestamps();

0 commit comments

Comments
 (0)