TypedDataResolverTest.php

Same filename and directory in other branches
  1. 4.0.x tests/src/Kernel/TypedDataResolverTest.php

Namespace

Drupal\Tests\ctools\Kernel

File

tests/src/Kernel/TypedDataResolverTest.php

View source
<?php

namespace Drupal\Tests\ctools\Kernel;

use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Plugin\Context\Context;
use Drupal\Core\Plugin\Context\ContextDefinition;
use Drupal\Core\Plugin\Context\EntityContextDefinition;
use Drupal\entity_test\Entity\EntityTest;
use Drupal\KernelTests\KernelTestBase;
use Drupal\user\Entity\User;

/**
 * @coversDefaultClass \Drupal\ctools\TypedDataResolver
 *
 * @group CTools
 */
class TypedDataResolverTest extends KernelTestBase {
  
  /**
   * Modules to enable.
   *
   * @var array
   */
  protected static $modules = [
    'user',
    'system',
    'entity_test',
    'ctools',
  ];
  
  /**
   * @var \Drupal\ctools\TypedDataResolver
   */
  protected $typedDataResolver;
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->installSchema('system', 'sequences');
    $this->installEntitySchema('user');
    $this->typedDataResolver = \Drupal::service('ctools.typed_data.resolver');
  }
  
  /**
   * Tests context extraction from properties.
   */
  public function testGetContextFromProperty() {
    // Create a user and test entity to extract context from.
    $user = User::create([
      'uid' => 2,
      'name' => 'username',
      'mail' => 'mail@example.org',
    ]);
    $user->enforceIsNew(TRUE);
    $user->save();
    $entity_test = EntityTest::create([
      'user_id' => $user->id(),
      'name' => 'Test name',
    ]);
    // Test the language property.
    $property_context = $this->assertPropertyPath($entity_test, 'langcode:language', 'language');
    $this->assertEquals('en', $property_context->getContextValue()
      ->getId());
    // Test the reference to the user.
    $property_context = $this->assertPropertyPath($entity_test, 'user_id:entity', 'entity:user');
    $this->assertEquals($user->id(), $property_context->getContextValue()
      ->id());
    // Test the reference to the name.
    $property_context = $this->assertPropertyPath($entity_test, 'name:value', 'string');
    $this->assertEquals('Test name', $property_context->getContextValue());
    // Test explicitly specifying the delta.
    $property_context = $this->assertPropertyPath($entity_test, 'name:0:value', 'string');
    $this->assertEquals('Test name', $property_context->getContextValue());
    // Test following the reference.
    $property_context = $this->assertPropertyPath($entity_test, 'user_id:entity:mail:value', 'email');
    $this->assertEquals('mail@example.org', $property_context->getContextValue());
  }
  
  /**
   * Asserts that a context for the given property path can be derived.
   *
   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
   *   The entity to test with.
   * @param string $property_path
   *   The property path to look for.
   * @param $expected_data_type
   *   The expected data type.
   *
   * @return \Drupal\Core\Plugin\Context\ContextInterface
   *   The context with a value.
   */
  protected function assertPropertyPath(ContentEntityInterface $entity, string $property_path, $expected_data_type) {
    $typed_data_entity = $entity->getTypedData();
    if (strpos($typed_data_entity->getDataDefinition()
      ->getDataType(), 'entity:') === 0) {
      $context_definition = new EntityContextDefinition($typed_data_entity->getDataDefinition()
        ->getDataType());
    }
    else {
      $context_definition = new ContextDefinition($typed_data_entity->getDataDefinition()
        ->getDataType());
    }
    $context_with_value = new Context($context_definition, $typed_data_entity);
    $context_without_value = new Context($context_definition);
    // Test the context without value.
    $property_context = $this->typedDataResolver
      ->getContextFromProperty($property_path, $context_without_value);
    $this->assertEquals($expected_data_type, $property_context->getContextDefinition()
      ->getDataType());
    // Test the context with value.
    $property_context = $this->typedDataResolver
      ->getContextFromProperty($property_path, $context_with_value);
    $this->assertEquals($expected_data_type, $property_context->getContextDefinition()
      ->getDataType());
    // Return the context with value so it can be asserted.
    return $property_context;
  }

}

Classes

Title Deprecated Summary
TypedDataResolverTest @coversDefaultClass \Drupal\ctools\TypedDataResolver[[api-linebreak]]