graphql_core_schema-1.0.x-dev/tests/src/Kernel/ComplexSchemaBuilding.php

tests/src/Kernel/ComplexSchemaBuilding.php
<?php

// phpcs:disable Drupal.NamingConventions.ValidVariableName.LowerStart

namespace Drupal\Tests\graphql_core_schema\Kernel;

use Drupal\node\Entity\NodeType;

/**
 * Tests schema building with extensions.
 *
 * @group graphql_core_schema
 */
class ComplexSchemaBuilding extends CoreComposableKernelTestBase {

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();
    $this->enableModules(['graphql_core_schema_test']);
  }

  /**
   * Test that existing types and interfaces are merged when defined in base definition files.
   */
  public function testExtendedInterface(): void {
    NodeType::create(['type' => 'article'])->save();

    $server = $this
      ->getCoreComposableServerBuilder()
      ->enableValueFields()
      ->enableExtension('extend_node')
      ->enableEntityType('node', [], ['article'])
      ->createServer();

    $schema = $this->getSchema($server);
    /** @var \GraphQL\Type\Definition\InterfaceType $Node */
    $Node = $schema->getType('Node');
    $this->assertTrue($Node->hasField('fieldFromExtension'), 'Has field added by a schema extension.');
    $this->assertTrue($Node->hasField('id'), 'Has field added by schema builder.');

    /** @var \GraphQL\Type\Definition\ObjectType $NodeArticle */
    $NodeArticle = $schema->getType('NodeArticle');
    $this->assertTrue($NodeArticle->hasField('regularExtendedField'));
  }

  /**
   * Test that multiple existing types and interfaces are merged when defined in base definition files.
   */
  public function testMultipleExtendedInterface(): void {
    NodeType::create(['type' => 'article'])->save();

    $server = $this
      ->getCoreComposableServerBuilder()
      ->enableValueFields()
      ->enableExtension('extend_node')
      ->enableExtension('extend_multiple')
      ->enableEntityType('node', [], ['article'])
      ->enableEntityType('user')
      ->createServer();

    $schema = $this->getSchema($server);

    /** @var \GraphQL\Type\Definition\InterfaceType $Node */
    $Node = $schema->getType('Node');
    $this->assertTrue($Node->hasField('fieldFromExtension'));
    $this->assertTrue($Node->hasField('anotherExtendedField'));
    $this->assertTrue($Node->hasField('id'), 'Has field added by schema builder.');

    /** @var \GraphQL\Type\Definition\InterfaceType $EntityPaywalled */
    $EntityPaywalled = $schema->getType('EntityPaywalled');
    $this->assertNotNull($EntityPaywalled);
    $this->assertTrue($EntityPaywalled->hasField('isPaywalled'), 'Has field added by schema extension.');
    $this->assertTrue($EntityPaywalled->hasField('id'), 'Has field inherited by interface.');
    $this->assertTrue($Node->implementsInterface($EntityPaywalled), 'Implements interface added by schema extension.');
    $this->assertTrue($Node->implementsInterface($schema->getType('EntityLinkable')), 'Implements interface added by implementing other interface.');
    $this->assertTrue($Node->hasField('isPaywalled'), 'Has field added from interface added by schema extension.');

    /** @var \GraphQL\Type\Definition\InterfaceType $User */
    $User = $schema->getType('User');
    $this->assertTrue($User->hasField('fieldOnUser'));
  }

  /**
   * Test extending a non-entity interface.
   */
  public function testExtendNonEntityInterface(): void {
    NodeType::create(['type' => 'article'])->save();

    $server = $this
      ->getCoreComposableServerBuilder()
      ->enableValueFields()
      ->enableExtension('field_item')
      ->enableEntityType('node', ['nid'], ['article'])
      ->createServer();

    $schema = $this->getSchema($server);

    /** @var \GraphQL\Type\Definition\InterfaceType $Node */
    $Node = $schema->getType('Node');
    $this->assertTrue($Node->hasField('nid'));

    /** @var \GraphQL\Type\Definition\InterfaceType $FieldItemType */
    $FieldItemType = $schema->getType('FieldItemType');
    $this->assertTrue($FieldItemType->hasField('customFieldItemField'));
    $this->assertEquals('NodeArticle', $FieldItemType->getField('customFieldItemField')->getType()->name);
  }

  /**
   * Test that types unrelated to core schema types remain untouched.
   */
  public function testUnrelatedTypes(): void {
    NodeType::create(['type' => 'article'])->save();

    $server = $this
      ->getCoreComposableServerBuilder()
      ->enableValueFields()
      ->enableExtension('fruits')
      ->enableEntityType('node', ['nid'], ['article'])
      ->createServer();

    $schema = $this->getSchema($server);

    /** @var \GraphQL\Type\Definition\InterfaceType $Fruit */
    $Fruit = $schema->getType('Fruit');
    $this->assertNotNull($Fruit);
    $this->assertTrue($Fruit->hasField('color'));
    $this->assertEquals('A fruit.', $Fruit->description);

    /** @var \GraphQL\Type\Definition\ObjectType $Apple */
    $Apple = $schema->getType('Apple');
    $this->assertNotNull($Apple);
    $this->assertTrue($Apple->hasField('color'));
    $this->assertTrue($Apple->hasField('sweetness'));
    $this->assertEquals('A round fruit.', $Apple->description);

    /** @var \GraphQL\Type\Definition\ObjectType $Banana */
    $Banana = $schema->getType('Banana');
    $this->assertNotNull($Apple);
    $this->assertTrue($Banana->hasField('color'));
    $this->assertTrue($Banana->hasField('brand'));
    $this->assertEquals('An elongated fruit.', $Banana->description);

    /** @var \GraphQL\Type\Definition\EnumType $Color */
    $Color = $schema->getType('Color');
    $this->assertNotNull($Color);
    $this->assertEquals('The color.', $Color->description);
    $values = [
      'RED' => 'Red.',
      'GREEN' => 'Green.',
      'YELLOW' => 'Yellow.',
    ];

    foreach ($values as $name => $description) {
      $value = $Color->getValue($name);
      $this->assertNotNull($value);
      $this->assertEquals($description, $value->description);
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc