You are here

protected function HelpTopicsSyntaxTest::verifyTopic in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/help_topics/tests/src/Functional/HelpTopicsSyntaxTest.php \Drupal\Tests\help_topics\Functional\HelpTopicsSyntaxTest::verifyTopic()

Verifies rendering and standards compliance of one help topic.

Parameters

string $id: ID of the topic to verify.

array $definitions: Array of all topic definitions, keyed by ID.

int $response: Expected response from visiting the page for the topic.

2 calls to HelpTopicsSyntaxTest::verifyTopic()
HelpTopicsSyntaxTest::testHelpTopics in core/modules/help_topics/tests/src/Functional/HelpTopicsSyntaxTest.php
Tests that all Core help topics can be rendered and have good syntax.
HelpTopicsSyntaxTest::verifyBadTopic in core/modules/help_topics/tests/src/Functional/HelpTopicsSyntaxTest.php
Verifies that a bad topic fails in the expected way.

File

core/modules/help_topics/tests/src/Functional/HelpTopicsSyntaxTest.php, line 99

Class

HelpTopicsSyntaxTest
Verifies that all core Help topics can be rendered and comply with standards.

Namespace

Drupal\Tests\help_topics\Functional

Code

protected function verifyTopic($id, $definitions, $response = 200) {
  $definition = $definitions[$id];

  // Visit the URL for the topic.
  $this
    ->drupalGet('admin/help/topic/' . $id);

  // Verify the title and response.
  $session = $this
    ->assertSession();
  $session
    ->statusCodeEquals($response);
  if ($response == 200) {
    $session
      ->titleEquals($definition['label'] . ' | Drupal');
  }

  // Verify that all the related topics exist. Also check to see if any of
  // them are top-level (we will need that in the next section).
  $has_top_level_related = FALSE;
  if (isset($definition['related'])) {
    foreach ($definition['related'] as $related_id) {
      $this
        ->assertArrayHasKey($related_id, $definitions, 'Topic ' . $id . ' is only related to topics that exist (' . $related_id . ')');
      $has_top_level_related = $has_top_level_related || !empty($definitions[$related_id]['top_level']);
    }
  }

  // Verify this is either top-level or related to a top-level topic.
  $this
    ->assertTrue(!empty($definition['top_level']) || $has_top_level_related, 'Topic ' . $id . ' is either top-level or related to at least one other top-level topic');

  // Verify that the label is not empty.
  $this
    ->assertNotEmpty($definition['label'], 'Topic ' . $id . ' has a non-empty label');

  // Read in the file so we can run some tests on that.
  $body = file_get_contents($definition[HelpTopicDiscovery::FILE_KEY]);
  $this
    ->assertNotEmpty($body, 'Topic ' . $id . ' has a non-empty Twig file');

  // Remove the front matter data (already tested above), and Twig set and
  // variable printouts from the file.
  $body = preg_replace('|---.*---|sU', '', $body);
  $body = preg_replace('|\\{\\{.*\\}\\}|sU', '', $body);
  $body = preg_replace('|\\{\\% set.*\\%\\}|sU', '', $body);
  $body = preg_replace('|\\{\\% endset \\%\\}|sU', '', $body);
  $body = trim($body);
  $this
    ->assertNotEmpty($body, 'Topic ' . $id . ' Twig file contains some text outside of front matter');

  // Verify that if we remove all the translated text, whitespace, and
  // HTML tags, there is nothing left (that is, all text is translated).
  $text = preg_replace('|\\{\\% trans \\%\\}.*\\{\\% endtrans \\%\\}|sU', '', $body);
  $text = strip_tags($text);
  $text = preg_replace('|\\s+|', '', $text);
  $this
    ->assertEmpty($text, 'Topic ' . $id . ' Twig file has all of its text translated');

  // Verify that all of the translated text is locale-safe and valid HTML.
  $matches = [];
  preg_match_all('|\\{\\% trans \\%\\}(.*)\\{\\% endtrans \\%\\}|sU', $body, $matches, PREG_PATTERN_ORDER);
  foreach ($matches[1] as $string) {
    $this
      ->assertTrue(locale_string_is_safe($string), 'Topic ' . $id . ' Twig file translatable strings are all exportable');
    $this
      ->validateHtml($string, $id);
  }

  // Validate the HTML in the body as a whole.
  $this
    ->validateHtml($body, $id);

  // Validate the HTML in the body with the translated text replaced by a
  // dummy string, to verify that HTML syntax is not partly in and partly out
  // of the translated text.
  $text = preg_replace('|\\{\\% trans \\%\\}.*\\{\\% endtrans \\%\\}|sU', 'dummy', $body);
  $this
    ->validateHtml($text, $id);
}