From 35e6ea8cd3a346d4ab4ca051b75b7e7665478077 Mon Sep 17 00:00:00 2001 From: Amer Chaudhary Date: Tue, 19 Nov 2024 03:13:55 +0500 Subject: [PATCH 1/4] fix(laravel): allow boolean cast --- .../Factory/Property/EloquentPropertyMetadataFactory.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Laravel/Eloquent/Metadata/Factory/Property/EloquentPropertyMetadataFactory.php b/src/Laravel/Eloquent/Metadata/Factory/Property/EloquentPropertyMetadataFactory.php index c88c96585e2..6385a83568c 100644 --- a/src/Laravel/Eloquent/Metadata/Factory/Property/EloquentPropertyMetadataFactory.php +++ b/src/Laravel/Eloquent/Metadata/Factory/Property/EloquentPropertyMetadataFactory.php @@ -77,6 +77,7 @@ public function create(string $resourceClass, string $property, array $options = $type = match ($builtinType) { 'integer' => new Type(Type::BUILTIN_TYPE_INT, $p['nullable']), 'double', 'real' => new Type(Type::BUILTIN_TYPE_FLOAT, $p['nullable']), + 'boolean', 'bool' => new Type(Type::BUILTIN_TYPE_BOOL, $p['nullable']), 'datetime', 'date', 'timestamp' => new Type(Type::BUILTIN_TYPE_OBJECT, $p['nullable'], \DateTime::class), 'immutable_datetime', 'immutable_date' => new Type(Type::BUILTIN_TYPE_OBJECT, $p['nullable'], \DateTimeImmutable::class), 'collection', 'encrypted:collection' => new Type(Type::BUILTIN_TYPE_ITERABLE, $p['nullable'], Collection::class, true), From de607f12e48970ebaf6f4a56ea67992af50fd8fb Mon Sep 17 00:00:00 2001 From: Amer Chaudhary Date: Tue, 19 Nov 2024 23:18:08 +0500 Subject: [PATCH 2/4] feat(laravel): Adding tests for boolean cast --- src/Laravel/Tests/GraphQlTest.php | 34 +++++++++++++++++++ src/Laravel/workbench/app/Models/Book.php | 9 +++-- .../database/factories/BookFactory.php | 1 + .../2023_07_15_231244_create_book_table.php | 1 + 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/Laravel/Tests/GraphQlTest.php b/src/Laravel/Tests/GraphQlTest.php index 2c3889b84e1..ea55057d7b1 100644 --- a/src/Laravel/Tests/GraphQlTest.php +++ b/src/Laravel/Tests/GraphQlTest.php @@ -19,6 +19,7 @@ use Illuminate\Foundation\Testing\RefreshDatabase; use Orchestra\Testbench\Concerns\WithWorkbench; use Orchestra\Testbench\TestCase; +use Symfony\Component\Uid\Ulid; use Workbench\Database\Factories\AuthorFactory; use Workbench\Database\Factories\BookFactory; @@ -66,4 +67,37 @@ public function testGetBooksWithPaginationAndOrder(): void $this->assertCount(3, $data['data']['books']['edges']); $this->assertArrayNotHasKey('errors', $data); } + public function testCreateBook(): void + { + /** @var \Workbench\App\Models\Author $author */ + $author = AuthorFactory::new()->create(); + $response = $this->postJson('/api/graphql', [ + 'query' => ' + mutation createBook($book: createBookInput!){ + createBook(input: $book){ + book{ + name + isAvailable + } + } + } + ', + 'variables' => [ + 'book' => [ + 'name' => fake()->name(), + 'author' => 'api/authors/'.$author->id, + 'isbn' => fake()->isbn13(), + 'isAvailable' => rand(0,1) === 1, + ] + ] + ], ['accept' => ['application/json']]); + $response->assertStatus(200); + $data = $response->json(); + $this->assertArrayNotHasKey('errors', $data); + $this->assertArrayHasKey('data', $data); + $this->assertArrayHasKey('createBook', $data['data']); + $this->assertArrayHasKey('book', $data['data']['createBook']); + $this->assertArrayHasKey('isAvailable', $data['data']['createBook']['book']); + $this->assertIsBool($data['data']['createBook']['book']['isAvailable']); + } } diff --git a/src/Laravel/workbench/app/Models/Book.php b/src/Laravel/workbench/app/Models/Book.php index 33bcf093424..421d21bd7ff 100644 --- a/src/Laravel/workbench/app/Models/Book.php +++ b/src/Laravel/workbench/app/Models/Book.php @@ -23,6 +23,7 @@ use ApiPlatform\Metadata\Delete; use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\GetCollection; +use ApiPlatform\Metadata\GraphQl\Mutation; use ApiPlatform\Metadata\GraphQl\Query; use ApiPlatform\Metadata\GraphQl\QueryCollection; use ApiPlatform\Metadata\Patch; @@ -55,6 +56,7 @@ new QueryParameter(key: 'order[:property]', filter: OrderFilter::class), ], ), + new Mutation(name: 'create'), ] )] #[QueryParameter(key: 'isbn', filter: PartialSearchFilter::class, constraints: 'min:2')] @@ -74,8 +76,11 @@ class Book extends Model use HasFactory; use HasUlids; - protected $visible = ['name', 'author', 'isbn', 'publication_date']; - protected $fillable = ['name']; + protected $visible = ['name', 'author', 'isbn', 'publication_date', 'is_available']; + protected $fillable = ['name', 'is_available']; + protected $casts = [ + 'is_available' => 'boolean', + ]; public function author(): BelongsTo { diff --git a/src/Laravel/workbench/database/factories/BookFactory.php b/src/Laravel/workbench/database/factories/BookFactory.php index 65af45ad5ae..470bc538a2a 100644 --- a/src/Laravel/workbench/database/factories/BookFactory.php +++ b/src/Laravel/workbench/database/factories/BookFactory.php @@ -37,6 +37,7 @@ public function definition(): array 'author_id' => AuthorFactory::new(), 'isbn' => fake()->isbn13(), 'publication_date' => fake()->optional()->date(), + 'is_available' => rand(0,1) === 1, 'internal_note' => fake()->text(), ]; } diff --git a/src/Laravel/workbench/database/migrations/2023_07_15_231244_create_book_table.php b/src/Laravel/workbench/database/migrations/2023_07_15_231244_create_book_table.php index 398e576c3f0..0137554453c 100644 --- a/src/Laravel/workbench/database/migrations/2023_07_15_231244_create_book_table.php +++ b/src/Laravel/workbench/database/migrations/2023_07_15_231244_create_book_table.php @@ -32,6 +32,7 @@ public function up(): void $table->string('name'); $table->string('isbn'); $table->date('publication_date')->nullable(); + $table->boolean('is_available')->default(true); $table->text('internal_note')->nullable(); $table->integer('author_id')->unsigned(); $table->foreign('author_id')->references('id')->on('authors'); From 1244d2aa873e372cfd8770d6526583c948d20f84 Mon Sep 17 00:00:00 2001 From: Amer Chaudhary Date: Tue, 19 Nov 2024 23:23:13 +0500 Subject: [PATCH 3/4] feat(laravel): making cs fixer happy --- src/Laravel/Tests/GraphQlTest.php | 5 ++--- src/Laravel/workbench/database/factories/BookFactory.php | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Laravel/Tests/GraphQlTest.php b/src/Laravel/Tests/GraphQlTest.php index ea55057d7b1..922a2f99700 100644 --- a/src/Laravel/Tests/GraphQlTest.php +++ b/src/Laravel/Tests/GraphQlTest.php @@ -19,7 +19,6 @@ use Illuminate\Foundation\Testing\RefreshDatabase; use Orchestra\Testbench\Concerns\WithWorkbench; use Orchestra\Testbench\TestCase; -use Symfony\Component\Uid\Ulid; use Workbench\Database\Factories\AuthorFactory; use Workbench\Database\Factories\BookFactory; @@ -88,8 +87,8 @@ public function testCreateBook(): void 'author' => 'api/authors/'.$author->id, 'isbn' => fake()->isbn13(), 'isAvailable' => rand(0,1) === 1, - ] - ] + ], + ], ], ['accept' => ['application/json']]); $response->assertStatus(200); $data = $response->json(); diff --git a/src/Laravel/workbench/database/factories/BookFactory.php b/src/Laravel/workbench/database/factories/BookFactory.php index 470bc538a2a..d94b3f281c9 100644 --- a/src/Laravel/workbench/database/factories/BookFactory.php +++ b/src/Laravel/workbench/database/factories/BookFactory.php @@ -37,7 +37,7 @@ public function definition(): array 'author_id' => AuthorFactory::new(), 'isbn' => fake()->isbn13(), 'publication_date' => fake()->optional()->date(), - 'is_available' => rand(0,1) === 1, + 'is_available' => 1 === random_int(0, 1), 'internal_note' => fake()->text(), ]; } From 125bec0a84b240e6d02018a9ef06407525dd8de0 Mon Sep 17 00:00:00 2001 From: Amer Chaudhary Date: Tue, 19 Nov 2024 23:34:12 +0500 Subject: [PATCH 4/4] feat(laravel): php-cs-fixer changes --- src/Laravel/Tests/GraphQlTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Laravel/Tests/GraphQlTest.php b/src/Laravel/Tests/GraphQlTest.php index 922a2f99700..c8044ec12fd 100644 --- a/src/Laravel/Tests/GraphQlTest.php +++ b/src/Laravel/Tests/GraphQlTest.php @@ -66,6 +66,7 @@ public function testGetBooksWithPaginationAndOrder(): void $this->assertCount(3, $data['data']['books']['edges']); $this->assertArrayNotHasKey('errors', $data); } + public function testCreateBook(): void { /** @var \Workbench\App\Models\Author $author */ @@ -86,7 +87,7 @@ public function testCreateBook(): void 'name' => fake()->name(), 'author' => 'api/authors/'.$author->id, 'isbn' => fake()->isbn13(), - 'isAvailable' => rand(0,1) === 1, + 'isAvailable' => 1 === random_int(0, 1), ], ], ], ['accept' => ['application/json']]);