UpdateReportTest.php

Same filename in other branches
  1. 9 core/modules/update/tests/src/Kernel/UpdateReportTest.php
  2. 8.9.x core/modules/update/tests/src/Kernel/UpdateReportTest.php
  3. 10 core/modules/update/tests/src/Kernel/UpdateReportTest.php

Namespace

Drupal\Tests\update\Kernel

File

core/modules/update/tests/src/Kernel/UpdateReportTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\update\Kernel;

use Drupal\Core\Link;
use Drupal\Core\Url;
use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\user\Traits\UserCreationTrait;

/**
 * Tests update report functionality.
 *
 * @covers template_preprocess_update_report
 * @group update
 */
class UpdateReportTest extends KernelTestBase {
    use UserCreationTrait;
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'system',
        'update',
    ];
    
    /**
     * @dataProvider providerTemplatePreprocessUpdateReport
     */
    public function testTemplatePreprocessUpdateReport($variables) : void {
        \Drupal::moduleHandler()->loadInclude('update', 'inc', 'update.report');
        // The function should run without an exception being thrown when the value
        // of $variables['data'] is not set or is not an array.
        template_preprocess_update_report($variables);
        // Test that the key "no_updates_message" has been set.
        $this->assertArrayHasKey('no_updates_message', $variables);
    }
    
    /**
     * Provides data for testTemplatePreprocessUpdateReport().
     *
     * @return array
     *   Array of $variables for template_preprocess_update_report().
     */
    public static function providerTemplatePreprocessUpdateReport() {
        return [
            '$variables with data not set' => [
                [],
            ],
            '$variables with data as an integer' => [
                [
                    'data' => 4,
                ],
            ],
            '$variables with data as a string' => [
                [
                    'data' => 'I am a string',
                ],
            ],
        ];
    }
    
    /**
     * Tests the error message when failing to fetch data without dblog installed.
     *
     * @see template_preprocess_update_fetch_error_message()
     */
    public function testTemplatePreprocessUpdateFetchErrorMessageNoDblog() : void {
        $build = [
            '#theme' => 'update_fetch_error_message',
        ];
        $this->render($build);
        $this->assertRaw('Failed to fetch available update data:<ul><li>See <a href="https://www.drupal.org/node/3170647">PHP OpenSSL requirements</a> in the Drupal.org handbook for possible reasons this could happen and what you can do to resolve them.</li><li>Check your local system logs for additional error messages.</li></ul>');
        \Drupal::moduleHandler()->loadInclude('update', 'inc', 'update.report');
        $variables = [];
        template_preprocess_update_fetch_error_message($variables);
        $this->assertArrayHasKey('error_message', $variables);
        $this->assertEquals('Failed to fetch available update data:', $variables['error_message']['message']['#markup']);
        $this->assertArrayHasKey('documentation_link', $variables['error_message']['items']['#items']);
        $this->assertArrayHasKey('logs', $variables['error_message']['items']['#items']);
        $this->assertArrayNotHasKey('dblog', $variables['error_message']['items']['#items']);
    }
    
    /**
     * Tests the error message when failing to fetch data with dblog installed.
     *
     * @see template_preprocess_update_fetch_error_message()
     */
    public function testTemplatePreprocessUpdateFetchErrorMessageWithDblog() : void {
        \Drupal::moduleHandler()->loadInclude('update', 'inc', 'update.report');
        $this->enableModules([
            'dblog',
            'user',
        ]);
        $this->installEntitySchema('user');
        // First, try as a normal user that can't access dblog.
        $this->setUpCurrentUser();
        $build = [
            '#theme' => 'update_fetch_error_message',
        ];
        $this->render($build);
        $this->assertRaw('Failed to fetch available update data:<ul><li>See <a href="https://www.drupal.org/node/3170647">PHP OpenSSL requirements</a> in the Drupal.org handbook for possible reasons this could happen and what you can do to resolve them.</li><li>Check your local system logs for additional error messages.</li></ul>');
        $variables = [];
        template_preprocess_update_fetch_error_message($variables);
        $this->assertArrayHasKey('error_message', $variables);
        $this->assertEquals('Failed to fetch available update data:', $variables['error_message']['message']['#markup']);
        $this->assertArrayHasKey('documentation_link', $variables['error_message']['items']['#items']);
        $this->assertArrayHasKey('logs', $variables['error_message']['items']['#items']);
        $this->assertArrayNotHasKey('dblog', $variables['error_message']['items']['#items']);
        // Now, try as an admin that can access dblog.
        $this->setUpCurrentUser([], [
            'access content',
            'access site reports',
        ]);
        $this->render($build);
        $this->assertRaw('Failed to fetch available update data:<ul><li>See <a href="https://www.drupal.org/node/3170647">PHP OpenSSL requirements</a> in the Drupal.org handbook for possible reasons this could happen and what you can do to resolve them.</li><li>Check');
        $dblog_url = Url::fromRoute('dblog.overview', [], [
            'query' => [
                'type' => [
                    'update',
                ],
            ],
        ]);
        $this->assertRaw((string) Link::fromTextAndUrl('your local system logs', $dblog_url)->toString());
        $this->assertRaw(' for additional error messages.</li></ul>');
        $variables = [];
        template_preprocess_update_fetch_error_message($variables);
        $this->assertArrayHasKey('error_message', $variables);
        $this->assertEquals('Failed to fetch available update data:', $variables['error_message']['message']['#markup']);
        $this->assertArrayHasKey('documentation_link', $variables['error_message']['items']['#items']);
        $this->assertArrayNotHasKey('logs', $variables['error_message']['items']['#items']);
        $this->assertArrayHasKey('dblog', $variables['error_message']['items']['#items']);
    }

}

Classes

Title Deprecated Summary
UpdateReportTest Tests update report functionality.

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