Security update for Core, with self-updated composer
[yaffs-website] / web / core / modules / field / tests / src / Kernel / EntityReference / EntityReferenceSettingsTest.php
index 780fe7ba12dcf0a8c6596023355fbfd56b89a110..2f8f13df8db51c3dad28b32f820e546d35aa76ce 100644 (file)
@@ -3,11 +3,14 @@
 namespace Drupal\Tests\field\Kernel\EntityReference;
 
 use Drupal\Component\Utility\Unicode;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\Logger\RfcLogLevel;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Tests\EntityReference\EntityReferenceTestTrait;
 use Drupal\node\Entity\NodeType;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\taxonomy\Entity\Vocabulary;
+use Symfony\Component\Debug\BufferingLogger;
 
 /**
  * Tests entity reference field settings.
@@ -44,6 +47,13 @@ class EntityReferenceSettingsTest extends KernelTestBase {
    */
   protected $customBundle;
 
+  /**
+   * The service name for a logger implementation that collects anything logged.
+   *
+   * @var string
+   */
+  protected $testLogServiceName = 'entity_reference_settings_test.logger';
+
   /**
    * {@inheritdoc}
    */
@@ -60,26 +70,38 @@ class EntityReferenceSettingsTest extends KernelTestBase {
     ]);
     $this->nodeType->save();
 
-    $this->vocabulary = Vocabulary::create([
-      'vid' => Unicode::strtolower($this->randomMachineName()),
-      'name' => $this->randomString(),
-    ]);
-    $this->vocabulary->save();
-
     // Create a custom bundle.
     $this->customBundle = 'test_bundle_' . Unicode::strtolower($this->randomMachineName());
     entity_test_create_bundle($this->customBundle, NULL, 'entity_test');
+
+    // Prepare the logger for collecting the expected critical error.
+    $this->container->get($this->testLogServiceName)->cleanLogs();
   }
 
   /**
    * Tests that config bundle deletions are mirrored in field config settings.
    */
   public function testConfigTargetBundleDeletion() {
+    // Create two vocabularies.
+    /** @var \Drupal\taxonomy\Entity\Vocabulary[] $vocabularies */
+    $vocabularies = [];
+    for ($i = 0; $i < 2; $i++) {
+      $vid = Unicode::strtolower($this->randomMachineName());
+      $vocabularies[$i] = Vocabulary::create([
+        'name' => $this->randomString(),
+        'vid' => $vid,
+      ]);
+      $vocabularies[$i]->save();
+    }
     // Attach an entity reference field to $this->nodeType.
     $name = Unicode::strtolower($this->randomMachineName());
     $label = $this->randomString();
-    $vid = $this->vocabulary->id();
-    $handler_settings = ['target_bundles' => [$vid => $vid]];
+    $handler_settings = [
+      'target_bundles' => [
+        $vocabularies[0]->id() => $vocabularies[0]->id(),
+        $vocabularies[1]->id() => $vocabularies[1]->id(),
+      ],
+    ];
     $this->createEntityReferenceField('node', $this->nodeType->id(), $name, $label, 'taxonomy_term', 'default', $handler_settings);
 
     // Check that the 'target_bundle' setting contains the vocabulary.
@@ -88,13 +110,32 @@ class EntityReferenceSettingsTest extends KernelTestBase {
     $this->assertEqual($handler_settings, $actual_handler_settings);
 
     // Delete the vocabulary.
-    $this->vocabulary->delete();
+    $vocabularies[0]->delete();
+    // Ensure that noting is logged.
+    $this->assertEmpty($this->container->get($this->testLogServiceName)->cleanLogs());
 
     // Check that the deleted vocabulary is no longer present in the
     // 'target_bundles' field setting.
     $field_config = FieldConfig::loadByName('node', $this->nodeType->id(), $name);
     $handler_settings = $field_config->getSetting('handler_settings');
-    $this->assertTrue(empty($handler_settings['target_bundles']));
+    $this->assertEquals([$vocabularies[1]->id() => $vocabularies[1]->id()], $handler_settings['target_bundles']);
+
+    // Delete the other vocabulary.
+    $vocabularies[1]->delete();
+    // Ensure that field_field_config_presave() logs the expected critical
+    // error.
+    $log_message = $this->container->get($this->testLogServiceName)->cleanLogs()[0];
+    $this->assertEquals(RfcLogLevel::CRITICAL, $log_message[0]);
+    $this->assertEquals('The %field_name entity reference field (entity_type: %entity_type, bundle: %bundle) no longer has any valid bundle it can reference. The field is not working correctly anymore and has to be adjusted.', $log_message[1]);
+    $this->assertEquals($field_config->getName(), $log_message[2]['%field_name']);
+    $this->assertEquals('node', $log_message[2]['%entity_type']);
+    $this->assertEquals($this->nodeType->id(), $log_message[2]['%bundle']);
+
+    // Check that the deleted bundle is no longer present in the
+    // 'target_bundles' field setting.
+    $field_config = FieldConfig::loadByName('node', $this->nodeType->id(), $name);
+    $handler_settings = $field_config->getSetting('handler_settings');
+    $this->assertEquals([], $handler_settings['target_bundles']);
   }
 
   /**
@@ -115,6 +156,15 @@ class EntityReferenceSettingsTest extends KernelTestBase {
     // Delete the custom bundle.
     entity_test_delete_bundle($this->customBundle, 'entity_test');
 
+    // Ensure that field_field_config_presave() logs the expected critical
+    // error.
+    $log_message = $this->container->get($this->testLogServiceName)->cleanLogs()[0];
+    $this->assertEquals(RfcLogLevel::CRITICAL, $log_message[0]);
+    $this->assertEquals('The %field_name entity reference field (entity_type: %entity_type, bundle: %bundle) no longer has any valid bundle it can reference. The field is not working correctly anymore and has to be adjusted.', $log_message[1]);
+    $this->assertEquals($field_config->getName(), $log_message[2]['%field_name']);
+    $this->assertEquals('node', $log_message[2]['%entity_type']);
+    $this->assertEquals($this->nodeType->id(), $log_message[2]['%bundle']);
+
     // Check that the deleted bundle is no longer present in the
     // 'target_bundles' field setting.
     $field_config = FieldConfig::loadByName('node', $this->nodeType->id(), $name);
@@ -122,4 +172,14 @@ class EntityReferenceSettingsTest extends KernelTestBase {
     $this->assertTrue(empty($handler_settings['target_bundles']));
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function register(ContainerBuilder $container) {
+    parent::register($container);
+    $container
+      ->register($this->testLogServiceName, BufferingLogger::class)
+      ->addTag('logger');
+  }
+
 }