X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Ffield%2Ftests%2Fsrc%2FKernel%2FEntityReference%2FEntityReferenceSettingsTest.php;fp=web%2Fcore%2Fmodules%2Ffield%2Ftests%2Fsrc%2FKernel%2FEntityReference%2FEntityReferenceSettingsTest.php;h=2f8f13df8db51c3dad28b32f820e546d35aa76ce;hp=780fe7ba12dcf0a8c6596023355fbfd56b89a110;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hpb=aea91e65e895364e460983b890e295aa5d5540a5 diff --git a/web/core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceSettingsTest.php b/web/core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceSettingsTest.php index 780fe7ba1..2f8f13df8 100644 --- a/web/core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceSettingsTest.php +++ b/web/core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceSettingsTest.php @@ -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'); + } + }