function AttributeClassDiscoveryCachedTest::testGetDefinitionsMissingTrait

Same name and namespace in other branches
  1. 11.x core/tests/Drupal/Tests/Component/Plugin/Attribute/AttributeClassDiscoveryCachedTest.php \Drupal\Tests\Component\Plugin\Attribute\AttributeClassDiscoveryCachedTest::testGetDefinitionsMissingTrait()

Tests discovery with missing traits.

File

core/tests/Drupal/Tests/Component/Plugin/Attribute/AttributeClassDiscoveryCachedTest.php, line 103

Class

AttributeClassDiscoveryCachedTest
Tests Attribute Class Discovery Cached.

Namespace

Drupal\Tests\Component\Plugin\Attribute

Code

public function testGetDefinitionsMissingTrait() : void {
  // Path to the classes which we'll discover and parse annotation.
  $discovery_path = __DIR__ . "/../../../../../fixtures/plugins/Plugin";
  // Define file paths within the directory that should not be discovered.
  $non_discoverable_file_paths = [
    $discovery_path . '/PluginNamespace/AttributeDiscoveryTest2.php',
    $discovery_path . '/PluginNamespace/AttributeDiscoveryTestMissingInterface.php',
    $discovery_path . '/PluginNamespace/AttributeDiscoveryTestMissingTrait.php',
  ];
  $discovery = new AttributeClassDiscovery([
    'com\\example' => [
      $discovery_path,
    ],
  ]);
  $this->assertEquals([
    'discovery_test_1' => [
      'id' => 'discovery_test_1',
      'class' => 'com\\example\\PluginNamespace\\AttributeDiscoveryTest1',
    ],
  ], $discovery->getDefinitions());
  // Gain access to the file cache.
  $ref_file_cache = new \ReflectionProperty($discovery, 'fileCache');
  /** @var \Drupal\Component\FileCache\FileCacheInterface $file_cache */
  $file_cache = $ref_file_cache->getValue($discovery);
  // The plugins that extend a missing class, implement a missing interface,
  // and use a missing trait should not be cached.
  foreach ($non_discoverable_file_paths as $non_discoverable_file_path) {
    $this->assertTrue(file_exists($non_discoverable_file_path));
    $this->assertNull($file_cache->get($non_discoverable_file_path));
  }
  // Even when the missing trait's namespace is added to the plugin
  // namespaces, the plugin with the missing trait is still not discovered
  // because PHP cannot load a class that uses a non-existent trait.
  $discovery = new AttributeClassDiscovery([
    'com\\example' => [
      $discovery_path,
    ],
    'Drupal\\a_module_that_does_not_exist' => [
      $discovery_path,
    ],
  ]);
  $this->assertEquals([
    'discovery_test_1' => [
      'id' => 'discovery_test_1',
      'class' => 'com\\example\\PluginNamespace\\AttributeDiscoveryTest1',
    ],
  ], $discovery->getDefinitions());
  // The plugins that extend a missing class, implement a missing interface,
  // and use a missing trait should not be cached.
  foreach ($non_discoverable_file_paths as $non_discoverable_file_path) {
    $this->assertTrue(file_exists($non_discoverable_file_path));
    $this->assertNull($file_cache->get($non_discoverable_file_path));
  }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.