247 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			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();
 | 
						|
    }
 | 
						|
}
 |