Commit e1c311ca authored by Amarlata Kumari's avatar Amarlata Kumari Committed by Peter Pajor
Browse files

Issue #3277676: Entity translations excluded from dependency

parent 0222983f
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ use Drupal\depcalc\DependencyCalculatorEvents;
use Drupal\depcalc\DependentEntityWrapper;
use Drupal\depcalc\Event\CalculateEntityDependenciesEvent;
use Drupal\depcalc\FieldExtractor;
use Drupal\language\Entity\ContentLanguageSettings;

/**
 * Class EntityLanguage.
@@ -61,7 +62,7 @@ class EntityLanguage extends BaseDependencyCollector {
      foreach ($fields as $field) {
        /** @var \Drupal\language\Entity\ContentLanguageSettings $settings */
        $settings = \Drupal::entityTypeManager()->getStorage('language_content_settings')->load("{$entity->getEntityTypeId()}.{$entity->bundle()}");
        if (!$settings || !$settings->status() || !$settings->isLanguageAlterable()) {
        if (!$this->isContentTranslationEnabled($settings)) {
          return;
        }
        $settings_wrapper = new DependentEntityWrapper($settings);
@@ -81,6 +82,22 @@ class EntityLanguage extends BaseDependencyCollector {
    }
  }

  /**
   * Check when content translation is enabled.
   *
   * @param \Drupal\language\Entity\ContentLanguageSettings|null $settings
   *   The content translation setting.
   *
   * @return bool
   *   TRUE if content translation is enabled, FALSE otherwise.
   */
  protected function isContentTranslationEnabled(?ContentLanguageSettings $settings): bool {
    if (!$settings || !$settings->status() || !$settings->get('third_party_settings')) {
      return FALSE;
    }

    return $settings->get('third_party_settings')['content_translation']['enabled'] ?? FALSE;

  }

}
+136 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\Tests\depcalc\Kernel;

use Drupal\depcalc\DependencyStack;
use Drupal\depcalc\DependentEntityWrapper;
use Drupal\KernelTests\KernelTestBase;
use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\language\Entity\ContentLanguageSettings;
use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
use Drupal\Tests\node\Traits\NodeCreationTrait;

/**
 * Class EntityLanguageTest.
 *
 * Test language dependency in node.
 *
 * @group depcalc
 */
class EntityLanguageTest extends KernelTestBase {

  use ContentTypeCreationTrait;
  use NodeCreationTrait;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'content_translation',
    'depcalc',
    'field',
    'filter',
    'node',
    'system',
    'user',
    'language',
    'text',
  ];

  /**
   * Calculates all the dependencies of a given entity.
   *
   * @var \Drupal\depcalc\DependencyCalculator
   */
  protected $calculator;

  /**
   * Node object.
   *
   * @var \Drupal\node\Entity\Node
   */
  protected $node;

  /**
   * Language object.
   *
   * @var \Drupal\Core\Language
   */
  protected $language;


  /**
   * Dependencies uuids.
   *
   * @var array
   */
  protected $dependencies;

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

    $this->installConfig(['language', 'field', 'filter', 'node', 'system']);

    $this->installSchema('node', 'node_access');
    $this->installSchema('system', 'sequences');

    $this->installEntitySchema('node_type');
    $this->installEntitySchema('node');
    $this->installEntitySchema('user');

    $this->language = ConfigurableLanguage::load('en');
    $this->calculator = $this->container->get('entity.dependency.calculator');

    $this->createContentType([
      'type' => 'article',
      'name' => 'article',
    ]);

    $this->node = $this->createNode([
      'type' => 'article',
      'language' => 'en',
    ]);
  }

  /**
   * Tests node dependencies when entity translation is not enabled.
   */
  public function testEntityTranslationNotEnabled(): void {
    $this->runEntityTranslationTest();
    $this->assertArrayNotHasKey($this->language->uuid(), $this->dependencies);
  }

  /**
   * Tests node dependencies when entity translation is enabled.
   *
   * @throws \Drupal\Core\Entity\EntityStorageException
   */
  public function testEntityTranslationEnabled(): void {

    $contentLanguageSettings = ContentLanguageSettings::loadByEntityTypeBundle('node', 'article');
    $contentLanguageSettings->setThirdPartySetting('content_translation', 'enabled', TRUE)
      ->save();
    $this->runEntityTranslationTest();
    $this->assertArrayHasKey($this->language->uuid(), $this->dependencies);
  }

  /**
   * Calculate entity dependencies.
   */
  protected function runEntityTranslationTest() {
    try {
      $wrapper = new DependentEntityWrapper($this->node);
    }
    catch (\Exception $exception) {
      $this->markTestIncomplete($exception->getMessage());
    }

    $this->calculator->calculateDependencies($wrapper, new DependencyStack());
    $this->dependencies = $wrapper->getDependencies();

  }

}
+3 −2
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ class ConfigEntityDependencyCollectorTest extends KernelTestBase {
   */
  public static $modules = [
    'breakpoint',
    'content_translation',
    'depcalc',
    'field',
    'filter',
@@ -131,7 +132,7 @@ class ConfigEntityDependencyCollectorTest extends KernelTestBase {
      new DependencyStack()
    );
    $contentLanguageSettings->setDefaultLangcode('cs')
      ->setLanguageAlterable(FALSE)
      ->setThirdPartySetting('content_translation', 'enabled', FALSE)
      ->save();

    $this->assertArrayNotHasKey($csLanguage->uuid(), $csDependencies);
@@ -139,7 +140,7 @@ class ConfigEntityDependencyCollectorTest extends KernelTestBase {
    $this->assertArrayNotHasKey($contentLanguageSettings->uuid(), $csDependencies);

    $contentLanguageSettings->setDefaultLangcode('cs')
      ->setLanguageAlterable(TRUE)
      ->setThirdPartySetting('content_translation', 'enabled', TRUE)
      ->save();

    $csNode = $this->createTestNode('cs');