From 377b94ac97ebe72cc0ebb2bb9a70aebbd7223c14 Mon Sep 17 00:00:00 2001 From: "xingshenqiang@uniondrug.cn" Date: Tue, 23 Jul 2019 17:15:04 +0800 Subject: [PATCH 01/14] add multiple parameter type parsing --- src/Support/ResolveInfoFieldsAndArguments.php | 68 +++++++++++++++++-- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/src/Support/ResolveInfoFieldsAndArguments.php b/src/Support/ResolveInfoFieldsAndArguments.php index ee3101ae..3e144e28 100644 --- a/src/Support/ResolveInfoFieldsAndArguments.php +++ b/src/Support/ResolveInfoFieldsAndArguments.php @@ -4,8 +4,18 @@ namespace Rebing\GraphQL\Support; +use GraphQL\Language\AST\BooleanValueNode; +use GraphQL\Language\AST\EnumValueNode; use GraphQL\Language\AST\FieldNode; use GraphQL\Language\AST\ArgumentNode; +use GraphQL\Language\AST\FloatValueNode; +use GraphQL\Language\AST\IntValueNode; +use GraphQL\Language\AST\ListValueNode; +use GraphQL\Language\AST\NullValueNode; +use GraphQL\Language\AST\ObjectFieldNode; +use GraphQL\Language\AST\ObjectValueNode; +use GraphQL\Language\AST\StringValueNode; +use GraphQL\Language\AST\ValueNode; use GraphQL\Language\AST\VariableNode; use GraphQL\Type\Definition\ResolveInfo; use GraphQL\Language\AST\SelectionSetNode; @@ -114,7 +124,7 @@ private function foldSelectionSet(SelectionSetNode $selectionSet, int $descend): ]; foreach ($selectionNode->arguments ?? [] as $argumentNode) { - $fields[$name]['args'][$argumentNode->name->value] = $this->getValue($argumentNode); + $fields[$name]['args'][$argumentNode->name->value] = $this->getValue($argumentNode->value); } } elseif ($selectionNode instanceof FragmentSpreadNode) { $spreadName = $selectionNode->name->value; @@ -132,15 +142,65 @@ private function foldSelectionSet(SelectionSetNode $selectionSet, int $descend): return $fields; } - private function getValue(ArgumentNode $argumentNode) + /** + * @param ValueNode $value + * @return mixed + * @throws \Exception + */ + private function getValue(ValueNode $value) { - $value = $argumentNode->value; if ($value instanceof VariableNode) { $variableName = $value->name->value; return $this->info->variableValues[$variableName] ?? null; } + // Scalar Types + if ($value instanceof IntValueNode || $value instanceof FloatValueNode || $value instanceof StringValueNode || $value instanceof BooleanValueNode || $value instanceof EnumValueNode) { + return $value->value; + } + // null Type + if ($value instanceof NullValueNode) { + return null; + } + // object Type + if ($value instanceof ObjectValueNode) { + return $this->getInputObjectValue($value); + } + // list object Type + if ($value instanceof ListValueNode) { + return $this->getInputListObjectValue($value); + } - return $argumentNode->value->value; + throw new \Exception('Failed to resolve unknown ValueNode type'); + } + + /** + * @param ObjectValueNode $objectValueNode + * @return array + * @throws \Exception + */ + private function getInputObjectValue(ObjectValueNode $objectValueNode) + { + $value = []; + foreach ($objectValueNode->fields->getIterator() as $item) { + if ($item instanceof ObjectFieldNode) { + $value[$item->name->value] = $this->getValue($item->value); + } + } + return $value; + } + + /** + * @param ListValueNode $listValueNode + * @return array + * @throws \Exception + */ + private function getInputListObjectValue(ListValueNode $listValueNode) + { + $value = []; + foreach ($listValueNode->values as $valueNode) { + $value[] = $this->getValue($valueNode); + } + return $value; } } From 67ab0a53ea276195d90cca8d7f2780238b35627f Mon Sep 17 00:00:00 2001 From: sowork <807522127@qq.com> Date: Tue, 23 Jul 2019 09:20:31 +0000 Subject: [PATCH 02/14] Apply fixes from StyleCI --- src/Support/ResolveInfoFieldsAndArguments.php | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Support/ResolveInfoFieldsAndArguments.php b/src/Support/ResolveInfoFieldsAndArguments.php index 3e144e28..168233e4 100644 --- a/src/Support/ResolveInfoFieldsAndArguments.php +++ b/src/Support/ResolveInfoFieldsAndArguments.php @@ -4,20 +4,19 @@ namespace Rebing\GraphQL\Support; -use GraphQL\Language\AST\BooleanValueNode; -use GraphQL\Language\AST\EnumValueNode; use GraphQL\Language\AST\FieldNode; -use GraphQL\Language\AST\ArgumentNode; -use GraphQL\Language\AST\FloatValueNode; +use GraphQL\Language\AST\ValueNode; use GraphQL\Language\AST\IntValueNode; +use GraphQL\Language\AST\VariableNode; +use GraphQL\Language\AST\EnumValueNode; use GraphQL\Language\AST\ListValueNode; use GraphQL\Language\AST\NullValueNode; +use GraphQL\Language\AST\FloatValueNode; +use GraphQL\Type\Definition\ResolveInfo; use GraphQL\Language\AST\ObjectFieldNode; use GraphQL\Language\AST\ObjectValueNode; use GraphQL\Language\AST\StringValueNode; -use GraphQL\Language\AST\ValueNode; -use GraphQL\Language\AST\VariableNode; -use GraphQL\Type\Definition\ResolveInfo; +use GraphQL\Language\AST\BooleanValueNode; use GraphQL\Language\AST\SelectionSetNode; use GraphQL\Language\AST\FragmentSpreadNode; use GraphQL\Language\AST\InlineFragmentNode; @@ -160,7 +159,7 @@ private function getValue(ValueNode $value) } // null Type if ($value instanceof NullValueNode) { - return null; + return; } // object Type if ($value instanceof ObjectValueNode) { @@ -187,6 +186,7 @@ private function getInputObjectValue(ObjectValueNode $objectValueNode) $value[$item->name->value] = $this->getValue($item->value); } } + return $value; } @@ -201,6 +201,7 @@ private function getInputListObjectValue(ListValueNode $listValueNode) foreach ($listValueNode->values as $valueNode) { $value[] = $this->getValue($valueNode); } + return $value; } } From 3ad9592e4565920950c9b337be8fd52f4090b209 Mon Sep 17 00:00:00 2001 From: "xingshenqiang@uniondrug.cn" Date: Tue, 23 Jul 2019 20:56:56 +0800 Subject: [PATCH 03/14] phpstan fix error --- phpstan.neon.dist | 2 -- src/Support/ResolveInfoFieldsAndArguments.php | 10 ++++------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index c60ba3f2..b7700367 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -42,8 +42,6 @@ parameters: - '/Cannot call method set\(\) on Illuminate\\Config\\Repository\|null/' - '/Parameter #4 \$currentPage of class Illuminate\\Pagination\\LengthAwarePaginator constructor expects int\|null, float\|int given/' - '/Parameter #1 \$offset of method Illuminate\\Support\\Collection::slice\(\) expects int, float\|int given/' - # \Rebing\GraphQL\Support\ResolveInfoFieldsAndArguments::getValue - - '/Access to an undefined property GraphQL\\Language\\AST\\ValueNode::\$value/' # tests/Unit/GraphQLTest.php - '/Call to an undefined method GraphQL\\Type\\Definition\\Type::getFields\(\)/' - '/Call to an undefined method Mockery\\/' diff --git a/src/Support/ResolveInfoFieldsAndArguments.php b/src/Support/ResolveInfoFieldsAndArguments.php index 168233e4..ac16cddc 100644 --- a/src/Support/ResolveInfoFieldsAndArguments.php +++ b/src/Support/ResolveInfoFieldsAndArguments.php @@ -38,7 +38,6 @@ public function __construct(ResolveInfo $info) /** * Helper method that returns names of all fields with attributes selected in query for * $this->fieldName up to $depth levels. - * * Example: * query MyQuery{ * { @@ -51,7 +50,6 @@ public function __construct(ResolveInfo $info) * } * } * } - * * Given this ResolveInfo instance is a part of "root" field resolution, and $depth === 1, * method will return: * [ @@ -78,13 +76,12 @@ public function __construct(ResolveInfo $info) * ], * ], * ], - * * Warning: this method it is a naive implementation which does not take into account * conditional typed fragments. So use it with care for fields of interface and union types. - * * @param int $depth How many levels to include in output * @return array * @see \GraphQL\Type\Definition\ResolveInfo::getFieldSelection + * @throws \Exception */ public function getFieldsAndArgumentsSelection(int $depth = 0): array { @@ -102,10 +99,11 @@ public function getFieldsAndArgumentsSelection(int $depth = 0): array } /** - * @param SelectionSetNode $selectionSet - * @param int $descend + * @param SelectionSetNode $selectionSet + * @param int $descend * @return array * @see \GraphQL\Type\Definition\ResolveInfo::foldSelectionSet + * @throws \Exception */ private function foldSelectionSet(SelectionSetNode $selectionSet, int $descend): array { From b8ebf741b30c269bb9dd79ac7861ded9ed3c8618 Mon Sep 17 00:00:00 2001 From: "xingshenqiang@uniondrug.cn" Date: Wed, 24 Jul 2019 09:47:01 +0800 Subject: [PATCH 04/14] restore original format code --- src/Support/ResolveInfoFieldsAndArguments.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Support/ResolveInfoFieldsAndArguments.php b/src/Support/ResolveInfoFieldsAndArguments.php index ac16cddc..dd60819d 100644 --- a/src/Support/ResolveInfoFieldsAndArguments.php +++ b/src/Support/ResolveInfoFieldsAndArguments.php @@ -38,6 +38,7 @@ public function __construct(ResolveInfo $info) /** * Helper method that returns names of all fields with attributes selected in query for * $this->fieldName up to $depth levels. + * * Example: * query MyQuery{ * { @@ -50,6 +51,7 @@ public function __construct(ResolveInfo $info) * } * } * } + * * Given this ResolveInfo instance is a part of "root" field resolution, and $depth === 1, * method will return: * [ @@ -76,8 +78,10 @@ public function __construct(ResolveInfo $info) * ], * ], * ], + * * Warning: this method it is a naive implementation which does not take into account * conditional typed fragments. So use it with care for fields of interface and union types. + * * @param int $depth How many levels to include in output * @return array * @see \GraphQL\Type\Definition\ResolveInfo::getFieldSelection @@ -99,8 +103,8 @@ public function getFieldsAndArgumentsSelection(int $depth = 0): array } /** - * @param SelectionSetNode $selectionSet - * @param int $descend + * @param SelectionSetNode $selectionSet + * @param int $descend * @return array * @see \GraphQL\Type\Definition\ResolveInfo::foldSelectionSet * @throws \Exception From 90470734012649079e3d205d57f415e0ea097311 Mon Sep 17 00:00:00 2001 From: "xingshenqiang@uniondrug.cn" Date: Wed, 31 Jul 2019 14:06:21 +0800 Subject: [PATCH 05/14] Add unit tests that take arguments as objects or lists --- .../FilterInput.php | 30 ++++++ .../NestedRelationLoadingTest.php | 97 +++++++++++++++++++ .../NestedRelationLoadingTests/UserType.php | 16 +++ tests/Support/Models/Post.php | 7 ++ tests/Support/Models/Tag.php | 20 ++++ .../Support/database/factories/TagFactory.php | 14 +++ .../migrations/____taggables_table.php | 20 ++++ .../database/migrations/____tags_table.php | 19 ++++ 8 files changed, 223 insertions(+) create mode 100644 tests/Database/SelectFields/NestedRelationLoadingTests/FilterInput.php create mode 100644 tests/Support/Models/Tag.php create mode 100644 tests/Support/database/factories/TagFactory.php create mode 100644 tests/Support/database/migrations/____taggables_table.php create mode 100644 tests/Support/database/migrations/____tags_table.php diff --git a/tests/Database/SelectFields/NestedRelationLoadingTests/FilterInput.php b/tests/Database/SelectFields/NestedRelationLoadingTests/FilterInput.php new file mode 100644 index 00000000..59dd81e4 --- /dev/null +++ b/tests/Database/SelectFields/NestedRelationLoadingTests/FilterInput.php @@ -0,0 +1,30 @@ + 'Filter', + 'description' => 'filter object', + ]; + + public function fields(): array + { + return [ + 'title' => [ + 'type' => Type::string(), + ], + 'body' => [ + 'type' => Type::string(), + ], + 'keywords' => [ + 'type' => Type::listOf(Type::string()) + ] + ]; + } +} diff --git a/tests/Database/SelectFields/NestedRelationLoadingTests/NestedRelationLoadingTest.php b/tests/Database/SelectFields/NestedRelationLoadingTests/NestedRelationLoadingTest.php index bd7b9c1c..1f375c40 100644 --- a/tests/Database/SelectFields/NestedRelationLoadingTests/NestedRelationLoadingTest.php +++ b/tests/Database/SelectFields/NestedRelationLoadingTests/NestedRelationLoadingTest.php @@ -4,6 +4,7 @@ namespace Rebing\GraphQL\Tests\Database\SelectFields\NestedRelationLoadingTests; +use Rebing\GraphQL\Tests\Support\Models\Tag; use Rebing\GraphQL\Tests\TestCaseDatabase; use Rebing\GraphQL\Tests\Support\Models\Post; use Rebing\GraphQL\Tests\Support\Models\User; @@ -802,6 +803,101 @@ public function testQuerySelectAndWithAndNestedSubArgs(): void $this->assertEquals($expectedResult, $result); } + /** + * Fixed with https://github.com/rebing/graphql-laravel/pull/419 + */ + public function testQuerySelectAndWithAndScalarAndObjSubArgs(): void + { + /** @var User[] $users */ + $users = factory(User::class, 2) + ->create() + ->each(function (User $user): void { + $post = factory(Post::class) + ->create([ + 'title' => 'post1 title', + 'body' => 'post1 body', + 'user_id' => $user->id, + ]); + $post->tags()->save(factory(Tag::class) + ->create([ + 'name' => 'tag1', + ])); + $post->tags()->save(factory(Tag::class) + ->create([ + 'name' => 'tag2', + ])); + + $post = factory(Post::class) + ->create([ + 'title' => 'post2 title', + 'body' => 'post2 body', + 'user_id' => $user->id, + ]); + $post->tags()->save(factory(Tag::class) + ->create([ + 'name' => 'tag3', + ])); + $post->tags()->save(factory(Tag::class) + ->create([ + 'name' => 'tag4', + ])); + }); + + $graphql = <<<'GRAQPHQL' +{ + users(select: true, with: true) { + id + name + posts(filter: {title: "title", body: "body", keywords: ["tag3", "tag4"]}) { + body + id + title + } + } +} +GRAQPHQL; + + $this->sqlCounterReset(); + + $result = $this->graphql($graphql); + + $this->assertSqlQueries(<<<'SQL' +select "users"."id", "users"."name" from "users" order by "users"."id" asc; +select "posts"."body", "posts"."id", "posts"."title", "posts"."user_id" from "posts" where "posts"."user_id" in (?, ?) and "posts"."title" like ? and "posts"."title" like ? and exists (select * from "tags" inner join "taggables" on "tags"."id" = "taggables"."tag_id" where "posts"."id" = "taggables"."taggable_id" and "taggables"."taggable_type" = ? and "name" in (?, ?)) order by "posts"."id" asc; +SQL + ); + + $expectedResult = [ + 'data' => [ + 'users' => [ + [ + 'id' => (string) $users[0]->id, + 'name' => $users[0]->name, + 'posts' => [ + [ + 'body' => $users[0]->posts[1]->body, + 'id' => (string) $users[0]->posts[1]->id, + 'title' => $users[0]->posts[1]->title, + ], + ], + ], + [ + 'id' => (string) $users[1]->id, + 'name' => $users[1]->name, + 'posts' => [ + [ + 'body' => $users[1]->posts[1]->body, + 'id' => (string) $users[1]->posts[1]->id, + 'title' => $users[1]->posts[1]->title, + ], + ], + ], + ], + ], + ]; + $this->assertEquals($expectedResult, $result); + } + public function testRelationshipAlias(): void { $users = factory(User::class, 1) @@ -876,6 +972,7 @@ protected function getEnvironmentSetUp($app) CommentType::class, PostType::class, UserType::class, + FilterInput::class, ]); } } diff --git a/tests/Database/SelectFields/NestedRelationLoadingTests/UserType.php b/tests/Database/SelectFields/NestedRelationLoadingTests/UserType.php index ab6f7493..79275973 100644 --- a/tests/Database/SelectFields/NestedRelationLoadingTests/UserType.php +++ b/tests/Database/SelectFields/NestedRelationLoadingTests/UserType.php @@ -32,11 +32,27 @@ public function fields(): array 'flag' => [ Type::boolean(), ], + 'filter' => [ + 'type' => GraphQL::type('Filter') + ] ], 'query' => function (array $args, HasMany $query): HasMany { if (isset($args['flag'])) { $query->where('posts.flag', '=', $args['flag']); } + if (isset($args['filter'])) { + if (isset($args['filter']['title'])) { + $query->where('posts.title', 'like', "%{$args['filter']['title']}%"); + } + if (isset($args['filter']['body'])) { + $query->where('posts.title', 'like', "%{$args['filter']['title']}%"); + } + if (isset($args['filter']['keywords'])) { + $query->whereHas('tags', function($query) use ($args) { + $query->whereIn('name', $args['filter']['keywords']); + }); + } + } return $query; }, diff --git a/tests/Support/Models/Post.php b/tests/Support/Models/Post.php index 979476d6..684271e4 100644 --- a/tests/Support/Models/Post.php +++ b/tests/Support/Models/Post.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\MorphMany; +use Illuminate\Database\Eloquent\Relations\MorphToMany; /** * @property int $id @@ -19,6 +20,7 @@ * @property bool $is_published * @property-read \Illuminate\Database\Eloquent\Collection|Comment[] $comments * @property-read \Illuminate\Database\Eloquent\Collection|Like[] $likes + * @property-read \Illuminate\Database\Eloquent\Collection|Tag[] $tags */ class Post extends Model { @@ -41,6 +43,11 @@ public function likes(): MorphMany return $this->morphMany(Like::class, 'likable'); } + public function tags(): MorphToMany + { + return $this->morphToMany(Tag::class, 'taggable'); + } + public function getIsPublishedAttribute(): bool { $publishedAt = $this->published_at; diff --git a/tests/Support/Models/Tag.php b/tests/Support/Models/Tag.php new file mode 100644 index 00000000..56ed3ddb --- /dev/null +++ b/tests/Support/Models/Tag.php @@ -0,0 +1,20 @@ +belongsTo(Post::class); + } +} diff --git a/tests/Support/database/factories/TagFactory.php b/tests/Support/database/factories/TagFactory.php new file mode 100644 index 00000000..7a0ca6f6 --- /dev/null +++ b/tests/Support/database/factories/TagFactory.php @@ -0,0 +1,14 @@ +define(Tag::class, function (Faker $faker) { + return [ + 'name' => $faker->name, + ]; +}); diff --git a/tests/Support/database/migrations/____taggables_table.php b/tests/Support/database/migrations/____taggables_table.php new file mode 100644 index 00000000..cb184e7e --- /dev/null +++ b/tests/Support/database/migrations/____taggables_table.php @@ -0,0 +1,20 @@ +increments('tag_id'); + $table->string('taggable_id'); + $table->string('taggable_type'); + $table->timestamps(); + }); + } +} diff --git a/tests/Support/database/migrations/____tags_table.php b/tests/Support/database/migrations/____tags_table.php new file mode 100644 index 00000000..d5beadd6 --- /dev/null +++ b/tests/Support/database/migrations/____tags_table.php @@ -0,0 +1,19 @@ +increments('id'); + $table->string('name'); + $table->timestamps(); + }); + } +} From 07835f35e30d0f3f71410565cfeeb60799ab9513 Mon Sep 17 00:00:00 2001 From: sowork <807522127@qq.com> Date: Wed, 31 Jul 2019 06:13:01 +0000 Subject: [PATCH 06/14] Apply fixes from StyleCI --- .../SelectFields/NestedRelationLoadingTests/FilterInput.php | 5 +++-- .../NestedRelationLoadingTest.php | 4 ++-- .../SelectFields/NestedRelationLoadingTests/UserType.php | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/Database/SelectFields/NestedRelationLoadingTests/FilterInput.php b/tests/Database/SelectFields/NestedRelationLoadingTests/FilterInput.php index 59dd81e4..a1505848 100644 --- a/tests/Database/SelectFields/NestedRelationLoadingTests/FilterInput.php +++ b/tests/Database/SelectFields/NestedRelationLoadingTests/FilterInput.php @@ -1,4 +1,5 @@ Type::string(), ], 'keywords' => [ - 'type' => Type::listOf(Type::string()) - ] + 'type' => Type::listOf(Type::string()), + ], ]; } } diff --git a/tests/Database/SelectFields/NestedRelationLoadingTests/NestedRelationLoadingTest.php b/tests/Database/SelectFields/NestedRelationLoadingTests/NestedRelationLoadingTest.php index 1f375c40..75b672b9 100644 --- a/tests/Database/SelectFields/NestedRelationLoadingTests/NestedRelationLoadingTest.php +++ b/tests/Database/SelectFields/NestedRelationLoadingTests/NestedRelationLoadingTest.php @@ -4,8 +4,8 @@ namespace Rebing\GraphQL\Tests\Database\SelectFields\NestedRelationLoadingTests; -use Rebing\GraphQL\Tests\Support\Models\Tag; use Rebing\GraphQL\Tests\TestCaseDatabase; +use Rebing\GraphQL\Tests\Support\Models\Tag; use Rebing\GraphQL\Tests\Support\Models\Post; use Rebing\GraphQL\Tests\Support\Models\User; use Rebing\GraphQL\Tests\Support\Models\Comment; @@ -804,7 +804,7 @@ public function testQuerySelectAndWithAndNestedSubArgs(): void } /** - * Fixed with https://github.com/rebing/graphql-laravel/pull/419 + * Fixed with https://github.com/rebing/graphql-laravel/pull/419. */ public function testQuerySelectAndWithAndScalarAndObjSubArgs(): void { diff --git a/tests/Database/SelectFields/NestedRelationLoadingTests/UserType.php b/tests/Database/SelectFields/NestedRelationLoadingTests/UserType.php index 79275973..7cf04987 100644 --- a/tests/Database/SelectFields/NestedRelationLoadingTests/UserType.php +++ b/tests/Database/SelectFields/NestedRelationLoadingTests/UserType.php @@ -33,8 +33,8 @@ public function fields(): array Type::boolean(), ], 'filter' => [ - 'type' => GraphQL::type('Filter') - ] + 'type' => GraphQL::type('Filter'), + ], ], 'query' => function (array $args, HasMany $query): HasMany { if (isset($args['flag'])) { @@ -48,7 +48,7 @@ public function fields(): array $query->where('posts.title', 'like', "%{$args['filter']['title']}%"); } if (isset($args['filter']['keywords'])) { - $query->whereHas('tags', function($query) use ($args) { + $query->whereHas('tags', function ($query) use ($args) { $query->whereIn('name', $args['filter']['keywords']); }); } From 329b4af0033a5e88f872fe7edc473971d7c2f975 Mon Sep 17 00:00:00 2001 From: "xingshenqiang@uniondrug.cn" Date: Wed, 14 Aug 2019 15:19:06 +0800 Subject: [PATCH 07/14] update tests --- src/Support/ResolveInfoFieldsAndArguments.php | 46 ++++--- .../NestedRelationLoadingTest.php | 97 --------------- .../NestedRelationLoadingTests/UserType.php | 16 --- .../ValidateDiffNodeTests/EpisodeEnum.php | 21 ++++ .../FilterInput.php | 12 +- .../ValidateDiffNodeTests/PostType.php | 31 +++++ .../ValidateDiffNodeTests/UserType.php | 85 +++++++++++++ .../ValidateDiffNodeTests/UsersQuery.php | 86 +++++++++++++ .../ValidateDiffNodeTests.php | 116 ++++++++++++++++++ tests/Support/Models/Post.php | 7 -- tests/Support/Models/Tag.php | 20 --- .../Support/database/factories/TagFactory.php | 14 --- .../migrations/____taggables_table.php | 20 --- .../database/migrations/____tags_table.php | 19 --- 14 files changed, 375 insertions(+), 215 deletions(-) create mode 100644 tests/Database/SelectFields/ValidateDiffNodeTests/EpisodeEnum.php rename tests/Database/SelectFields/{NestedRelationLoadingTests => ValidateDiffNodeTests}/FilterInput.php (75%) create mode 100644 tests/Database/SelectFields/ValidateDiffNodeTests/PostType.php create mode 100644 tests/Database/SelectFields/ValidateDiffNodeTests/UserType.php create mode 100644 tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php create mode 100644 tests/Database/SelectFields/ValidateDiffNodeTests/ValidateDiffNodeTests.php delete mode 100644 tests/Support/Models/Tag.php delete mode 100644 tests/Support/database/factories/TagFactory.php delete mode 100644 tests/Support/database/migrations/____taggables_table.php delete mode 100644 tests/Support/database/migrations/____tags_table.php diff --git a/src/Support/ResolveInfoFieldsAndArguments.php b/src/Support/ResolveInfoFieldsAndArguments.php index dd60819d..de37057f 100644 --- a/src/Support/ResolveInfoFieldsAndArguments.php +++ b/src/Support/ResolveInfoFieldsAndArguments.php @@ -20,6 +20,7 @@ use GraphQL\Language\AST\SelectionSetNode; use GraphQL\Language\AST\FragmentSpreadNode; use GraphQL\Language\AST\InlineFragmentNode; +use phpDocumentor\Reflection\Types\Mixed_; /** * This adapts \GraphQL\Type\Definition\ResolveInfo::getFieldSelection @@ -85,7 +86,6 @@ public function __construct(ResolveInfo $info) * @param int $depth How many levels to include in output * @return array * @see \GraphQL\Type\Definition\ResolveInfo::getFieldSelection - * @throws \Exception */ public function getFieldsAndArgumentsSelection(int $depth = 0): array { @@ -107,7 +107,6 @@ public function getFieldsAndArgumentsSelection(int $depth = 0): array * @param int $descend * @return array * @see \GraphQL\Type\Definition\ResolveInfo::foldSelectionSet - * @throws \Exception */ private function foldSelectionSet(SelectionSetNode $selectionSet, int $descend): array { @@ -145,8 +144,7 @@ private function foldSelectionSet(SelectionSetNode $selectionSet, int $descend): /** * @param ValueNode $value - * @return mixed - * @throws \Exception + * @return mixed|null */ private function getValue(ValueNode $value) { @@ -155,32 +153,49 @@ private function getValue(ValueNode $value) return $this->info->variableValues[$variableName] ?? null; } - // Scalar Types - if ($value instanceof IntValueNode || $value instanceof FloatValueNode || $value instanceof StringValueNode || $value instanceof BooleanValueNode || $value instanceof EnumValueNode) { - return $value->value; + + if ($value instanceof IntValueNode) + { + return (int) $value->value; + } + + if ($value instanceof FloatValueNode) { + return (float) $value->value; + } + + if ($value instanceof StringValueNode) { + return (string) $value->value; + } + + if ($value instanceof BooleanValueNode) { + return (boolean) $value->value; + } + + if ($value instanceof EnumValueNode) + { + return (string) $value->value; } - // null Type + if ($value instanceof NullValueNode) { - return; + return null; } - // object Type + if ($value instanceof ObjectValueNode) { return $this->getInputObjectValue($value); } - // list object Type + if ($value instanceof ListValueNode) { return $this->getInputListObjectValue($value); } - throw new \Exception('Failed to resolve unknown ValueNode type'); + throw new \RuntimeException('Failed to resolve unknown ValueNode type'); } /** * @param ObjectValueNode $objectValueNode * @return array - * @throws \Exception */ - private function getInputObjectValue(ObjectValueNode $objectValueNode) + private function getInputObjectValue(ObjectValueNode $objectValueNode): array { $value = []; foreach ($objectValueNode->fields->getIterator() as $item) { @@ -195,9 +210,8 @@ private function getInputObjectValue(ObjectValueNode $objectValueNode) /** * @param ListValueNode $listValueNode * @return array - * @throws \Exception */ - private function getInputListObjectValue(ListValueNode $listValueNode) + private function getInputListObjectValue(ListValueNode $listValueNode): array { $value = []; foreach ($listValueNode->values as $valueNode) { diff --git a/tests/Database/SelectFields/NestedRelationLoadingTests/NestedRelationLoadingTest.php b/tests/Database/SelectFields/NestedRelationLoadingTests/NestedRelationLoadingTest.php index 75b672b9..bd7b9c1c 100644 --- a/tests/Database/SelectFields/NestedRelationLoadingTests/NestedRelationLoadingTest.php +++ b/tests/Database/SelectFields/NestedRelationLoadingTests/NestedRelationLoadingTest.php @@ -5,7 +5,6 @@ namespace Rebing\GraphQL\Tests\Database\SelectFields\NestedRelationLoadingTests; use Rebing\GraphQL\Tests\TestCaseDatabase; -use Rebing\GraphQL\Tests\Support\Models\Tag; use Rebing\GraphQL\Tests\Support\Models\Post; use Rebing\GraphQL\Tests\Support\Models\User; use Rebing\GraphQL\Tests\Support\Models\Comment; @@ -803,101 +802,6 @@ public function testQuerySelectAndWithAndNestedSubArgs(): void $this->assertEquals($expectedResult, $result); } - /** - * Fixed with https://github.com/rebing/graphql-laravel/pull/419. - */ - public function testQuerySelectAndWithAndScalarAndObjSubArgs(): void - { - /** @var User[] $users */ - $users = factory(User::class, 2) - ->create() - ->each(function (User $user): void { - $post = factory(Post::class) - ->create([ - 'title' => 'post1 title', - 'body' => 'post1 body', - 'user_id' => $user->id, - ]); - $post->tags()->save(factory(Tag::class) - ->create([ - 'name' => 'tag1', - ])); - $post->tags()->save(factory(Tag::class) - ->create([ - 'name' => 'tag2', - ])); - - $post = factory(Post::class) - ->create([ - 'title' => 'post2 title', - 'body' => 'post2 body', - 'user_id' => $user->id, - ]); - $post->tags()->save(factory(Tag::class) - ->create([ - 'name' => 'tag3', - ])); - $post->tags()->save(factory(Tag::class) - ->create([ - 'name' => 'tag4', - ])); - }); - - $graphql = <<<'GRAQPHQL' -{ - users(select: true, with: true) { - id - name - posts(filter: {title: "title", body: "body", keywords: ["tag3", "tag4"]}) { - body - id - title - } - } -} -GRAQPHQL; - - $this->sqlCounterReset(); - - $result = $this->graphql($graphql); - - $this->assertSqlQueries(<<<'SQL' -select "users"."id", "users"."name" from "users" order by "users"."id" asc; -select "posts"."body", "posts"."id", "posts"."title", "posts"."user_id" from "posts" where "posts"."user_id" in (?, ?) and "posts"."title" like ? and "posts"."title" like ? and exists (select * from "tags" inner join "taggables" on "tags"."id" = "taggables"."tag_id" where "posts"."id" = "taggables"."taggable_id" and "taggables"."taggable_type" = ? and "name" in (?, ?)) order by "posts"."id" asc; -SQL - ); - - $expectedResult = [ - 'data' => [ - 'users' => [ - [ - 'id' => (string) $users[0]->id, - 'name' => $users[0]->name, - 'posts' => [ - [ - 'body' => $users[0]->posts[1]->body, - 'id' => (string) $users[0]->posts[1]->id, - 'title' => $users[0]->posts[1]->title, - ], - ], - ], - [ - 'id' => (string) $users[1]->id, - 'name' => $users[1]->name, - 'posts' => [ - [ - 'body' => $users[1]->posts[1]->body, - 'id' => (string) $users[1]->posts[1]->id, - 'title' => $users[1]->posts[1]->title, - ], - ], - ], - ], - ], - ]; - $this->assertEquals($expectedResult, $result); - } - public function testRelationshipAlias(): void { $users = factory(User::class, 1) @@ -972,7 +876,6 @@ protected function getEnvironmentSetUp($app) CommentType::class, PostType::class, UserType::class, - FilterInput::class, ]); } } diff --git a/tests/Database/SelectFields/NestedRelationLoadingTests/UserType.php b/tests/Database/SelectFields/NestedRelationLoadingTests/UserType.php index 7cf04987..ab6f7493 100644 --- a/tests/Database/SelectFields/NestedRelationLoadingTests/UserType.php +++ b/tests/Database/SelectFields/NestedRelationLoadingTests/UserType.php @@ -32,27 +32,11 @@ public function fields(): array 'flag' => [ Type::boolean(), ], - 'filter' => [ - 'type' => GraphQL::type('Filter'), - ], ], 'query' => function (array $args, HasMany $query): HasMany { if (isset($args['flag'])) { $query->where('posts.flag', '=', $args['flag']); } - if (isset($args['filter'])) { - if (isset($args['filter']['title'])) { - $query->where('posts.title', 'like', "%{$args['filter']['title']}%"); - } - if (isset($args['filter']['body'])) { - $query->where('posts.title', 'like', "%{$args['filter']['title']}%"); - } - if (isset($args['filter']['keywords'])) { - $query->whereHas('tags', function ($query) use ($args) { - $query->whereIn('name', $args['filter']['keywords']); - }); - } - } return $query; }, diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/EpisodeEnum.php b/tests/Database/SelectFields/ValidateDiffNodeTests/EpisodeEnum.php new file mode 100644 index 00000000..ade43c22 --- /dev/null +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/EpisodeEnum.php @@ -0,0 +1,21 @@ + 'Episode', + 'description' => 'The types of demographic elements', + 'values' => [ + 'NEWHOPE' => 'NEWHOPE', + 'EMPIRE' => 'EMPIRE', + 'JEDI' => 'JEDI', + ], + ]; +} diff --git a/tests/Database/SelectFields/NestedRelationLoadingTests/FilterInput.php b/tests/Database/SelectFields/ValidateDiffNodeTests/FilterInput.php similarity index 75% rename from tests/Database/SelectFields/NestedRelationLoadingTests/FilterInput.php rename to tests/Database/SelectFields/ValidateDiffNodeTests/FilterInput.php index a1505848..478acd8c 100644 --- a/tests/Database/SelectFields/NestedRelationLoadingTests/FilterInput.php +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/FilterInput.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Rebing\GraphQL\Tests\Database\SelectFields\NestedRelationLoadingTests; +namespace Rebing\GraphQL\Tests\Database\SelectFields\ValidateDiffNodeTests; use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\InputType; @@ -17,14 +17,14 @@ class FilterInput extends InputType public function fields(): array { return [ - 'title' => [ - 'type' => Type::string(), - ], 'body' => [ 'type' => Type::string(), ], - 'keywords' => [ - 'type' => Type::listOf(Type::string()), + 'id' => [ + 'type' => Type::int(), + ], + 'title' => [ + 'type' => Type::string(), ], ]; } diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/PostType.php b/tests/Database/SelectFields/ValidateDiffNodeTests/PostType.php new file mode 100644 index 00000000..f6206d3a --- /dev/null +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/PostType.php @@ -0,0 +1,31 @@ + 'Post', + 'model' => Post::class, + ]; + + public function fields(): array + { + return [ + 'body' => [ + 'type' => Type::string(), + ], + 'id' => [ + 'type' => Type::ID(), + ], + ]; + } +} diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/UserType.php b/tests/Database/SelectFields/ValidateDiffNodeTests/UserType.php new file mode 100644 index 00000000..39b9a8c8 --- /dev/null +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/UserType.php @@ -0,0 +1,85 @@ + 'User', + 'model' => User::class, + ]; + + public function fields(): array + { + return [ + 'id' => [ + 'type' => Type::int(), + ], + 'name' => [ + 'type' => Type::string(), + ], + 'posts' => [ + 'type' => Type::listOf(Type::nonNull(GraphQL::type('Post'))), + 'args' => [ + 'id' => [ + 'type' => Type::int(), + ], + 'name' => [ + 'type' => Type::string(), + ], + 'price' => [ + 'type' => Type::float(), + ], + 'status' => [ + 'type' => Type::boolean(), + ], + 'flag' => [ + 'type' => Type::string(), + ], + 'author' => [ + 'type' => GraphQL::type('Episode'), + ], + 'post' => [ + 'type' => GraphQL::type('Filter'), + ], + 'keywords' => [ + 'type' => Type::listOf(Type::string()), + ], + 'customType' => [ + 'type' => GraphQL::type('MyCustomScalarString') + ], + ], + 'query' => function(array $args, $query) { + $expectedQueryArgs = [ + 'id' => 2, + 'name' => 'tom', + 'price' => 1.3, + 'status' => false, + 'flag' => null, + 'author' => 'EMPIRE', + 'post' => [ + 'id' => 2, + 'body' => 'body2' + ], + 'keywords' => [ + 'key4', + 'key5', + 'key6' + ], + 'customType' => 'custom string' + ]; + Assert::assertSame($expectedQueryArgs, $args); + return $query; + }, + ], + ]; + } +} diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php b/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php new file mode 100644 index 00000000..bf7e1d65 --- /dev/null +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php @@ -0,0 +1,86 @@ + 'users', + ]; + + public function args(): array + { + return [ + 'id' => [ + 'type' => Type::int(), + ], + 'name' => [ + 'type' => Type::string(), + ], + 'price' => [ + 'type' => Type::float(), + ], + 'status' => [ + 'type' => Type::boolean(), + ], + 'flag' => [ + 'type' => Type::string(), + ], + 'author' => [ + 'type' => GraphQL::type('Episode'), + ], + 'post' => [ + 'type' => GraphQL::type('Filter'), + ], + 'keywords' => [ + 'type' => Type::listOf(Type::string()), + ], + 'customType' => [ + 'type' => GraphQL::type('MyCustomScalarString') + ] + ]; + } + + public function type(): Type + { + return Type::nonNull(Type::listOf(Type::nonNull(GraphQL::type('User')))); + } + + public function resolve($root, $args, $context, ResolveInfo $resolveInfo, \Closure $getSelectFields) + { + /** @var SelectFields $fields */ + $fields = $getSelectFields(); + $expectedQueryArgs = [ + 'id' => 1, + 'name' => 'john', + 'price' => 1.2, + 'status' => true, + 'flag' => null, + 'author' => 'NEWHOPE', + 'post' => [ + 'body' => 'body', + 'id' => 1 + ], + 'keywords' => [ + 'key1', + 'key2', + 'key3' + ], + 'customType' => 'hello world' + ]; + Assert::assertSame($expectedQueryArgs, $args); + return User::select($fields->getSelect()) + ->with($fields->getRelations()) + ->get(); + } +} diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/ValidateDiffNodeTests.php b/tests/Database/SelectFields/ValidateDiffNodeTests/ValidateDiffNodeTests.php new file mode 100644 index 00000000..c4ef3ee8 --- /dev/null +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/ValidateDiffNodeTests.php @@ -0,0 +1,116 @@ +create() + ->each(function (User $user): void { + factory(Post::class) + ->create([ + 'user_id' => $user->id, + ]); + + factory(Post::class) + ->create([ + 'user_id' => $user->id, + ]); + }); + + $graphql = <<<'GRAQPHQL' +{ + users(id: 1, name: "john", price: 1.2, status: true, flag: null, author: NEWHOPE, post: {id: 1, body: "body"}, keywords: ["key1", "key2", "key3"], customType: "hello world") { + id + name + posts(id: 2, name: "tom", price: 1.3, status: false, flag: null, author: EMPIRE, post: {id: 2, body: "body2"}, keywords: ["key4", "key5", "key6"], customType: "custom string") { + id + body + } + } +} +GRAQPHQL; + + $this->sqlCounterReset(); + + $result = $this->graphql($graphql); + $this->assertSqlQueries(<<<'SQL' +select "users"."id", "users"."name" from "users"; +select "posts"."id", "posts"."body", "posts"."user_id" from "posts" where "posts"."user_id" in (?, ?) order by "posts"."id" asc; +SQL + ); + + $expectedResult = [ + 'data' => [ + 'users' => [ + [ + 'id' => (string) $users[0]->id, + 'name' => $users[0]->name, + 'posts' => [ + [ + 'body' => $users[0]->posts[0]->body, + 'id' => (string) $users[0]->posts[0]->id, + ], + [ + 'body' => $users[0]->posts[1]->body, + 'id' => (string) $users[0]->posts[1]->id, + ], + ], + ], + [ + 'id' => (string) $users[1]->id, + 'name' => $users[1]->name, + 'posts' => [ + [ + 'body' => $users[1]->posts[0]->body, + 'id' => (string) $users[1]->posts[0]->id, + ], + [ + 'body' => $users[1]->posts[1]->body, + 'id' => (string) $users[1]->posts[1]->id, + ], + ], + ], + ], + ], + ]; + + $this->assertEquals($expectedResult, $result); + } + + + protected function getEnvironmentSetUp($app) + { + parent::getEnvironmentSetUp($app); + + $app['config']->set('graphql.schemas.default', [ + 'query' => [ + UsersQuery::class, + ], + ]); + + $app['config']->set('graphql.schemas.custom', null); + + $app['config']->set('graphql.types', [ + UserType::class, + FilterInput::class, + EpisodeEnum::class, + PostType::class, + MyCustomScalarString::class, + ]); + } +} diff --git a/tests/Support/Models/Post.php b/tests/Support/Models/Post.php index 8c0d74ed..312b938b 100644 --- a/tests/Support/Models/Post.php +++ b/tests/Support/Models/Post.php @@ -8,7 +8,6 @@ use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\MorphMany; -use Illuminate\Database\Eloquent\Relations\MorphToMany; /** * @property int $id @@ -21,7 +20,6 @@ * @property bool $is_published * @property-read \Illuminate\Database\Eloquent\Collection|Comment[] $comments * @property-read \Illuminate\Database\Eloquent\Collection|Like[] $likes - * @property-read \Illuminate\Database\Eloquent\Collection|Tag[] $tags */ class Post extends Model { @@ -48,11 +46,6 @@ public function likes(): MorphMany return $this->morphMany(Like::class, 'likable'); } - public function tags(): MorphToMany - { - return $this->morphToMany(Tag::class, 'taggable'); - } - public function getIsPublishedAttribute(): bool { $publishedAt = $this->published_at; diff --git a/tests/Support/Models/Tag.php b/tests/Support/Models/Tag.php deleted file mode 100644 index 56ed3ddb..00000000 --- a/tests/Support/Models/Tag.php +++ /dev/null @@ -1,20 +0,0 @@ -belongsTo(Post::class); - } -} diff --git a/tests/Support/database/factories/TagFactory.php b/tests/Support/database/factories/TagFactory.php deleted file mode 100644 index 7a0ca6f6..00000000 --- a/tests/Support/database/factories/TagFactory.php +++ /dev/null @@ -1,14 +0,0 @@ -define(Tag::class, function (Faker $faker) { - return [ - 'name' => $faker->name, - ]; -}); diff --git a/tests/Support/database/migrations/____taggables_table.php b/tests/Support/database/migrations/____taggables_table.php deleted file mode 100644 index cb184e7e..00000000 --- a/tests/Support/database/migrations/____taggables_table.php +++ /dev/null @@ -1,20 +0,0 @@ -increments('tag_id'); - $table->string('taggable_id'); - $table->string('taggable_type'); - $table->timestamps(); - }); - } -} diff --git a/tests/Support/database/migrations/____tags_table.php b/tests/Support/database/migrations/____tags_table.php deleted file mode 100644 index d5beadd6..00000000 --- a/tests/Support/database/migrations/____tags_table.php +++ /dev/null @@ -1,19 +0,0 @@ -increments('id'); - $table->string('name'); - $table->timestamps(); - }); - } -} From 50cfe5771b94ba218ccd1d6d2f8659436b0d1d82 Mon Sep 17 00:00:00 2001 From: sowork <807522127@qq.com> Date: Wed, 14 Aug 2019 07:21:08 +0000 Subject: [PATCH 08/14] Apply fixes from StyleCI --- src/Support/ResolveInfoFieldsAndArguments.php | 13 +++++-------- .../ValidateDiffNodeTests/EpisodeEnum.php | 1 - .../ValidateDiffNodeTests/PostType.php | 2 -- .../ValidateDiffNodeTests/UserType.php | 15 ++++++++------- .../ValidateDiffNodeTests/UsersQuery.php | 17 +++++++++-------- .../ValidateDiffNodeTests.php | 3 +-- 6 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/Support/ResolveInfoFieldsAndArguments.php b/src/Support/ResolveInfoFieldsAndArguments.php index de37057f..324fd27b 100644 --- a/src/Support/ResolveInfoFieldsAndArguments.php +++ b/src/Support/ResolveInfoFieldsAndArguments.php @@ -20,7 +20,6 @@ use GraphQL\Language\AST\SelectionSetNode; use GraphQL\Language\AST\FragmentSpreadNode; use GraphQL\Language\AST\InlineFragmentNode; -use phpDocumentor\Reflection\Types\Mixed_; /** * This adapts \GraphQL\Type\Definition\ResolveInfo::getFieldSelection @@ -154,13 +153,12 @@ private function getValue(ValueNode $value) return $this->info->variableValues[$variableName] ?? null; } - if ($value instanceof IntValueNode) - { + if ($value instanceof IntValueNode) { return (int) $value->value; } if ($value instanceof FloatValueNode) { - return (float) $value->value; + return (float) $value->value; } if ($value instanceof StringValueNode) { @@ -168,16 +166,15 @@ private function getValue(ValueNode $value) } if ($value instanceof BooleanValueNode) { - return (boolean) $value->value; + return (bool) $value->value; } - if ($value instanceof EnumValueNode) - { + if ($value instanceof EnumValueNode) { return (string) $value->value; } if ($value instanceof NullValueNode) { - return null; + return; } if ($value instanceof ObjectValueNode) { diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/EpisodeEnum.php b/tests/Database/SelectFields/ValidateDiffNodeTests/EpisodeEnum.php index ade43c22..e5c7f924 100644 --- a/tests/Database/SelectFields/ValidateDiffNodeTests/EpisodeEnum.php +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/EpisodeEnum.php @@ -4,7 +4,6 @@ namespace Rebing\GraphQL\Tests\Database\SelectFields\ValidateDiffNodeTests; - use Rebing\GraphQL\Support\EnumType; class EpisodeEnum extends EnumType diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/PostType.php b/tests/Database/SelectFields/ValidateDiffNodeTests/PostType.php index f6206d3a..62b98a04 100644 --- a/tests/Database/SelectFields/ValidateDiffNodeTests/PostType.php +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/PostType.php @@ -5,10 +5,8 @@ namespace Rebing\GraphQL\Tests\Database\SelectFields\ValidateDiffNodeTests; use GraphQL\Type\Definition\Type; -use Rebing\GraphQL\Support\Facades\GraphQL; use Rebing\GraphQL\Tests\Support\Models\Post; use Rebing\GraphQL\Support\Type as GraphQLType; -use Illuminate\Database\Eloquent\Relations\HasMany; class PostType extends GraphQLType { diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/UserType.php b/tests/Database/SelectFields/ValidateDiffNodeTests/UserType.php index 39b9a8c8..39603204 100644 --- a/tests/Database/SelectFields/ValidateDiffNodeTests/UserType.php +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/UserType.php @@ -4,11 +4,11 @@ namespace Rebing\GraphQL\Tests\Database\SelectFields\ValidateDiffNodeTests; -use GraphQL\Type\Definition\Type; use PHPUnit\Framework\Assert; +use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Facades\GraphQL; -use Rebing\GraphQL\Support\Type as GraphQLType; use Rebing\GraphQL\Tests\Support\Models\User; +use Rebing\GraphQL\Support\Type as GraphQLType; class UserType extends GraphQLType { @@ -54,10 +54,10 @@ public function fields(): array 'type' => Type::listOf(Type::string()), ], 'customType' => [ - 'type' => GraphQL::type('MyCustomScalarString') + 'type' => GraphQL::type('MyCustomScalarString'), ], ], - 'query' => function(array $args, $query) { + 'query' => function (array $args, $query) { $expectedQueryArgs = [ 'id' => 2, 'name' => 'tom', @@ -67,16 +67,17 @@ public function fields(): array 'author' => 'EMPIRE', 'post' => [ 'id' => 2, - 'body' => 'body2' + 'body' => 'body2', ], 'keywords' => [ 'key4', 'key5', - 'key6' + 'key6', ], - 'customType' => 'custom string' + 'customType' => 'custom string', ]; Assert::assertSame($expectedQueryArgs, $args); + return $query; }, ], diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php b/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php index bf7e1d65..4ea92666 100644 --- a/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php @@ -4,12 +4,12 @@ namespace Rebing\GraphQL\Tests\Database\SelectFields\ValidateDiffNodeTests; -use GraphQL\Type\Definition\ResolveInfo; use GraphQL\Type\Definition\Type; -use Illuminate\Foundation\Testing\Assert; -use Rebing\GraphQL\Support\Facades\GraphQL; use Rebing\GraphQL\Support\Query; +use GraphQL\Type\Definition\ResolveInfo; use Rebing\GraphQL\Support\SelectFields; +use Illuminate\Foundation\Testing\Assert; +use Rebing\GraphQL\Support\Facades\GraphQL; use Rebing\GraphQL\Tests\Support\Models\User; class UsersQuery extends Query @@ -46,8 +46,8 @@ public function args(): array 'type' => Type::listOf(Type::string()), ], 'customType' => [ - 'type' => GraphQL::type('MyCustomScalarString') - ] + 'type' => GraphQL::type('MyCustomScalarString'), + ], ]; } @@ -69,16 +69,17 @@ public function resolve($root, $args, $context, ResolveInfo $resolveInfo, \Closu 'author' => 'NEWHOPE', 'post' => [ 'body' => 'body', - 'id' => 1 + 'id' => 1, ], 'keywords' => [ 'key1', 'key2', - 'key3' + 'key3', ], - 'customType' => 'hello world' + 'customType' => 'hello world', ]; Assert::assertSame($expectedQueryArgs, $args); + return User::select($fields->getSelect()) ->with($fields->getRelations()) ->get(); diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/ValidateDiffNodeTests.php b/tests/Database/SelectFields/ValidateDiffNodeTests/ValidateDiffNodeTests.php index c4ef3ee8..5a0a13d2 100644 --- a/tests/Database/SelectFields/ValidateDiffNodeTests/ValidateDiffNodeTests.php +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/ValidateDiffNodeTests.php @@ -2,11 +2,11 @@ namespace Rebing\GraphQL\Tests\Database\SelectFields\ValidateDiffNodeTests; +use Rebing\GraphQL\Tests\TestCaseDatabase; use Rebing\GraphQL\Tests\Support\Models\Post; use Rebing\GraphQL\Tests\Support\Models\User; use Rebing\GraphQL\Tests\Support\Traits\SqlAssertionTrait; use Rebing\GraphQL\Tests\Support\Types\MyCustomScalarString; -use Rebing\GraphQL\Tests\TestCaseDatabase; class ValidateDiffNodeTests extends TestCaseDatabase { @@ -92,7 +92,6 @@ public function testDiffValueNodeAndNestedValueNodeArgs(): void $this->assertEquals($expectedResult, $result); } - protected function getEnvironmentSetUp($app) { parent::getEnvironmentSetUp($app); From 6b33458385bd78765454d2321b6def0268f804ba Mon Sep 17 00:00:00 2001 From: "xingshenqiang@uniondrug.cn" Date: Wed, 14 Aug 2019 15:48:40 +0800 Subject: [PATCH 09/14] update import assert --- .../Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php b/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php index 4ea92666..b2bb00ac 100644 --- a/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php @@ -8,7 +8,7 @@ use Rebing\GraphQL\Support\Query; use GraphQL\Type\Definition\ResolveInfo; use Rebing\GraphQL\Support\SelectFields; -use Illuminate\Foundation\Testing\Assert; +use PHPUnit\Framework\Assert; use Rebing\GraphQL\Support\Facades\GraphQL; use Rebing\GraphQL\Tests\Support\Models\User; From b5f49644a1ad253a16c07194d854c41e7dd3c82f Mon Sep 17 00:00:00 2001 From: sowork <807522127@qq.com> Date: Wed, 14 Aug 2019 07:49:11 +0000 Subject: [PATCH 10/14] Apply fixes from StyleCI --- .../Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php b/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php index b2bb00ac..e2a4be0c 100644 --- a/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/UsersQuery.php @@ -4,11 +4,11 @@ namespace Rebing\GraphQL\Tests\Database\SelectFields\ValidateDiffNodeTests; +use PHPUnit\Framework\Assert; use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Query; use GraphQL\Type\Definition\ResolveInfo; use Rebing\GraphQL\Support\SelectFields; -use PHPUnit\Framework\Assert; use Rebing\GraphQL\Support\Facades\GraphQL; use Rebing\GraphQL\Tests\Support\Models\User; From 7631c5d6690eb2992b62d30bcaa8159f8ed71490 Mon Sep 17 00:00:00 2001 From: Markus Fischer Date: Fri, 16 Aug 2019 23:51:35 +0200 Subject: [PATCH 11/14] Import class --- src/Support/ResolveInfoFieldsAndArguments.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Support/ResolveInfoFieldsAndArguments.php b/src/Support/ResolveInfoFieldsAndArguments.php index 324fd27b..878791d3 100644 --- a/src/Support/ResolveInfoFieldsAndArguments.php +++ b/src/Support/ResolveInfoFieldsAndArguments.php @@ -4,6 +4,7 @@ namespace Rebing\GraphQL\Support; +use RuntimeException; use GraphQL\Language\AST\FieldNode; use GraphQL\Language\AST\ValueNode; use GraphQL\Language\AST\IntValueNode; @@ -185,7 +186,7 @@ private function getValue(ValueNode $value) return $this->getInputListObjectValue($value); } - throw new \RuntimeException('Failed to resolve unknown ValueNode type'); + throw new RuntimeException('Failed to resolve unknown ValueNode type'); } /** From a5b4458edc8601ff59d15c9bd993efdc163b69ed Mon Sep 17 00:00:00 2001 From: Markus Fischer Date: Fri, 16 Aug 2019 23:52:21 +0200 Subject: [PATCH 12/14] Remove docblocks which don't add anything --- src/Support/ResolveInfoFieldsAndArguments.php | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/Support/ResolveInfoFieldsAndArguments.php b/src/Support/ResolveInfoFieldsAndArguments.php index 878791d3..34aceea0 100644 --- a/src/Support/ResolveInfoFieldsAndArguments.php +++ b/src/Support/ResolveInfoFieldsAndArguments.php @@ -142,10 +142,6 @@ private function foldSelectionSet(SelectionSetNode $selectionSet, int $descend): return $fields; } - /** - * @param ValueNode $value - * @return mixed|null - */ private function getValue(ValueNode $value) { if ($value instanceof VariableNode) { @@ -189,10 +185,6 @@ private function getValue(ValueNode $value) throw new RuntimeException('Failed to resolve unknown ValueNode type'); } - /** - * @param ObjectValueNode $objectValueNode - * @return array - */ private function getInputObjectValue(ObjectValueNode $objectValueNode): array { $value = []; @@ -205,10 +197,6 @@ private function getInputObjectValue(ObjectValueNode $objectValueNode): array return $value; } - /** - * @param ListValueNode $listValueNode - * @return array - */ private function getInputListObjectValue(ListValueNode $listValueNode): array { $value = []; From 6b2626e0935afe6e32dabde9fa43c2a3ce74e70f Mon Sep 17 00:00:00 2001 From: Markus Fischer Date: Fri, 16 Aug 2019 23:54:32 +0200 Subject: [PATCH 13/14] Remove reference as it was not prior code --- .../ValidateDiffNodeTests/ValidateDiffNodeTests.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/Database/SelectFields/ValidateDiffNodeTests/ValidateDiffNodeTests.php b/tests/Database/SelectFields/ValidateDiffNodeTests/ValidateDiffNodeTests.php index 5a0a13d2..98f5d724 100644 --- a/tests/Database/SelectFields/ValidateDiffNodeTests/ValidateDiffNodeTests.php +++ b/tests/Database/SelectFields/ValidateDiffNodeTests/ValidateDiffNodeTests.php @@ -12,9 +12,6 @@ class ValidateDiffNodeTests extends TestCaseDatabase { use SqlAssertionTrait; - /** - * Fixed with https://github.com/rebing/graphql-laravel/pull/419. - */ public function testDiffValueNodeAndNestedValueNodeArgs(): void { /** @var User[] $users */ From edc0bd297962fd1564d3a175bb7181b429278b09 Mon Sep 17 00:00:00 2001 From: Markus Fischer Date: Sat, 17 Aug 2019 00:04:03 +0200 Subject: [PATCH 14/14] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc30192f..341b8b18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ CHANGELOG ### Fixed - Support adding Schema objects directly [\#449 / mfn](https://github.com/rebing/graphql-laravel/pull/449) +- Input arguments are properly parsed when objects or lists are passed [\#419 / sowork](https://github.com/rebing/graphql-laravel/pull/419) 2019-08-05, 2.0.0 -----------------