Unverified Commit bb180f95 authored by Lee Rowlands's avatar Lee Rowlands
Browse files

Issue #3211072 by mstrelan: ModeratedContentController has an unlisted dependency on node.module

parent 8e58cdb8
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -6,9 +6,3 @@ content_moderation.content:
  title: 'Overview'
  route_name: system.admin_content
  parent_id: system.admin_content

content_moderation.moderated_content:
  title: 'Moderated content'
  route_name: content_moderation.admin_moderated_content
  parent_id: system.admin_content
  weight: 1
+1 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ content_moderation.admin_moderated_content:
    _controller: '\Drupal\content_moderation\Controller\ModeratedContentController::nodeListing'
    _title: 'Moderated content'
  requirements:
    _module_dependencies: 'node'
    _permission: 'view any unpublished content'

content_moderation.workflow_type_edit_form:
+25 −2
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Routing\RouterInterface;

/**
 * Generates moderation-related local tasks.
@@ -39,6 +40,13 @@ class DynamicLocalTasks extends DeriverBase implements ContainerDeriverInterface
   */
  protected $moderationInfo;

  /**
   * The router.
   *
   * @var \Symfony\Component\Routing\RouterInterface
   */
  protected $router;

  /**
   * Creates a FieldUiLocalTask object.
   *
@@ -50,12 +58,15 @@ class DynamicLocalTasks extends DeriverBase implements ContainerDeriverInterface
   *   The translation manager.
   * @param \Drupal\content_moderation\ModerationInformationInterface $moderation_information
   *   The moderation information service.
   * @param \Symfony\Component\Routing\RouterInterface $router
   *   The router.
   */
  public function __construct($base_plugin_id, EntityTypeManagerInterface $entity_type_manager, TranslationInterface $string_translation, ModerationInformationInterface $moderation_information) {
  public function __construct($base_plugin_id, EntityTypeManagerInterface $entity_type_manager, TranslationInterface $string_translation, ModerationInformationInterface $moderation_information, RouterInterface $router) {
    $this->entityTypeManager = $entity_type_manager;
    $this->stringTranslation = $string_translation;
    $this->basePluginId = $base_plugin_id;
    $this->moderationInfo = $moderation_information;
    $this->router = $router;
  }

  /**
@@ -66,7 +77,8 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
      $base_plugin_id,
      $container->get('entity_type.manager'),
      $container->get('string_translation'),
      $container->get('content_moderation.moderation_information')
      $container->get('content_moderation.moderation_information'),
      $container->get('router')
    );
  }

@@ -76,6 +88,17 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
  public function getDerivativeDefinitions($base_plugin_definition) {
    $this->derivatives = [];

    // Add the moderated content task if the route exists.
    if ($this->router->getRouteCollection()->get('content_moderation.admin_moderated_content') !== NULL) {
      $this->derivatives['content_moderation.moderated_content'] = [
        'route_name' => 'content_moderation.admin_moderated_content',
        'title' => $this->t('Moderated content'),
        'parent_id' => 'system.admin_content',
        'weight' => 1,
      ];
    }

    // Add the latest version tab to entities.
    $latest_version_entities = array_filter($this->entityTypeManager->getDefinitions(), function (EntityTypeInterface $type) {
      return $this->moderationInfo->canModerateEntitiesOfEntityType($type) && $type->hasLinkTemplate('latest-version');
    });
+71 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\Tests\content_moderation\Functional;

use Drupal\Tests\BrowserTestBase;

/**
 * Tests moderated content dynamic local task.
 *
 * @group content_moderation
 */
class ModeratedContentLocalTaskTest extends BrowserTestBase {

  /**
   * A user to test with.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $adminUser;

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

  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';

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

    $this->drupalPlaceBlock('local_tasks_block');

    $this->adminUser = $this->drupalCreateUser([
      'access administration pages',
      'access content overview',
      'view any unpublished content',
    ]);
  }

  /**
   * Tests the moderated content local task appears.
   */
  public function testModeratedContentLocalTask() {
    $this->drupalLogin($this->adminUser);

    // Verify the moderated content tab exists.
    $this->drupalGet('admin/content');
    $this->assertSession()->statusCodeEquals(200);
    $this->assertSession()->linkExists('Moderated content');

    // Uninstall the node module which should also remove the tab.
    $this->container->get('module_installer')->uninstall(['node']);

    // Verify the moderated content local task does not exist without the node
    // module installed.
    $this->drupalGet('admin/content');
    $this->assertSession()->statusCodeEquals(200);
    $this->assertSession()->linkNotExists('Moderated content');
  }

}