Unverified Commit 6d982d1e authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3182716 by thejimbirch, godotislate, phenaproxima, alexpott, primsi,...

Issue #3182716 by thejimbirch, godotislate, phenaproxima, alexpott, primsi, berdir, smustgrave, larowlan, nicxvan: block_theme_initialize should not create blocks during config sync
parent 53f117df
Loading
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -92,6 +92,10 @@ function block_page_top(array &$page_top) {
 * @see block_modules_installed()
 */
function block_themes_installed($theme_list) {
  // Do not create blocks during config sync.
  if (\Drupal::service('config.installer')->isSyncing()) {
    return;
  }
  // Disable this functionality prior to install profile installation because
  // block configuration is often optional or provided by the install profile
  // itself. block_theme_initialize() will be called when the install profile is
@@ -151,7 +155,12 @@ function block_theme_initialize($theme) {
 *
 * @see block_themes_installed()
 */
function block_modules_installed($modules) {
function block_modules_installed($modules, bool $is_syncing) {
  // Do not create blocks during config sync.
  if ($is_syncing) {
    return;
  }

  // block_themes_installed() does not call block_theme_initialize() during site
  // installation because block configuration can be optional or provided by the
  // profile. Now, when the profile is installed, this configuration exists,
+86 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace Drupal\Tests\block\Kernel;

use Drupal\Core\Config\ConfigInstallerInterface;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Extension\ThemeInstallerInterface;
use Drupal\KernelTests\KernelTestBase;
use Drupal\block\Entity\Block;

/**
 * Tests that blocks are not created during config sync.
 *
 * @group block
 */
class BlockConfigSyncTest extends KernelTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = ['block', 'system'];

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    \Drupal::service(ThemeInstallerInterface::class)
      ->install(['stark', 'claro']);

    // Delete all existing blocks.
    foreach (Block::loadMultiple() as $block) {
      $block->delete();
    }

    // Set the default theme.
    $this->config('system.theme')
      ->set('default', 'stark')
      ->save();

    // Create a block for the default theme to be copied later.
    Block::create([
      'id' => 'test_block',
      'plugin' => 'system_powered_by_block',
      'region' => 'content',
      'theme' => 'stark',
    ])->save();
  }

  /**
   * {@inheritdoc}
   */
  public function register(ContainerBuilder $container): void {
    parent::register($container);
    $container->setParameter('install_profile', 'testing');
  }

  /**
   * Tests blocks are not created during config sync.
   *
   * @param bool $syncing
   *   Whether or not config is syncing when the hook is invoked.
   * @param string|null $expected_block_id
   *   The expected ID of the block that should be created, or NULL if no block
   *   should be created.
   *
   * @testWith [true, null]
   *   [false, "claro_test_block"]
   */
  public function testNoBlocksCreatedDuringConfigSync(bool $syncing, ?string $expected_block_id): void {
    \Drupal::service(ConfigInstallerInterface::class)
      ->setSyncing($syncing);

    // Invoke the hook that should skip block creation due to config sync.
    \Drupal::moduleHandler()->invoke('block', 'themes_installed', [['claro']]);
    // This should hold true if the "current" install profile triggers an
    // invocation of hook_modules_installed().
    \Drupal::moduleHandler()->invoke('block', 'modules_installed', [['testing'], $syncing]);

    $this->assertSame($expected_block_id, Block::load('claro_test_block')?->id());
  }

}