magento2-docker/dev/tests/integration/testsuite/Magento/Framework/GraphQl/GraphQlConfigTest.php

247 lines
12 KiB
PHP
Executable File

<?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\Cache;
use Magento\Framework\GraphQl\Config\Config;
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\ObjectManagerInterface;
/**
* Test of schema configuration reading and parsing
*/
class GraphQlConfigTest extends \PHPUnit\Framework\TestCase
{
/** @var \Magento\Framework\GraphQl\Config */
private $model;
protected function setUp(): void
{
/** @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();
$filePath1 = __DIR__ . '/_files/schemaC.graphqls';
$filePath2 = __DIR__ . '/_files/schemaD.graphqls';
$fileList = [
$filePath1 => file_get_contents($filePath1),
$filePath2 => file_get_contents($filePath2)
];
$fileResolverMock->expects($this->any())->method('get')->willReturn($fileList);
$graphQlReader = $objectManager->create(
\Magento\Framework\GraphQlSchemaStitching\GraphQlReader::class,
['fileResolver' => $fileResolverMock]
);
$reader = $objectManager->create(
// phpstan:ignore
\Magento\Framework\GraphQlSchemaStitching\Reader::class,
['readers' => ['graphql_reader' => $graphQlReader]]
);
$data = $objectManager->create(
// phpstan:ignore
\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()],
[
'response_field' => 'cache',
'expected_value' => $queryFields[$fieldKey]->getCache(),
'optional' => true
]
];
$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"
);
$optionalField = isset($assertionData['optional']) ? $assertionData['optional'] : false;
if (!$optionalField || isset($actualResponse[$responseField])) {
$this->assertEquals(
$expectedValue,
$actualResponse[$responseField],
"Value of '{$responseField}' field in response does not match expected value: "
. var_export($expectedValue, true)
);
}
}
}
/**
* {@inheritdoc}
*/
protected function tearDown(): void
{
/** @var ObjectManagerInterface $objectManager */
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
/** @var Cache $cache */
$cache = $objectManager->get(Cache::class);
$cache->clean();
}
}