Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
GraphQlConfigTest.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
13 use Magento\Framework\GraphQl\Config\Config;
15 use Magento\Framework\GraphQl\Config\Data\Argument;
16 use Magento\Framework\GraphQl\Config\Data\Enum;
17 use Magento\Framework\GraphQl\Config\Data\Field;
18 use Magento\Framework\GraphQl\Config\Data\StructureInterface;
19 use Magento\Framework\GraphQl\Config\Data\Type;
24 
25 class GraphQlConfigTest extends \PHPUnit\Framework\TestCase
26 {
28  private $model;
29 
30  protected function setUp()
31  {
35  $cache = $objectManager->get(Cache::class);
36  $cache->clean();
37  $fileResolverMock = $this->getMockBuilder(
38  \Magento\Framework\Config\FileResolverInterface::class
39  )->disableOriginalConstructor()->getMock();
40  $fileList = [
41  file_get_contents(__DIR__ . '/_files/schemaC.graphqls'),
42  file_get_contents(__DIR__ . '/_files/schemaD.graphqls')
43  ];
44  $fileResolverMock->expects($this->any())->method('get')->will($this->returnValue($fileList));
45  $graphQlReader = $objectManager->create(
46  \Magento\Framework\GraphQlSchemaStitching\GraphQlReader::class,
47  ['fileResolver' => $fileResolverMock]
48  );
49  $reader = $objectManager->create(
50  \Magento\Framework\GraphQlSchemaStitching\Reader::class,
51  ['readers' => ['graphql_reader' => $graphQlReader]]
52  );
53  $data = $objectManager->create(
54  \Magento\Framework\GraphQl\Config\Data ::class,
55  ['reader' => $reader]
56  );
57  $this->model = $objectManager->create(\Magento\Framework\GraphQl\Config::class, ['data' =>$data]);
58  }
59 
63  public function testGraphQlTypeAndFieldConfigStructure()
64  {
65  $query = 'Query';
67  $output = $this->model->getConfigElement($query);
68  $expectedOutputArray = require __DIR__ . '/_files/query_array_output.php';
69  $this->assertEquals($output->getName(), $query);
71  $queryFields = $output->getFields();
72  foreach (array_keys($queryFields) as $fieldKey) {
73  $fieldAssertionMap = [
74  ['response_field' => 'name', 'expected_value' => $queryFields[$fieldKey]->getName()],
75  ['response_field' => 'type', 'expected_value' => $queryFields[$fieldKey]->getTypeName()],
76  ['response_field' => 'required', 'expected_value' => $queryFields[$fieldKey]->isRequired()],
77  ['response_field' => 'isList', 'expected_value' => $queryFields[$fieldKey]->isList()],
78  ['response_field' => 'resolver', 'expected_value' => $queryFields[$fieldKey]->getResolver()],
79  ['response_field' => 'description', 'expected_value' => $queryFields[$fieldKey]->getDescription()]
80  ];
81  $this->assertResponseFields($expectedOutputArray['Query']['fields'][$fieldKey], $fieldAssertionMap);
83  $queryFieldArguments = $queryFields[$fieldKey]->getArguments();
84  foreach (array_keys($queryFieldArguments) as $argumentKey) {
85  $argumentAssertionMap = [
86  ['response_field' => 'name', 'expected_value' => $queryFieldArguments[$argumentKey]->getName()],
87  ['response_field' => 'type', 'expected_value' => $queryFieldArguments[$argumentKey]->getTypeName()],
88  ['response_field' => 'description', 'expected_value' => $queryFieldArguments[$argumentKey]
89  ->getDescription()],
90  ['response_field' => 'required', 'expected_value' => $queryFieldArguments[$argumentKey]
91  ->isRequired()],
92  ['response_field' => 'isList', 'expected_value' => $queryFieldArguments[$argumentKey]->isList()],
93  ['response_field' => 'itemsRequired', 'expected_value' => $queryFieldArguments[$argumentKey]
94  ->areItemsRequired()]
95  ];
96  $this->assertResponseFields(
97  $expectedOutputArray['Query']['fields'][$fieldKey]['arguments'][$argumentKey],
98  $argumentAssertionMap
99  );
100  $this->assertEquals(
101  $expectedOutputArray['Query']['fields'][$fieldKey]['arguments'][$argumentKey]['defaultValue'],
102  $queryFieldArguments[$argumentKey]->getDefaultValue()
103  );
104  }
105  }
106  }
107 
111  public function testGraphQlEnumTypeConfigStructure()
112  {
113  $queryEnum = 'PriceAdjustmentDescriptionEnum';
115  $outputEnum = $this->model->getConfigElement($queryEnum);
117  $outputEnumValues = $outputEnum->getValues();
118  $expectedOutputArray = require __DIR__ . '/_files/query_array_output.php';
119  $this->assertEquals($outputEnum->getName(), $queryEnum);
120  $this->assertEquals($outputEnum->getDescription(), 'Description for enumType PriceAdjustmentDescriptionEnum');
121 
122  foreach (array_keys($outputEnumValues) as $outputEnumValue) {
123  $this->assertEquals(
124  $expectedOutputArray['PriceAdjustmentDescriptionEnum']['values'][$outputEnumValue]['name'],
125  $outputEnumValues[$outputEnumValue]->getName()
126  );
127  $this->assertEquals(
128  $expectedOutputArray['PriceAdjustmentDescriptionEnum']['values'][$outputEnumValue]['value'],
129  $outputEnumValues[$outputEnumValue]->getValue()
130  );
131  $this->assertEquals(
132  $expectedOutputArray['PriceAdjustmentDescriptionEnum']['values'][$outputEnumValue]['description'],
133  $outputEnumValues[$outputEnumValue]->getDescription()
134  );
135  }
136  }
137 
141  public function testGraphQlTypeThatImplementsInterface()
142  {
143  $typeThatImplements = 'ProductLinks';
145  $outputInterface = $this->model->getConfigElement($typeThatImplements);
146  $expectedOutputArray = require __DIR__ . '/_files/query_array_output.php';
147  $this->assertEquals($outputInterface->getName(), $typeThatImplements);
148  $outputInterfaceValues = $outputInterface->getInterfaces();
150  $outputInterfaceFields =$outputInterface->getFields();
151  foreach (array_keys($outputInterfaceValues) as $outputInterfaceValue) {
152  $this->assertEquals(
153  $expectedOutputArray['ProductLinks']['interfaces'][$outputInterfaceValue]['interface'],
154  $outputInterfaceValues[$outputInterfaceValue]['interface']
155  );
156  $this->assertEquals(
157  $expectedOutputArray['ProductLinks']['interfaces'][$outputInterfaceValue]['copyFields'],
158  $outputInterfaceValues[$outputInterfaceValue]['copyFields']
159  );
160  }
161  foreach (array_keys($outputInterfaceFields) as $outputInterfaceField) {
162  $this->assertEquals(
163  $expectedOutputArray['ProductLinks']['fields'][$outputInterfaceField]['name'],
164  $outputInterfaceFields[$outputInterfaceField]->getName()
165  );
166  $this->assertEquals(
167  $expectedOutputArray['ProductLinks']['fields'][$outputInterfaceField]['type'],
168  $outputInterfaceFields[$outputInterfaceField]->getTypeName()
169  );
170  $this->assertEquals(
171  $expectedOutputArray['ProductLinks']['fields'][$outputInterfaceField]['required'],
172  $outputInterfaceFields[$outputInterfaceField]->isRequired()
173  );
174  $this->assertEquals(
175  $expectedOutputArray['ProductLinks']['fields'][$outputInterfaceField]['description'],
176  $outputInterfaceFields[$outputInterfaceField]->getDescription()
177  );
178  $this->assertEmpty($outputInterfaceFields[$outputInterfaceField]->getArguments());
179  }
180  }
181 
182  public function testGraphQlInterfaceConfigElement()
183  {
184  $interfaceType ='ProductLinksInterface';
186  $outputConfigElement = $this->model->getConfigElement($interfaceType);
187  $expectedOutput = require __DIR__ . '/_files/query_array_output.php';
188  $this->assertEquals($outputConfigElement->getName(), $expectedOutput['ProductLinksInterface']['name']);
189  $this->assertEquals(
190  $outputConfigElement->getTypeResolver(),
191  $expectedOutput['ProductLinksInterface']['typeResolver']
192  );
193  $this->assertEquals(
194  $outputConfigElement->getDescription(),
195  $expectedOutput['ProductLinksInterface']['description']
196  );
197  }
198 
204  private function assertResponseFields($actualResponse, $assertionMap)
205  {
206  foreach ($assertionMap as $key => $assertionData) {
207  $expectedValue = isset($assertionData['expected_value'])
208  ? $assertionData['expected_value']
209  : $assertionData;
210  $responseField = isset($assertionData['response_field']) ? $assertionData['response_field'] : $key;
211  $this->assertNotNull(
212  $expectedValue,
213  "Value of '{$responseField}' field must not be NULL"
214  );
215  $this->assertEquals(
216  $expectedValue,
217  $actualResponse[$responseField],
218  "Value of '{$responseField}' field in response does not match expected value: "
219  . var_export($expectedValue, true)
220  );
221  }
222  }
223 
227  protected function tearDown()
228  {
232  $cache = $objectManager->get(Cache::class);
233  $cache->clean();
234  }
235 }
$objectManager
Definition: bootstrap.php:17
$fileList
Definition: export.php:13
defined('TESTS_BP')||define('TESTS_BP' __DIR__
Definition: _bootstrap.php:60