123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- declare(strict_types=1);
- namespace Magento\Framework\GraphQl;
- use Magento\Framework\App\Bootstrap;
- use Magento\Framework\App\Cache;
- use Magento\Framework\Config\FileResolverInterface;
- use Magento\Framework\GraphQl\Config\Config;
- use Magento\Framework\GraphQl\Config\ConfigElementInterface;
- use Magento\Framework\GraphQl\Config\Data\Argument;
- use Magento\Framework\GraphQl\Config\Data\Enum;
- use Magento\Framework\GraphQl\Config\Data\Field;
- use Magento\Framework\GraphQl\Config\Data\StructureInterface;
- use Magento\Framework\GraphQl\Config\Data\Type;
- use Magento\Framework\GraphQl\Config\Element\EnumValue;
- use Magento\Framework\GraphQl\Config\Element\InterfaceType;
- use Magento\Framework\GraphQl\Config\Element\TypeFactory;
- use Magento\Framework\ObjectManagerInterface;
- class GraphQlConfigTest extends \PHPUnit\Framework\TestCase
- {
- /** @var \Magento\Framework\GraphQl\Config */
- private $model;
- protected function setUp()
- {
- /** @var ObjectManagerInterface $objectManager */
- $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
- /** @var Cache $cache */
- $cache = $objectManager->get(Cache::class);
- $cache->clean();
- $fileResolverMock = $this->getMockBuilder(
- \Magento\Framework\Config\FileResolverInterface::class
- )->disableOriginalConstructor()->getMock();
- $fileList = [
- file_get_contents(__DIR__ . '/_files/schemaC.graphqls'),
- file_get_contents(__DIR__ . '/_files/schemaD.graphqls')
- ];
- $fileResolverMock->expects($this->any())->method('get')->will($this->returnValue($fileList));
- $graphQlReader = $objectManager->create(
- \Magento\Framework\GraphQlSchemaStitching\GraphQlReader::class,
- ['fileResolver' => $fileResolverMock]
- );
- $reader = $objectManager->create(
- \Magento\Framework\GraphQlSchemaStitching\Reader::class,
- ['readers' => ['graphql_reader' => $graphQlReader]]
- );
- $data = $objectManager->create(
- \Magento\Framework\GraphQl\Config\Data ::class,
- ['reader' => $reader]
- );
- $this->model = $objectManager->create(\Magento\Framework\GraphQl\Config::class, ['data' =>$data]);
- }
- /**
- * tests GraphQl type's structure object
- */
- public function testGraphQlTypeAndFieldConfigStructure()
- {
- $query = 'Query';
- /** @var \Magento\Framework\GraphQl\Config\Element\Type $output */
- $output = $this->model->getConfigElement($query);
- $expectedOutputArray = require __DIR__ . '/_files/query_array_output.php';
- $this->assertEquals($output->getName(), $query);
- /** @var \Magento\Framework\GraphQl\Config\Element\Field $queryFields */
- $queryFields = $output->getFields();
- foreach (array_keys($queryFields) as $fieldKey) {
- $fieldAssertionMap = [
- ['response_field' => 'name', 'expected_value' => $queryFields[$fieldKey]->getName()],
- ['response_field' => 'type', 'expected_value' => $queryFields[$fieldKey]->getTypeName()],
- ['response_field' => 'required', 'expected_value' => $queryFields[$fieldKey]->isRequired()],
- ['response_field' => 'isList', 'expected_value' => $queryFields[$fieldKey]->isList()],
- ['response_field' => 'resolver', 'expected_value' => $queryFields[$fieldKey]->getResolver()],
- ['response_field' => 'description', 'expected_value' => $queryFields[$fieldKey]->getDescription()]
- ];
- $this->assertResponseFields($expectedOutputArray['Query']['fields'][$fieldKey], $fieldAssertionMap);
- /** @var \Magento\Framework\GraphQl\Config\Element\Argument $queryFieldArguments */
- $queryFieldArguments = $queryFields[$fieldKey]->getArguments();
- foreach (array_keys($queryFieldArguments) as $argumentKey) {
- $argumentAssertionMap = [
- ['response_field' => 'name', 'expected_value' => $queryFieldArguments[$argumentKey]->getName()],
- ['response_field' => 'type', 'expected_value' => $queryFieldArguments[$argumentKey]->getTypeName()],
- ['response_field' => 'description', 'expected_value' => $queryFieldArguments[$argumentKey]
- ->getDescription()],
- ['response_field' => 'required', 'expected_value' => $queryFieldArguments[$argumentKey]
- ->isRequired()],
- ['response_field' => 'isList', 'expected_value' => $queryFieldArguments[$argumentKey]->isList()],
- ['response_field' => 'itemsRequired', 'expected_value' => $queryFieldArguments[$argumentKey]
- ->areItemsRequired()]
- ];
- $this->assertResponseFields(
- $expectedOutputArray['Query']['fields'][$fieldKey]['arguments'][$argumentKey],
- $argumentAssertionMap
- );
- $this->assertEquals(
- $expectedOutputArray['Query']['fields'][$fieldKey]['arguments'][$argumentKey]['defaultValue'],
- $queryFieldArguments[$argumentKey]->getDefaultValue()
- );
- }
- }
- }
- /**
- * Tests Structured data object for configured GraphQL enum type.
- */
- public function testGraphQlEnumTypeConfigStructure()
- {
- $queryEnum = 'PriceAdjustmentDescriptionEnum';
- /** @var \Magento\Framework\GraphQl\Config\Element\Enum $outputEnum */
- $outputEnum = $this->model->getConfigElement($queryEnum);
- /** @var EnumValue $outputEnumValues */
- $outputEnumValues = $outputEnum->getValues();
- $expectedOutputArray = require __DIR__ . '/_files/query_array_output.php';
- $this->assertEquals($outputEnum->getName(), $queryEnum);
- $this->assertEquals($outputEnum->getDescription(), 'Description for enumType PriceAdjustmentDescriptionEnum');
- foreach (array_keys($outputEnumValues) as $outputEnumValue) {
- $this->assertEquals(
- $expectedOutputArray['PriceAdjustmentDescriptionEnum']['values'][$outputEnumValue]['name'],
- $outputEnumValues[$outputEnumValue]->getName()
- );
- $this->assertEquals(
- $expectedOutputArray['PriceAdjustmentDescriptionEnum']['values'][$outputEnumValue]['value'],
- $outputEnumValues[$outputEnumValue]->getValue()
- );
- $this->assertEquals(
- $expectedOutputArray['PriceAdjustmentDescriptionEnum']['values'][$outputEnumValue]['description'],
- $outputEnumValues[$outputEnumValue]->getDescription()
- );
- }
- }
- /**
- * Tests Structured data object for configured GraphQL type that implements an interface.
- */
- public function testGraphQlTypeThatImplementsInterface()
- {
- $typeThatImplements = 'ProductLinks';
- /** @var \Magento\Framework\GraphQl\Config\Element\Type $outputInterface */
- $outputInterface = $this->model->getConfigElement($typeThatImplements);
- $expectedOutputArray = require __DIR__ . '/_files/query_array_output.php';
- $this->assertEquals($outputInterface->getName(), $typeThatImplements);
- $outputInterfaceValues = $outputInterface->getInterfaces();
- /** @var \Magento\Framework\GraphQl\Config\Element\Field $outputInterfaceFields */
- $outputInterfaceFields =$outputInterface->getFields();
- foreach (array_keys($outputInterfaceValues) as $outputInterfaceValue) {
- $this->assertEquals(
- $expectedOutputArray['ProductLinks']['interfaces'][$outputInterfaceValue]['interface'],
- $outputInterfaceValues[$outputInterfaceValue]['interface']
- );
- $this->assertEquals(
- $expectedOutputArray['ProductLinks']['interfaces'][$outputInterfaceValue]['copyFields'],
- $outputInterfaceValues[$outputInterfaceValue]['copyFields']
- );
- }
- foreach (array_keys($outputInterfaceFields) as $outputInterfaceField) {
- $this->assertEquals(
- $expectedOutputArray['ProductLinks']['fields'][$outputInterfaceField]['name'],
- $outputInterfaceFields[$outputInterfaceField]->getName()
- );
- $this->assertEquals(
- $expectedOutputArray['ProductLinks']['fields'][$outputInterfaceField]['type'],
- $outputInterfaceFields[$outputInterfaceField]->getTypeName()
- );
- $this->assertEquals(
- $expectedOutputArray['ProductLinks']['fields'][$outputInterfaceField]['required'],
- $outputInterfaceFields[$outputInterfaceField]->isRequired()
- );
- $this->assertEquals(
- $expectedOutputArray['ProductLinks']['fields'][$outputInterfaceField]['description'],
- $outputInterfaceFields[$outputInterfaceField]->getDescription()
- );
- $this->assertEmpty($outputInterfaceFields[$outputInterfaceField]->getArguments());
- }
- }
- public function testGraphQlInterfaceConfigElement()
- {
- $interfaceType ='ProductLinksInterface';
- /** @var InterfaceType $outputConfigElement */
- $outputConfigElement = $this->model->getConfigElement($interfaceType);
- $expectedOutput = require __DIR__ . '/_files/query_array_output.php';
- $this->assertEquals($outputConfigElement->getName(), $expectedOutput['ProductLinksInterface']['name']);
- $this->assertEquals(
- $outputConfigElement->getTypeResolver(),
- $expectedOutput['ProductLinksInterface']['typeResolver']
- );
- $this->assertEquals(
- $outputConfigElement->getDescription(),
- $expectedOutput['ProductLinksInterface']['description']
- );
- }
- /**
- * @param array $actualResponse
- * @param array $assertionMap ['response_field_name' => 'response_field_value', ...]
- * OR [['response_field' => $field, 'expected_value' => $value], ...]
- */
- private function assertResponseFields($actualResponse, $assertionMap)
- {
- foreach ($assertionMap as $key => $assertionData) {
- $expectedValue = isset($assertionData['expected_value'])
- ? $assertionData['expected_value']
- : $assertionData;
- $responseField = isset($assertionData['response_field']) ? $assertionData['response_field'] : $key;
- $this->assertNotNull(
- $expectedValue,
- "Value of '{$responseField}' field must not be NULL"
- );
- $this->assertEquals(
- $expectedValue,
- $actualResponse[$responseField],
- "Value of '{$responseField}' field in response does not match expected value: "
- . var_export($expectedValue, true)
- );
- }
- }
- /**
- * {@inheritdoc}
- */
- protected function tearDown()
- {
- /** @var ObjectManagerInterface $objectManager */
- $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
- /** @var Cache $cache */
- $cache = $objectManager->get(Cache::class);
- $cache->clean();
- }
- }
|