DevelErrorHandlerTest.php

Same filename in other branches
  1. 4.x tests/src/Functional/DevelErrorHandlerTest.php
  2. 5.x tests/src/Functional/DevelErrorHandlerTest.php

Namespace

Drupal\Tests\devel\Functional

File

tests/src/Functional/DevelErrorHandlerTest.php

View source
<?php

namespace Drupal\Tests\devel\Functional;

use Drupal\Component\Render\FormattableMarkup;
use Drupal\Tests\BrowserTestBase;

/**
 * Tests devel error handler.
 *
 * @group devel
 */
class DevelErrorHandlerTest extends BrowserTestBase {
    
    /**
     * {@inheritdoc}
     */
    public static $modules = [
        'devel',
    ];
    
    /**
     * Tests devel error handler.
     */
    public function testErrorHandler() {
        $messages_selector = 'div.messages--warning';
        $expected_notice = new FormattableMarkup('%type: @message in %function (line ', [
            '%type' => 'Notice',
            '@message' => 'Undefined variable: undefined',
            '%function' => 'Drupal\\devel\\Form\\SettingsForm->demonstrateErrorHandlers()',
        ]);
        $expected_warning = new FormattableMarkup('%type: @message in %function (line ', [
            '%type' => 'Warning',
            '@message' => 'Division by zero',
            '%function' => 'Drupal\\devel\\Form\\SettingsForm->demonstrateErrorHandlers()',
        ]);
        $config = $this->config('system.logging');
        $config->set('error_level', ERROR_REPORTING_DISPLAY_VERBOSE)
            ->save();
        $admin_user = $this->drupalCreateUser([
            'administer site configuration',
            'access devel information',
        ]);
        $this->drupalLogin($admin_user);
        // Ensures that the error handler config is present on the config page and
        // by default the standard error handler is selected.
        $error_handlers = \Drupal::config('devel.settings')->get('error_handlers');
        $this->assertEquals($error_handlers, [
            DEVEL_ERROR_HANDLER_STANDARD => DEVEL_ERROR_HANDLER_STANDARD,
        ]);
        $this->drupalGet('admin/config/development/devel');
        $this->assertOptionSelected('edit-error-handlers', DEVEL_ERROR_HANDLER_STANDARD);
        // Ensures that selecting the DEVEL_ERROR_HANDLER_NONE option no error
        // (raw or message) is shown on the site in case of php errors.
        $edit = [
            'error_handlers[]' => DEVEL_ERROR_HANDLER_NONE,
        ];
        $this->drupalPostForm('admin/config/development/devel', $edit, t('Save configuration'));
        $this->assertSession()
            ->pageTextContains('The configuration options have been saved.');
        $error_handlers = \Drupal::config('devel.settings')->get('error_handlers');
        $this->assertEquals($error_handlers, [
            DEVEL_ERROR_HANDLER_NONE => DEVEL_ERROR_HANDLER_NONE,
        ]);
        $this->assertOptionSelected('edit-error-handlers', DEVEL_ERROR_HANDLER_NONE);
        $this->clickLink('notice+warning');
        $this->assertSession()
            ->statusCodeEquals(200);
        $this->assertSession()
            ->responseNotContains($expected_notice);
        $this->assertSession()
            ->responseNotContains($expected_warning);
        $this->assertSession()
            ->elementNotExists('css', $messages_selector);
        // Ensures that selecting the DEVEL_ERROR_HANDLER_BACKTRACE_KINT option a
        // backtrace above the rendered page is shown on the site in case of php
        // errors.
        $edit = [
            'error_handlers[]' => DEVEL_ERROR_HANDLER_BACKTRACE_KINT,
        ];
        $this->drupalPostForm('admin/config/development/devel', $edit, t('Save configuration'));
        $this->assertSession()
            ->pageTextContains('The configuration options have been saved.');
        $error_handlers = \Drupal::config('devel.settings')->get('error_handlers');
        $this->assertEquals($error_handlers, [
            DEVEL_ERROR_HANDLER_BACKTRACE_KINT => DEVEL_ERROR_HANDLER_BACKTRACE_KINT,
        ]);
        $this->assertOptionSelected('edit-error-handlers', DEVEL_ERROR_HANDLER_BACKTRACE_KINT);
        $this->clickLink('notice+warning');
        $this->assertSession()
            ->statusCodeEquals(200);
        $this->assertSession()
            ->elementNotExists('css', $messages_selector);
        // Ensures that selecting the DEVEL_ERROR_HANDLER_BACKTRACE_DPM option a
        // backtrace in the message area is shown on the site in case of php errors.
        $edit = [
            'error_handlers[]' => DEVEL_ERROR_HANDLER_BACKTRACE_DPM,
        ];
        $this->drupalPostForm('admin/config/development/devel', $edit, t('Save configuration'));
        $this->assertSession()
            ->pageTextContains('The configuration options have been saved.');
        $error_handlers = \Drupal::config('devel.settings')->get('error_handlers');
        $this->assertEquals($error_handlers, [
            DEVEL_ERROR_HANDLER_BACKTRACE_DPM => DEVEL_ERROR_HANDLER_BACKTRACE_DPM,
        ]);
        $this->assertOptionSelected('edit-error-handlers', DEVEL_ERROR_HANDLER_BACKTRACE_DPM);
        $this->clickLink('notice+warning');
        $this->assertSession()
            ->statusCodeEquals(200);
        $this->assertSession()
            ->responseContains($expected_notice);
        $this->assertSession()
            ->responseContains($expected_warning);
        $this->assertSession()
            ->elementContains('css', $messages_selector, $expected_notice);
        $this->assertSession()
            ->elementContains('css', $messages_selector, $expected_warning);
        // Ensures that when multiple handlers are selected, the output produced by
        // every handler is shown on the site in case of php errors.
        $edit = [
            'error_handlers[]' => [
                DEVEL_ERROR_HANDLER_BACKTRACE_KINT => DEVEL_ERROR_HANDLER_BACKTRACE_KINT,
                DEVEL_ERROR_HANDLER_BACKTRACE_DPM => DEVEL_ERROR_HANDLER_BACKTRACE_DPM,
            ],
        ];
        $this->drupalPostForm('admin/config/development/devel', $edit, t('Save configuration'));
        $this->assertSession()
            ->pageTextContains('The configuration options have been saved.');
        $error_handlers = \Drupal::config('devel.settings')->get('error_handlers');
        $this->assertEquals($error_handlers, [
            DEVEL_ERROR_HANDLER_BACKTRACE_KINT => DEVEL_ERROR_HANDLER_BACKTRACE_KINT,
            DEVEL_ERROR_HANDLER_BACKTRACE_DPM => DEVEL_ERROR_HANDLER_BACKTRACE_DPM,
        ]);
        $this->assertOptionSelected('edit-error-handlers', DEVEL_ERROR_HANDLER_BACKTRACE_KINT);
        $this->assertOptionSelected('edit-error-handlers', DEVEL_ERROR_HANDLER_BACKTRACE_DPM);
        $this->clickLink('notice+warning');
        $this->assertSession()
            ->statusCodeEquals(200);
        $this->assertSession()
            ->responseContains($expected_notice);
        $this->assertSession()
            ->responseContains($expected_warning);
        $this->assertSession()
            ->elementContains('css', $messages_selector, $expected_notice);
        $this->assertSession()
            ->elementContains('css', $messages_selector, $expected_warning);
        // Ensures that setting the error reporting to all the output produced by
        // handlers is shown on the site in case of php errors.
        $config->set('error_level', ERROR_REPORTING_DISPLAY_ALL)
            ->save();
        $this->clickLink('notice+warning');
        $this->assertSession()
            ->statusCodeEquals(200);
        $this->assertSession()
            ->responseContains($expected_notice);
        $this->assertSession()
            ->responseContains($expected_warning);
        $this->assertSession()
            ->elementContains('css', $messages_selector, $expected_notice);
        $this->assertSession()
            ->elementContains('css', $messages_selector, $expected_warning);
        // Ensures that setting the error reporting to some the output produced by
        // handlers is shown on the site in case of php errors.
        $config->set('error_level', ERROR_REPORTING_DISPLAY_SOME)
            ->save();
        $this->clickLink('notice+warning');
        $this->assertSession()
            ->statusCodeEquals(200);
        $this->assertSession()
            ->responseContains($expected_notice);
        $this->assertSession()
            ->responseContains($expected_warning);
        $this->assertSession()
            ->elementContains('css', $messages_selector, $expected_notice);
        $this->assertSession()
            ->elementContains('css', $messages_selector, $expected_warning);
        // Ensures that setting the error reporting to none the output produced by
        // handlers is not shown on the site in case of php errors.
        $config->set('error_level', ERROR_REPORTING_HIDE)
            ->save();
        $this->clickLink('notice+warning');
        $this->assertSession()
            ->statusCodeEquals(200);
        $this->assertSession()
            ->responseNotContains($expected_notice);
        $this->assertSession()
            ->responseNotContains($expected_warning);
        $this->assertSession()
            ->elementNotExists('css', $messages_selector);
    }

}

Classes

Title Deprecated Summary
DevelErrorHandlerTest Tests devel error handler.