TourLegacyTest.php

Namespace

Drupal\Tests\tour\FunctionalJavascript

File

core/modules/tour/tests/src/FunctionalJavascript/TourLegacyTest.php

View source
<?php

namespace Drupal\Tests\tour\FunctionalJavascript;

use Drupal\FunctionalJavascriptTests\WebDriverTestBase;

/**
 * Tests Tour's backwards compatible markup and legacy config.
 *
 * @group tour
 * @group legacy
 */
class TourLegacyTest extends WebDriverTestBase {
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'tour',
        'tour_legacy_test',
        'toolbar',
    ];
    
    /**
     * {@inheritdoc}
     */
    protected $defaultTheme = 'stable';
    
    /**
     * {@inheritdoc}
     */
    public function setUp() : void {
        parent::setUp();
        $admin_user = $this->drupalCreateUser([
            'access toolbar',
            'access tour',
        ]);
        $this->drupalLogin($admin_user);
    }
    
    /**
     * Confirms backwards compatible markup.
     *
     * @param string $path
     *   The path to check.
     * @param string $theme
     *   The theme used by the tests.
     *
     * @dataProvider providerTestTourTipMarkup
     */
    public function testTourTipMarkup(string $path, string $theme = NULL) {
        // Install the specified theme and make it default if that is not already
        // the case.
        if ($theme) {
            $theme_manager = $this->container
                ->get('theme.manager');
            $this->container
                ->get('theme_installer')
                ->install([
                $theme,
            ], TRUE);
            $system_theme_config = $this->container
                ->get('config.factory')
                ->getEditable('system.theme');
            $system_theme_config->set('default', $theme)
                ->save();
            $this->rebuildAll();
            $this->assertSame($theme, $theme_manager->getActiveTheme()
                ->getName());
        }
        $page = $this->getSession()
            ->getPage();
        $assert_session = $this->assertSession();
        $this->drupalGet($path);
        $assert_session->waitForElementVisible('css', '#toolbar-tab-tour button');
        $page->find('css', '#toolbar-tab-tour button')
            ->press();
        $this->assertToolTipMarkup(0, 'top');
        $page->find('css', '.joyride-tip-guide[data-index="0"]')
            ->clickLink('Next');
        $this->assertToolTipMarkup(1, '', 'image');
        $page->find('css', '.joyride-tip-guide[data-index="1"]')
            ->clickLink('Next');
        $this->assertToolTipMarkup(2, 'top', 'body');
        $tip_content = $assert_session->waitForElementVisible('css', '.joyride-tip-guide[data-index="2"] .joyride-content-wrapper');
        $additional_paragraph = $tip_content->find('css', '.tour-tip-body + p');
        $this->assertNotNull($additional_paragraph, 'Tip 3 has an additional paragraph that is a sibling to the main paragraph.');
        $additional_list = $tip_content->find('css', '.tour-tip-body + p + ul');
        $this->assertNotNull($additional_list, 'Tip 3 has an additional unordered list that is a sibling to the main paragraph.');
    }
    
    /**
     * Asserts the markup structure of a tip.
     *
     * @param int $index
     *   The position of the tip within the tour.
     * @param string $nub_position
     *   The expected position of the nub arrow.
     * @param string $joyride_content_container_name
     *   For identifying classnames specific to a tip type.
     *
     * @internal
     */
    private function assertToolTipMarkup(int $index, string $nub_position, string $joyride_content_container_name = 'body') : void {
        $assert_session = $this->assertSession();
        $tip = $assert_session->waitForElementVisible('css', ".joyride-tip-guide[data-index=\"{$index}\"]");
        $this->assertNotNull($tip, 'The tour tip element is present.');
        $nub = $tip->find('css', ".joyride-tip-guide[data-index=\"{$index}\"] > .joyride-nub");
        $this->assertNotNull($nub, 'The nub element is present.');
        if (!empty($nub_position)) {
            $this->assertTrue($nub->hasClass($nub_position), 'The nub has a class that indicates its configured position.');
        }
        $content_wrapper = $tip->find('css', '.joyride-nub + .joyride-content-wrapper');
        $this->assertNotNull($content_wrapper, 'The joyride content wrapper exists, and is the next sibling of the nub.');
        $label = $tip->find('css', '.joyride-content-wrapper > h2.tour-tip-label:first-child');
        $this->assertNotNull($label, 'The tour tip label is an h2, and is the first child of the content wrapper.');
        $tip_content = $content_wrapper->find('css', "h2.tour-tip-label + p.tour-tip-{$joyride_content_container_name}");
        $this->assertNotNull($tip_content, 'The tip\'s main paragraph is the next sibling of the label, and has the expected wrapper class.');
        $tour_progress = $content_wrapper->find('css', "h2.tour-tip-label + p.tour-tip-{$joyride_content_container_name} ~ div.tour-progress");
        $this->assertNotNull($tour_progress, 'The div containing tour progress info is present, and is the next sibling of the main paragraph.');
        $next_item = $content_wrapper->find('css', ".tour-progress + a.joyride-next-tip.button.button--primary");
        $this->assertNotNull($next_item, 'The "Next" link is present, and the next sibling of the div containing progress info.');
        $close_tour = $content_wrapper->find('css', ".joyride-content-wrapper > a.joyride-close-tip:last-child");
        $this->assertNotNull($close_tour, 'The "Close" link is present, is an immediate child of the content wrapper, and is the last child.');
    }
    
    /**
     * Data Provider.
     *
     * @return \string[][]
     *   An array with two potential items:
     *   - The different path the test will run on.
     *   - The active theme when running the tests.
     */
    public function providerTestTourTipMarkup() {
        return [
            'Using the deprecated TipPlugin with Stable theme' => [
                'tour-test-legacy',
            ],
            'Using current TourTipPlugin with Stable theme' => [
                'tour-test-1',
            ],
            'Using the deprecated TipPlugin with Stable 9 theme' => [
                'tour-test-legacy',
                'stable9',
            ],
            'Using current TourTipPlugin with Stable 9 theme' => [
                'tour-test-1',
                'stable9',
            ],
        ];
    }

}

Classes

Title Deprecated Summary
TourLegacyTest Tests Tour's backwards compatible markup and legacy config.

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