Skip to content
This repository was archived by the owner on Mar 29, 2020. It is now read-only.

Commit 31f8a40

Browse files
committed
added mutation test trait helper
1 parent 57d308e commit 31f8a40

File tree

2 files changed

+96
-2
lines changed

2 files changed

+96
-2
lines changed

src/Traits/MutationTestTrait.php

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<?php
2+
3+
namespace Nuwave\Relay\Traits;
4+
5+
use GraphQL\Type\Definition\ObjectType;
6+
use GraphQL\Type\Definition\FieldDefinition;
7+
8+
trait MutationTestTrait
9+
{
10+
/**
11+
* Send mutation query.
12+
*
13+
* @param string $mutationName
14+
* @param array $input
15+
* @param array $outputFields
16+
* @return $this
17+
*/
18+
public function mutate($mutationName, array $input, array $outputFields = [])
19+
{
20+
$query = $this->generateMutationQuery(
21+
$mutationName,
22+
$this->generateOutputFields($mutationName, $outputFields)
23+
);
24+
25+
$variables = ['input' => array_merge(['clientMutationId' => (string)time()], $input)];
26+
27+
return $this->post('graphql', [
28+
'query' => $query,
29+
'variables' => $variables
30+
]);
31+
}
32+
33+
/**
34+
* Generate mutation query.
35+
*
36+
* @param string $mutation
37+
* @param string $outputFields
38+
* @return string
39+
*/
40+
protected function generateMutationQuery($mutation, $outputFields = '')
41+
{
42+
$mutationName = ucfirst($mutation . 'Mutation');
43+
$inputName = ucfirst($mutation . 'Input');
44+
45+
return 'mutation ' . $mutationName . '($input: ' . $inputName . '!){'. $mutation . '(input: $input){' . $outputFields . '}}';
46+
}
47+
48+
/**
49+
* Generate list of available output fields.
50+
*
51+
* @param string $mutationName
52+
* @return string
53+
*/
54+
protected function generateOutputFields($mutationName, array $outputFields)
55+
{
56+
$fields = [];
57+
58+
if (! empty($outputFields)) {
59+
foreach ($outputFields as $name => $availableFields) {
60+
$fields[] = $name . '{'. implode(',', $availableFields) .'}';
61+
}
62+
} else {
63+
$fields = $this->availableOutputFields($mutationName);
64+
}
65+
66+
return implode(',', $fields);
67+
}
68+
69+
/**
70+
* Get all available output fields for mutation.
71+
*
72+
* @param string $mutationName
73+
* @return array
74+
*/
75+
protected function availableOutputFields($mutationName)
76+
{
77+
$outputFields = ['clientMutationId'];
78+
$mutations = config('graphql.schema.mutation');
79+
$mutation = app($mutations[$mutationName]);
80+
81+
foreach ($mutation->type()->getFields() as $name => $field) {
82+
if ($field instanceof FieldDefinition) {
83+
$objectType = $field->getType();
84+
85+
if ($objectType instanceof ObjectType) {
86+
$fields = array_keys($objectType->getFields());
87+
$outputFields[] = $name . '{'. implode(',', $fields) .'}';
88+
}
89+
}
90+
}
91+
92+
return $outputFields;
93+
}
94+
}

tests/IntrospectionTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class IntrospectionTest extends BaseTest
77
/**
88
* @test
99
*/
10-
public function itAcceptsIntrospectionRequestForNodeInterface()
10+
public function itAcceptsIntrospectionForNodeInterface()
1111
{
1212
$query = '{
1313
__type(name: "Node") {
@@ -50,7 +50,7 @@ public function itAcceptsIntrospectionRequestForNodeInterface()
5050
/**
5151
* @test
5252
*/
53-
public function itAcceptsIntrospectionRequestForNodeQuery()
53+
public function itAcceptsIntrospectionForNodeQuery()
5454
{
5555
$query = '{
5656
__schema {

0 commit comments

Comments
 (0)