function HelpTopicsSyntaxTest::verifyTopic

Same name and namespace in other branches
  1. 9 core/modules/help_topics/tests/src/Functional/HelpTopicsSyntaxTest.php \Drupal\Tests\help_topics\Functional\HelpTopicsSyntaxTest::verifyTopic()
  2. 10 core/modules/help/tests/src/Functional/HelpTopicsSyntaxTest.php \Drupal\Tests\help\Functional\HelpTopicsSyntaxTest::verifyTopic()
  3. 11.x core/modules/help/tests/src/Functional/HelpTopicsSyntaxTest.php \Drupal\Tests\help\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 100

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 = 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');
    // Load the topic body as HTML and verify that it parses.
    $doc = new \DOMDocument();
    $doc->strictErrorChecking = TRUE;
    $doc->validateOnParse = TRUE;
    libxml_use_internal_errors(TRUE);
    if (!$doc->loadHTML($body)) {
        foreach (libxml_get_errors() as $error) {
            $this->fail($error->message);
        }
        libxml_clear_errors();
    }
    // Check for headings hierarchy.
    $levels = [
        1,
        2,
        3,
        4,
        5,
        6,
    ];
    foreach ($levels as $level) {
        $num_headings[$level] = $doc->getElementsByTagName('h' . $level)->length;
        if ($level == 1) {
            $this->assertSame(0, $num_headings[1], 'Topic ' . $id . ' has no H1 tag');
            // Set num_headings to 1 for this level, so the rest of the hierarchy
            // can be tested using simpler code.
            $num_headings[1] = 1;
        }
        else {
            // We should either not have this heading, or if we do have one at this
            // level, we should also have the next-smaller level. That is, if we
            // have an h3, we should have also had an h2.
            $this->assertTrue($num_headings[$level - 1] > 0 || $num_headings[$level] == 0, 'Topic ' . $id . ' has the correct H2-H6 heading hierarchy');
        }
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.