class LayoutBuilderBlockContentDependencyTest

Test for installing Layout Builder before Block Content in the same request.

@group layout_builder

Hierarchy

Expanded class hierarchy of LayoutBuilderBlockContentDependencyTest

File

core/modules/layout_builder/tests/src/Kernel/LayoutBuilderBlockContentDependencyTest.php, line 14

Namespace

Drupal\Tests\layout_builder\Kernel
View source
class LayoutBuilderBlockContentDependencyTest extends KernelTestBase {
    
    /**
     * Test that block_content can be successfully installed after layout_builder.
     *
     * The InlineBlock plugin class in layout_builder uses
     * RefinableDependentAccessTrait, which used to live in block_content, though
     * block_content is not a layout_builder dependency. Since the BlockContent
     * entity type class also uses the same trait, if, in order and in the same
     * request:
     * 1. layout_builder is installed first without block_content
     * 2. block plugins are discovered
     * 3. block_content is installed,
     * a fatal error can occur, because the trait was missing before block_content
     * is installed and gets aliased to an empty trait. When the installation of
     * the block_content module installs the BlockContent entity type, the empty
     * trait is missing the methods that need to be implemented from the
     * interface.
     *
     * @see \Drupal\Component\Plugin\Discovery\AttributeClassDiscovery
     * @see \Drupal\Component\Discovery\MissingClassDetectionClassLoader
     */
    public function testInstallLayoutBuilderAndBlockContent() : void {
        $this->assertFalse(\Drupal::moduleHandler()->moduleExists('block_content'));
        // Prevent classes in the block_content modules from being loaded before the
        // module is installed.
        $this->classLoader
            ->setPsr4("Drupal\\block_content\\", '');
        // Install test module that will act on layout_builder being installed and
        // at that time does block plugin discovery first, then installs
        // block_content.
        \Drupal::service('module_installer')->install([
            'layout_builder_block_content_dependency_test',
        ]);
        \Drupal::service('module_installer')->install([
            'layout_builder',
        ]);
        $this->assertTrue(\Drupal::moduleHandler()->moduleExists('block_content'));
    }

}

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