316 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			316 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\GraphQl;
 | 
						|
 | 
						|
use Magento\Framework\GraphQl\Schema\Type\InputObjectType;
 | 
						|
use Magento\Framework\GraphQl\Schema\Type\ObjectType;
 | 
						|
use Magento\Framework\GraphQl\Type\TypeManagement;
 | 
						|
use Magento\Framework\ObjectManagerInterface;
 | 
						|
 | 
						|
class GraphQlIntrospectionTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /** @var \Magento\Framework\GraphQl\SchemaFactory */
 | 
						|
    private $schemaFactory;
 | 
						|
 | 
						|
    /** @var  ObjectManagerInterface */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
 | 
						|
        $this->schemaFactory = $this->objectManager->get(\Magento\Framework\GraphQl\SchemaFactory::class);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testIntrospectionQuery()
 | 
						|
    {
 | 
						|
        $typeManagement = new TypeManagement();
 | 
						|
        $typeManagement->overrideStandardGraphQLTypes();
 | 
						|
        $emptySchema = $this->schemaFactory->create(
 | 
						|
            [
 | 
						|
                'query' => new ObjectType(
 | 
						|
                    [
 | 
						|
                        'name' => 'Query',
 | 
						|
                        'description' =>'Description at type level',
 | 
						|
                        'fields' => ['a' => \GraphQL\Type\Definition\Type::string()]
 | 
						|
                    ]
 | 
						|
                )
 | 
						|
            ]
 | 
						|
        );
 | 
						|
        $request =
 | 
						|
            <<<QUERY
 | 
						|
query IntrospectionQuery {
 | 
						|
__schema {
 | 
						|
queryType { name }
 | 
						|
types{
 | 
						|
...FullType
 | 
						|
}
 | 
						|
}
 | 
						|
}
 | 
						|
fragment FullType on __Type{
 | 
						|
name
 | 
						|
description
 | 
						|
kind
 | 
						|
fields(includeDeprecated:true){
 | 
						|
name
 | 
						|
args{
 | 
						|
...InputValue
 | 
						|
}
 | 
						|
 }
 | 
						|
}
 | 
						|
 | 
						|
fragment TypeRef on __Type {
 | 
						|
kind
 | 
						|
name
 | 
						|
ofType{
 | 
						|
kind
 | 
						|
name
 | 
						|
}
 | 
						|
}
 | 
						|
fragment InputValue on __InputValue {
 | 
						|
name
 | 
						|
description
 | 
						|
type { ...TypeRef }
 | 
						|
defaultValue
 | 
						|
}
 | 
						|
QUERY;
 | 
						|
        $response = \GraphQL\GraphQL::executeQuery($emptySchema, $request);
 | 
						|
        $output = $response->toArray()['data']['__schema'];
 | 
						|
        $this->assertEquals('Query', $output['queryType']['name']);
 | 
						|
        $this->assertEquals($output['types'][0]['kind'], 'OBJECT');
 | 
						|
        $expectedFragment =
 | 
						|
            [
 | 
						|
                'name' => 'Query',
 | 
						|
                'description' => 'Description at type level',
 | 
						|
                'kind' => 'OBJECT',
 | 
						|
                'fields' => [
 | 
						|
                    [
 | 
						|
                        'name' => 'a',
 | 
						|
                        'args' => []
 | 
						|
                    ]
 | 
						|
                ]
 | 
						|
            ];
 | 
						|
        $this->assertContains($expectedFragment, $output['types']);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Tests an InputObjectType with NON Null field and description at Field level
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     */
 | 
						|
    public function testIntrospectsInputObjectWithNonNullInputField()
 | 
						|
    {
 | 
						|
        $testInputObject = new InputObjectType(
 | 
						|
            [
 | 
						|
                'name' => 'ProductFilterInput',
 | 
						|
                'fields' => [
 | 
						|
                    'attributeA' => [
 | 
						|
                        'type' => \GraphQL\Type\Definition\Type::nonNull(
 | 
						|
                            \GraphQL\Type\Definition\Type::string()
 | 
						|
                        ),
 | 
						|
                        'description' => 'testDescriptionForA'
 | 
						|
                    ],
 | 
						|
                    'attributeB' => [
 | 
						|
                        'type' => \GraphQL\Type\Definition\Type::listOf(
 | 
						|
                            \GraphQL\Type\Definition\Type::string()
 | 
						|
                        )
 | 
						|
                    ],
 | 
						|
                    'attributeC' => ['type' => \GraphQL\Type\Definition\Type::string(), 'defaultValue' => null],
 | 
						|
                    'attributeD' => [
 | 
						|
                        'type' => \GraphQL\Type\Definition\Type::string(),
 | 
						|
                        'defaultValue' => 'test',
 | 
						|
                        'description' => 'testDescriptionForD'
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ]
 | 
						|
        );
 | 
						|
        $TestType = new ObjectType([
 | 
						|
            'name' => 'Query',
 | 
						|
            'fields' => [
 | 
						|
                'field' => [
 | 
						|
                    'type' => \GraphQL\Type\Definition\Type::string(),
 | 
						|
                    'args' => ['complex' => ['type' => $testInputObject]],
 | 
						|
                    'resolve' => function ($args) {
 | 
						|
                        return json_encode($args['complex']);
 | 
						|
                    }
 | 
						|
                ]
 | 
						|
            ]
 | 
						|
        ]);
 | 
						|
        $testSchema = $this->schemaFactory->create(
 | 
						|
            ['query' => $TestType]
 | 
						|
        );
 | 
						|
 | 
						|
        $request =
 | 
						|
            <<<QUERY
 | 
						|
{
 | 
						|
        __schema {
 | 
						|
          types {
 | 
						|
            kind
 | 
						|
            name
 | 
						|
            inputFields {
 | 
						|
              name
 | 
						|
              description
 | 
						|
              type { ...TypeRef }
 | 
						|
              defaultValue
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
      fragment TypeRef on __Type {
 | 
						|
        kind
 | 
						|
        name
 | 
						|
        ofType {
 | 
						|
          kind
 | 
						|
          name
 | 
						|
          ofType {
 | 
						|
            kind
 | 
						|
            name
 | 
						|
            ofType {
 | 
						|
              kind
 | 
						|
              name
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
}
 | 
						|
QUERY;
 | 
						|
        $response = \GraphQL\GraphQL::executeQuery($testSchema, $request);
 | 
						|
        $expectedResult =
 | 
						|
            [
 | 
						|
                'kind'=> 'INPUT_OBJECT',
 | 
						|
                'name'=> 'ProductFilterInput',
 | 
						|
                'inputFields'=> [
 | 
						|
                    [
 | 
						|
                        'name'=> 'attributeA',
 | 
						|
                        'description'=> 'testDescriptionForA',
 | 
						|
                        'type'=> [
 | 
						|
                            'kind'=> 'NON_NULL',
 | 
						|
                            'name'=> null,
 | 
						|
                            'ofType'=> [
 | 
						|
                                'kind'=> 'SCALAR',
 | 
						|
                                'name'=> 'String',
 | 
						|
                                'ofType'=> null
 | 
						|
                            ]
 | 
						|
                        ],
 | 
						|
                        'defaultValue'=> null
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'name'=> 'attributeB',
 | 
						|
                        'description'=> null,
 | 
						|
                        'type'=> [
 | 
						|
                            'kind'=> 'LIST',
 | 
						|
                            'name'=> null,
 | 
						|
                            'ofType'=> [
 | 
						|
                                'kind'=> 'SCALAR',
 | 
						|
                                'name'=> 'String',
 | 
						|
                                'ofType'=> null
 | 
						|
                            ]
 | 
						|
                        ],
 | 
						|
                        'defaultValue'=> null
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'name'=> 'attributeC',
 | 
						|
                        'description'=> null,
 | 
						|
                        'type'=> [
 | 
						|
                            'kind'=> 'SCALAR',
 | 
						|
                            'name'=> 'String',
 | 
						|
                            'ofType'=> null
 | 
						|
                        ],
 | 
						|
                        'defaultValue'=> 'null'
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'name'=> 'attributeD',
 | 
						|
                        'description'=> 'testDescriptionForD',
 | 
						|
                        'type'=> [
 | 
						|
                            'kind'=> 'SCALAR',
 | 
						|
                            'name'=> 'String',
 | 
						|
                            'ofType'=> null
 | 
						|
                        ],
 | 
						|
                        'defaultValue'=> '"test"'
 | 
						|
                    ]
 | 
						|
                ]
 | 
						|
            ];
 | 
						|
        $output = $response->toArray()['data']['__schema']['types'];
 | 
						|
        $this->assertContains($expectedResult, $output);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     */
 | 
						|
    public function testIntrospectsIncludeTheDeprecatedParameter()
 | 
						|
    {
 | 
						|
        $testSchema = $this->schemaFactory->create(
 | 
						|
            [
 | 
						|
                'query' => new ObjectType(
 | 
						|
                    [
 | 
						|
                    'name' => 'Query',
 | 
						|
                    'fields' => [
 | 
						|
                       'deprecated' => [
 | 
						|
                         'type' => \GraphQL\Type\Definition\Type::string(),
 | 
						|
                         'deprecationReason' =>'Deprecated in an older version'
 | 
						|
                       ],
 | 
						|
                         'nonDeprecated' => [
 | 
						|
                            'type' => \GraphQL\Type\Definition\Type::string()
 | 
						|
                         ]
 | 
						|
                    ]
 | 
						|
                    ]
 | 
						|
                )
 | 
						|
              ]
 | 
						|
        );
 | 
						|
        $request =
 | 
						|
            <<<QUERY
 | 
						|
 {
 | 
						|
  __type(name:"Query")
 | 
						|
    {
 | 
						|
    name
 | 
						|
      kind
 | 
						|
    fields(includeDeprecated:true){
 | 
						|
      name
 | 
						|
      type{
 | 
						|
        kind
 | 
						|
        name
 | 
						|
      }
 | 
						|
      description
 | 
						|
      isDeprecated
 | 
						|
      deprecationReason
 | 
						|
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
QUERY;
 | 
						|
        $response = \GraphQL\GraphQL::executeQuery($testSchema, $request);
 | 
						|
        $output = $response->toArray()['data']['__type'];
 | 
						|
        $expectedResult =
 | 
						|
            [
 | 
						|
                "name" =>"Query",
 | 
						|
                "kind" =>"OBJECT",
 | 
						|
                "fields" => [
 | 
						|
           [
 | 
						|
            'name'=> 'deprecated',
 | 
						|
            'type'=> [
 | 
						|
                'kind'=> 'SCALAR',
 | 
						|
                'name'=> 'String'
 | 
						|
            ],
 | 
						|
            'description'=> null,
 | 
						|
            'isDeprecated'=> true,
 | 
						|
            'deprecationReason'=> 'Deprecated in an older version'
 | 
						|
           ],
 | 
						|
           [
 | 
						|
            'name'=> 'nonDeprecated',
 | 
						|
            'type'=> [
 | 
						|
                'kind'=> 'SCALAR',
 | 
						|
                'name'=> 'String'
 | 
						|
            ],
 | 
						|
            'description'=> null,
 | 
						|
            'isDeprecated'=> false,
 | 
						|
            'deprecationReason'=> null
 | 
						|
           ]
 | 
						|
                ]
 | 
						|
                ];
 | 
						|
        $this->assertEquals($expectedResult, $output);
 | 
						|
    }
 | 
						|
}
 |