scheduled_publish-8.x-3.9/tests/src/Kernel/FormatterTest.php

tests/src/Kernel/FormatterTest.php
<?php

namespace Drupal\Tests\scheduled_publish\Kernel;

use Drupal\Core\Entity\Entity\EntityViewDisplay;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Render\RendererInterface;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\node\Entity\Node;
use Drupal\node\Entity\NodeType;
use Drupal\scheduled_publish\Service\ScheduledPublishCron;
use Drupal\Tests\field\Kernel\FieldKernelTestBase;
use Drupal\workflows\Entity\Workflow;

/**
 * Test the scheduled publish formatter.
 *
 * @package Drupal\Tests\scheduled_publish\Kernel
 * @group scheduled_publish
 */
class FormatterTest extends FieldKernelTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'node',
    'taxonomy',
    'scheduled_publish',
    'content_moderation',
    'workflows',
    'datetime',
    'user',
    'language',
    'config_translation',
    'locale',
  ];

  /**
   * The scheduled update service.
   *
   * @var \Drupal\scheduled_publish\Service\ScheduledPublishCron
   */
  private ScheduledPublishCron $scheduledUpdateService;

  /**
   * Language manager.
   *
   * @var \Drupal\Core\Language\LanguageManagerInterface
   */
  private LanguageManagerInterface $languageManager;

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();
    $this->setInstallProfile('standard');
    $this->installConfig([
      'field',
      'system',
      'content_moderation',
      'scheduled_publish',
      'language',
      'locale',
    ]);

    $this->installEntitySchema('node');
    $this->installEntitySchema('user');
    $this->installSchema('node', 'node_access');
    $this->installEntitySchema('user');
    $this->installEntitySchema('content_moderation_state');
    $this->installConfig('content_moderation');
    $this->installSchema('locale', [
      'locales_location',
      'locales_source',
      'locales_target',
    ]);

    $this->scheduledUpdateService = \Drupal::service('scheduled_publish.update');
    $this->createNodeType();

    $this->languageManager = \Drupal::languageManager();

    // Add France translation.
    ConfigurableLanguage::createFromLangcode('fr')->save();
    $configLanguageOverride = $this->container->get('language_manager')->getLanguageConfigOverride('fr', 'workflows.workflow.editorial');

    $configLanguageOverride
      ->set('type_settings.states.draft.label', 'Brouillon')
      ->set('type_settings.states.published.label', 'Publié')
      ->save();
  }

  /**
   * Creates a page node type to test with, ensuring that it's moderated.
   */
  protected function createNodeType() {
    $field_storage = FieldStorageConfig::create([
      'field_name' => 'field_scheduled_publish',
      'type' => 'scheduled_publish',
      'entity_type' => 'node',
    ]);

    $field_storage->save();

    $node_type = NodeType::create([
      'type' => 'page',
      'name' => 'page',
    ]);
    $node_type->save();

    FieldConfig::create([
      'entity_type' => 'node',
      'field_name' => 'field_scheduled_publish',
      'bundle' => 'page',
      'label' => 'Test field',
    ])->save();

    $workflow = Workflow::load('editorial');
    /** @var \Drupal\content_moderation\Plugin\WorkflowType\ContentModerationInterface $contentModeration */
    $contentModeration = $workflow->getTypePlugin();
    $contentModeration->addEntityTypeAndBundle('node', 'page');
    $workflow->save();
  }

  /**
   * Test the rendered output.
   *
   * @dataProvider workflowStateLabelDataProvider
   */
  public function testRenderOutput(string $langcode, string $expected_label):void {
    $this->languageManager->setConfigOverrideLanguage(
      $this->languageManager->getLanguage($langcode)
    );

    $display = EntityViewDisplay::create([
      'targetEntityType' => 'node',
      'bundle' => 'page',
      'mode' => 'default',
      'status' => TRUE,
    ]);

    $display_options = [
      'label' => 'above',
      'type' => 'scheduled_publish_generic_formatter',
      'settings' => [
        'date_format' => 'html_date',
        'text_pattern' => '%moderation_state% ------ %date%',
      ],
    ];
    $display->setComponent('field_scheduled_publish', $display_options);

    $display->save();
    $page = Node::create([
      'type' => 'page',
      'title' => 'A',
      'uid' => 1,
    ]);

    $page->moderation_state->value = 'draft';
    $page->set('field_scheduled_publish', [
      'moderation_state' => 'published',
      'value' => '2021-01-31T00:00:00',
    ]);
    $page->save();

    $nodeID = $page->id();

    $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
    $storage = \Drupal::entityTypeManager()->getStorage('node');
    $node = $storage->load($nodeID);
    $build = $view_builder->view($node, 'default');

    if (method_exists(RendererInterface::class, 'renderPlain')) {
      // @phpstan-ignore-next-line as it is deprecated in D10.3 and removed from D12.
      $output = \Drupal::service('renderer')->renderPlain($build);
    }
    else {
      $output = \Drupal::service('renderer')->renderInIsolation($build);
    }

    self::assertTrue((bool) $nodeID);
    self::assertNotFalse(strpos($output, "<div>$expected_label ------ 2021-01-31</div>"));

    $this->scheduledUpdateService->doUpdate();

    Node::load($nodeID);
  }

  /**
   * Provides cases with expected workflow state labels in different languages.
   *
   * @return array
   *   A list of test cases.
   */
  public static function workflowStateLabelDataProvider() {
    return [
      [
        'langcode' => 'en',
        'expected_label' => 'Published',
      ],
      [
        'langcode' => 'fr',
        'expected_label' => 'Publié',
      ],
    ];
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc