class SimpleTestExampleTest

Ensure that the simpletest_example content type provided functions properly.

The SimpleTestExampleTest is a functional test case, meaning that it actually exercises a particular sequence of actions through the web UI. The majority of core test cases are done this way, but the SimpleTest suite also provides unit tests as demonstrated in the unit test case example later in this file.

Functional test cases are far slower to execute than unit test cases because they require a complete Drupal install to be done for each test.

@group testing_example @group examples

Hierarchy

Expanded class hierarchy of SimpleTestExampleTest

See also

Drupal\simpletest\WebTestBase

SimpleTestUnitTestExampleTestCase

SimpleTest uses group annotations to help you organize your tests.

Related topics

File

testing_example/src/Tests/SimpleTestExampleTest.php, line 31

Namespace

Drupal\testing_example\Tests
View source
class SimpleTestExampleTest extends WebTestBase {
    
    /**
     * Our module dependencies.
     *
     * In Drupal 8's SimpleTest, we declare module dependencies in a public
     * static property called $modules. WebTestBase automatically enables these
     * modules for us.
     *
     * @var array
     */
    public static $modules = [
        'testing_example',
    ];
    
    /**
     * The installation profile to use with this test.
     *
     * We use the 'minimal' profile so that there are some reasonable default
     * blocks defined, and so we can see the menu link created by our module.
     *
     * @var string
     */
    protected $profile = 'minimal';
    
    /**
     * Test SimpleTest Example menu and page.
     *
     * Enable SimpleTest Example and see if it can successfully return its main
     * page and if there is a link to the simpletest_example in the Tools menu.
     */
    public function testSimpleTestExampleMenu() {
        $url = Url::fromRoute('testing_example.simpletest_description');
        //
        // Test for a link to the simpletest_example in the Tools menu.
        $this->drupalGet('');
        $this->assertResponse(200, 'The Home page is available.');
        $this->assertLinkByHref($url->getInternalPath());
        // Verify that anonymous can access the simpletest_examples page.
        $this->drupalGet($url);
        $this->assertResponse(200, 'The SimpleTest Example description page is available.');
    }
    
    /**
     * Test node creation through the user interface.
     *
     * Creates a node using the node/add form and verifies its consistency in
     * the database.
     */
    public function testSimpleTestExampleCreate() {
        // Create a user with the ability to create our content type. This
        // permission is generated by the node module.
        $user = $this->createUser([
            'create testing_example content',
        ]);
        // Log in our user.
        $this->drupalLogin($user);
        // Create a node using the node/add form.
        $edit = [];
        $edit['title[0][value]'] = $this->randomMachineName(8);
        $edit['body[0][value]'] = $this->randomMachineName(16);
        $this->drupalPostForm('node/add/testing_example', $edit, 'Save');
        // Check that our testing_example node has been created.
        $this->assertText((string) new FormattableMarkup('@post @title has been created.', [
            '@post' => 'Testing Example Node Type',
            '@title' => $edit['title[0][value]'],
        ]));
        // Check that the node exists in the database.
        $node = $this->drupalGetNodeByTitle($edit['title[0][value]']);
        $this->assertTrue($node, 'Node found in database.');
        // Verify 'submitted by' information. Drupal adds a newline in there, so
        // we have to check for that.
        $username = $this->loggedInUser
            ->getAccountName();
        $datetime = $this->container
            ->get('date.formatter')
            ->format($node->getCreatedTime());
        $submitted_by = "Submitted by {$username}\n on {$datetime}";
        $this->drupalGet('node/' . $node->id());
        $this->assertText($submitted_by);
    }
    
    /**
     * Create a testing_example node and then see if our user can edit it.
     *
     * Note that some assertions in this test will fail. We do this to show what
     * a failing test looks like. Since we don't want this to interfere with
     * automated tests, however, we jump through some hoops to determine our
     * environment.
     */
    public function testSimpleTestExampleEdit() {
        // Create a user with our special permission.
        $user = $this->drupalCreateUser([
            'extra special edit any testing_example',
        ]);
        // Log in our user.
        $this->drupalLogin($user);
        // Create a node with our user as the creator.
        // drupalCreateNode() uses the logged-in user by default.
        $settings = [
            'type' => 'testing_example',
            'title' => $this->randomMachineName(32),
        ];
        $node = $this->drupalCreateNode($settings);
        // For debugging, we might output some information using $this->verbose()
        // It will only be output if the testing settings have 'verbose' set.
        $this->verbose('Node created: ' . $node->getTitle());
        // This section demonstrates a failing test. However, we want this test to
        // pass when it's running on the Drupal QA testbot. So we need to determine
        // which environment we're running inside of before we continue.
        if (!$this->runningOnTestbot()) {
            $this->drupalGet('node/' . $node->id() . '/edit');
            // The debug() statement will output information into the test results.
            // It can also be used in Drupal anywhere in code and will come out
            // as a message from the Messenger service.
            debug('The following test should fail. Examine the verbose message above it to see why.');
            // Make sure we don't get a 401 unauthorized response:
            $this->assertResponse(200, 'User is allowed to edit the content.');
            // Looking for title text in the page to determine whether we were
            // successful opening edit form.
            $this->assertText((string) new FormattableMarkup('@title', [
                '@title' => $settings['title'],
            ]), "Found title in edit form");
        }
    }
    
    /**
     * Detect if we're running on PIFR testbot.
     *
     * We can skip intentional failure if we're on the testbot. It happens that
     * on the testbot the site under test is in a directory named 'checkout' or
     * 'site_under_test'.
     *
     * @return bool
     *   TRUE if running on testbot.
     */
    public function runningOnTestbot() {
        // @todo: Add this line back once the testbot variable is available.
        // https://www.drupal.org/node/2565181
        // return env('DRUPALCI');
        return TRUE;
    }

}

Members

Title Sort descending Modifiers Object type Summary
SimpleTestExampleTest::$modules public static property Our module dependencies.
SimpleTestExampleTest::$profile protected property The installation profile to use with this test.
SimpleTestExampleTest::runningOnTestbot public function Detect if we're running on PIFR testbot.
SimpleTestExampleTest::testSimpleTestExampleCreate public function Test node creation through the user interface.
SimpleTestExampleTest::testSimpleTestExampleEdit public function Create a testing_example node and then see if our user can edit it.
SimpleTestExampleTest::testSimpleTestExampleMenu public function Test SimpleTest Example menu and page.