html_title-8.x-1.x-dev/tests/src/Functional/HtmlTitleTest.php

tests/src/Functional/HtmlTitleTest.php
<?php

namespace Drupal\Tests\html_title\Functional;

use Drupal\Core\Url;
use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\language\Entity\ContentLanguageSettings;
use Drupal\Tests\BrowserTestBase;

/**
 * Tests the HTML Title module.
 *
 * @group html_title
 */
class HtmlTitleTest extends BrowserTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'html_title_test',
    'node',
    'block',
    'search',
    'content_translation',
    'path',
  ];

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

  /**
   * The state service.
   *
   * @var \Drupal\Core\State\StateInterface
   */
  protected $state;

  /**
   * User with administer HTML Title settings rights.
   *
   * @var \Drupal\user\Entity\User|false
   */
  protected $adminUser;

  /**
   * A node entity.
   *
   * @var \Drupal\node\NodeInterface
   */
  protected $node1;

  /**
   * A node entity.
   *
   * @var \Drupal\node\NodeInterface
   */
  protected $node2;

  /**
   * A node entity.
   *
   * @var \Drupal\node\NodeInterface
   */
  protected $node3;

  /**
   * A node entity.
   *
   * @var \Drupal\node\NodeInterface
   */
  protected $node4;

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

    $this->drupalPlaceBlock('system_breadcrumb_block');
    $this->drupalPlaceBlock('page_title_block');

    $this->config('html_title.settings')
      ->set('allow_html_tags', '<br> <sub> <sup>')
      ->save();
    $this->adminUser = $this->createUser([], NULL, TRUE);
    $this->drupalLogin($this->adminUser);

    $this->drupalCreateContentType(['type' => 'test']);

    // Add FR language.
    ConfigurableLanguage::createFromLangcode('fr')->save();

    // Add path_prefix based language negotiation.
    $this->config('language.negotiation')
      ->set('url.source', 'path_prefix')
      ->set('url.prefixes', ['en' => 'en', 'fr' => 'fr'])
      ->save();

    // Turn on content translation for test pages.
    $config = ContentLanguageSettings::loadByEntityTypeBundle('node', 'test');
    $config->setDefaultLangcode('en')
      ->setLanguageAlterable(TRUE)
      ->save();

    $this->node1 = $this->drupalCreateNode([
      'title' => 'Test <sup>sup</sup>-tag',
      'type' => 'test',
      'path' => '/parent',
    ]);
    $this->node2 = $this->drupalCreateNode([
      'title' => 'Test <sup>sup</sup>-tag, <sub>sub</sub>-tag and <br>br-tag',
      'type' => 'test',
      'path' => '/parent/child',
    ]);
    $this->node3 = $this->drupalCreateNode([
      'title' => 'Test <sup>sup</sup>-tag, <sub>sub</sub>-tag, <br>br-tag and <p>p</p>-tag',
      'type' => 'test',
    ]);
    $translation = $this->node3->addTranslation('fr', ['title' => 'Test <sup>sup</sup>-tag, <sub>sub</sub>-tag, <br>br-tag and <p>p</p>-tag FR']);
    $translation->save();
    $this->node4 = $this->drupalCreateNode([
      'title' => 'Test <p>p</p>-tag',
      'type' => 'test',
    ]);

    // Run a cron job so the nodes are indexed and shown on the search page.
    $this->container->get('cron')->run();

    $this->state = $this->container->get('state');
  }

  /**
   * Tests the page title block in combination with HTML Title.
   */
  public function testPageTitleBlock() {
    $assert_session = $this->assertSession();
    $this->drupalGet($this->node1->toUrl());
    $assert_session->responseContains('<h1>Test <sup>sup</sup>-tag</h1>');

    $this->drupalGet($this->node2->toUrl());
    $assert_session->responseContains('<h1>Test <sup>sup</sup>-tag, <sub>sub</sub>-tag and <br>br-tag</h1>');

    $this->drupalGet($this->node3->toUrl());
    $assert_session->responseContains('<h1>Test <sup>sup</sup>-tag, <sub>sub</sub>-tag, <br>br-tag and p-tag</h1>');

    // Check that translations still work.
    $this->drupalGet('fr/node/' . $this->node3->id());
    $assert_session->responseContains('<h1>Test <sup>sup</sup>-tag, <sub>sub</sub>-tag, <br>br-tag and p-tag FR</h1>');

    $this->drupalGet($this->node4->toUrl());
    $assert_session->responseContains('<h1>Test p-tag</h1>');
  }

  /**
   * Tests the edit node page title.
   */
  public function testEditNodePageTitle() {
    $assert_session = $this->assertSession();
    $this->drupalGet(Url::fromRoute('entity.node.edit_form', [
      'node' => $this->node1->id(),
    ]));
    $assert_session->responseContains('<h1><em>Edit test</em> Test <sup>sup</sup>-tag</h1>');

    $this->drupalGet(Url::fromRoute('entity.node.edit_form', [
      'node' => $this->node2->id(),
    ]));
    $assert_session->responseContains('<h1><em>Edit test</em> Test <sup>sup</sup>-tag, <sub>sub</sub>-tag and <br>br-tag</h1>');

    $this->drupalGet(Url::fromRoute('entity.node.edit_form', [
      'node' => $this->node3->id(),
    ]));
    $assert_session->responseContains('<h1><em>Edit test</em> Test <sup>sup</sup>-tag, <sub>sub</sub>-tag, <br>br-tag and p-tag</h1>');

    $this->drupalGet('fr/node/' . $this->node3->id() . '/edit');
    $assert_session->responseContains('<h1><em>Edit test</em> Test <sup>sup</sup>-tag, <sub>sub</sub>-tag, <br>br-tag and p-tag FR</h1>');

    $this->drupalGet(Url::fromRoute('entity.node.edit_form', [
      'node' => $this->node4->id(),
    ]));
    $assert_session->responseContains('<h1><em>Edit test</em> Test p-tag</h1>');
  }

  /**
   * Tests the breadcrumb block in combination with HTML Title.
   */
  public function testBreadcrumbBlock() {
    $assert_session = $this->assertSession();
    $this->drupalGet($this->node1->toUrl());
    $element = $assert_session->elementExists('css', 'nav[role="navigation"] ol li:last-child');
    $this->assertEquals('Test <sup>sup</sup>-tag', trim($element->getHtml()));

    $this->drupalGet($this->node2->toUrl());
    $element = $assert_session->elementExists('css', 'nav[role="navigation"] ol li:nth-child(2) a');
    $this->assertEquals('Test <sup>sup</sup>-tag', trim($element->getHtml()));
    $element = $assert_session->elementExists('css', 'nav[role="navigation"] ol li:last-child');
    $this->assertEquals('Test <sup>sup</sup>-tag, <sub>sub</sub>-tag and <br>br-tag', trim($element->getHtml()));

    $this->drupalGet($this->node3->toUrl());
    $element = $assert_session->elementExists('css', 'nav[role="navigation"] ol li:last-child');
    $this->assertEquals('Test <sup>sup</sup>-tag, <sub>sub</sub>-tag, <br>br-tag and p-tag', trim($element->getHtml()));

    // Check that translations still work.
    $this->drupalGet('fr/node/' . $this->node3->id());
    $element = $assert_session->elementExists('css', 'nav[role="navigation"] ol li:last-child');
    $this->assertEquals('Test <sup>sup</sup>-tag, <sub>sub</sub>-tag, <br>br-tag and p-tag FR', trim($element->getHtml()));

    $this->drupalGet($this->node4->toUrl());
    $element = $assert_session->elementExists('css', 'nav[role="navigation"] ol li:last-child');
    $this->assertEquals('Test p-tag', trim($element->getHtml()));
  }

  /**
   * Tests the search module in combination with HTML title.
   */
  public function testSearchPage() {
    $assert_session = $this->assertSession();
    $this->drupalGet('search/node');
    $this->submitForm(['keys' => 'test br-tag p-tag', 'language[en]' => 'en'],
      'Search'
    );

    $element = $assert_session->elementExists('css', 'ol li:first-child h3 a');
    $this->assertEquals('Test <sup>sup</sup>-tag, <sub>sub</sub>-tag, <br>br-tag and p-tag', trim($element->getHtml()));

    $this->drupalGet('fr/search/node');
    $this->submitForm(['keys' => 'test br-tag p-tag', 'language[fr]' => 'fr'],
      'Search'
    );

    $element = $assert_session->elementExists('css', 'ol li:first-child h3 a');
    $this->assertEquals('Test <sup>sup</sup>-tag, <sub>sub</sub>-tag, <br>br-tag and p-tag FR', trim($element->getHtml()));
  }

  /**
   * Tests the revision pages in combination with HTML Title.
   */
  public function testRevisionsPage() {

    $assert_session = $this->assertSession();
    $node_1_revision = clone $this->node1;
    $node_1_revision->set('body', ['value' => $this->getRandomGenerator()->paragraphs(12)]);
    $node_1_revision->setNewRevision();
    $node_1_revision->save();

    $this->drupalGet(Url::fromRoute('node.revision_revert_confirm', [
      'node' => $this->node1->id(),
      'node_revision' => $this->node1->getRevisionId(),
    ]));
    $assert_session->responseContains('<h1>Test <sup>sup</sup>-tag</h1>');

    $this->drupalGet(Url::fromRoute('entity.node.revision', [
      'node' => $this->node1->id(),
      'node_revision' => $this->node1->getRevisionId(),
    ]));
    $assert_session->responseContains('<h1>Test <sup>sup</sup>-tag</h1>');

    $this->drupalGet(Url::fromRoute('node.revision_delete_confirm', [
      'node' => $this->node1->id(),
      'node_revision' => $this->node1->getRevisionId(),
    ]));
    $assert_session->responseContains('<h1>Test <sup>sup</sup>-tag</h1>');
  }

  /**
   * Test the node confirmation message.
   */
  public function testNodeConfirmationMessage() {
    // Test that node confirmation messages renders the allowed HTML-tags.
    $this->drupalGet('node/add');
    $this->submitForm(['title[0][value]' => 'Test <sup>sup</sup>-tag'], 'Save');
    $this->assertSession()->elementContains('css', 'div[data-drupal-messages]', 'Test <sup>sup</sup>-tag');

    // Nodes without HTML should still work.
    $this->drupalGet('node/add');
    $this->submitForm(['title[0][value]' => 'Test node'], 'Save');
    $this->assertSession()->elementTextContains('css', 'div[data-drupal-messages]', 'Test node');

    // HTML-tags that are not allowed should be filtered out of the message.
    $this->drupalGet('node/add');
    $this->submitForm(['title[0][value]' => 'Test <p>p</p>-tag'], 'Save');
    $this->assertSession()->elementTextContains('css', 'div[data-drupal-messages]', 'Test p-tag');

    // When this setting is TRUE, this will add extra messages on the node
    // confirmation. This can be used to check that only the node confirmation
    // message is altered.
    $this->state->set('html_title_test.set_node_confirmation_messages', TRUE);

    // Test that only the node confirmation message is replaced and other
    // messages still work.
    $this->drupalGet('node/add');
    $this->submitForm(['title[0][value]' => 'Test <sub>sub</sub>-tag'], 'Save');
    $this->assertSession()->elementContains('css', 'div[data-drupal-messages]', 'Test <sub>sub</sub>-tag');
    $this->assertSession()->elementContains('css', 'div[data-drupal-messages]', 'Test status message');
    $this->assertSession()->elementTextContains('css', 'div[data-drupal-messages]', 'Test status message with <p>HTML</p>');
    $this->assertSession()->elementContains('css', 'div[data-drupal-messages]', 'Test error message');
  }

}

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

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