From 31f8a403803fe33bffbfb8e6125b477825b7e588 Mon Sep 17 00:00:00 2001 From: Christopher Moore Date: Sun, 22 Nov 2015 07:55:05 -0700 Subject: [PATCH] added mutation test trait helper --- src/Traits/MutationTestTrait.php | 94 ++++++++++++++++++++++++++++++++ tests/IntrospectionTest.php | 4 +- 2 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 src/Traits/MutationTestTrait.php diff --git a/src/Traits/MutationTestTrait.php b/src/Traits/MutationTestTrait.php new file mode 100644 index 0000000..e73e49e --- /dev/null +++ b/src/Traits/MutationTestTrait.php @@ -0,0 +1,94 @@ +generateMutationQuery( + $mutationName, + $this->generateOutputFields($mutationName, $outputFields) + ); + + $variables = ['input' => array_merge(['clientMutationId' => (string)time()], $input)]; + + return $this->post('graphql', [ + 'query' => $query, + 'variables' => $variables + ]); + } + + /** + * Generate mutation query. + * + * @param string $mutation + * @param string $outputFields + * @return string + */ + protected function generateMutationQuery($mutation, $outputFields = '') + { + $mutationName = ucfirst($mutation . 'Mutation'); + $inputName = ucfirst($mutation . 'Input'); + + return 'mutation ' . $mutationName . '($input: ' . $inputName . '!){'. $mutation . '(input: $input){' . $outputFields . '}}'; + } + + /** + * Generate list of available output fields. + * + * @param string $mutationName + * @return string + */ + protected function generateOutputFields($mutationName, array $outputFields) + { + $fields = []; + + if (! empty($outputFields)) { + foreach ($outputFields as $name => $availableFields) { + $fields[] = $name . '{'. implode(',', $availableFields) .'}'; + } + } else { + $fields = $this->availableOutputFields($mutationName); + } + + return implode(',', $fields); + } + + /** + * Get all available output fields for mutation. + * + * @param string $mutationName + * @return array + */ + protected function availableOutputFields($mutationName) + { + $outputFields = ['clientMutationId']; + $mutations = config('graphql.schema.mutation'); + $mutation = app($mutations[$mutationName]); + + foreach ($mutation->type()->getFields() as $name => $field) { + if ($field instanceof FieldDefinition) { + $objectType = $field->getType(); + + if ($objectType instanceof ObjectType) { + $fields = array_keys($objectType->getFields()); + $outputFields[] = $name . '{'. implode(',', $fields) .'}'; + } + } + } + + return $outputFields; + } +} diff --git a/tests/IntrospectionTest.php b/tests/IntrospectionTest.php index 7427f71..cd3a3f5 100644 --- a/tests/IntrospectionTest.php +++ b/tests/IntrospectionTest.php @@ -7,7 +7,7 @@ class IntrospectionTest extends BaseTest /** * @test */ - public function itAcceptsIntrospectionRequestForNodeInterface() + public function itAcceptsIntrospectionForNodeInterface() { $query = '{ __type(name: "Node") { @@ -50,7 +50,7 @@ public function itAcceptsIntrospectionRequestForNodeInterface() /** * @test */ - public function itAcceptsIntrospectionRequestForNodeQuery() + public function itAcceptsIntrospectionForNodeQuery() { $query = '{ __schema {