InstallerRedirectTraitTest.php

Same filename and directory in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Installer/InstallerRedirectTraitTest.php
  2. 8.9.x core/tests/Drupal/KernelTests/Core/Installer/InstallerRedirectTraitTest.php
  3. 11.x core/tests/Drupal/KernelTests/Core/Installer/InstallerRedirectTraitTest.php

Namespace

Drupal\KernelTests\Core\Installer

File

core/tests/Drupal/KernelTests/Core/Installer/InstallerRedirectTraitTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\KernelTests\Core\Installer;

use Drupal\Core\Database\Connection;
use Drupal\Core\Database\Database;
use Drupal\Core\Database\DatabaseExceptionWrapper;
use Drupal\Core\Database\DatabaseNotFoundException;
use Drupal\Core\Database\Schema;
use Drupal\Core\Installer\InstallerRedirectTrait;
use Drupal\KernelTests\KernelTestBase;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

/**
 * @coversDefaultClass \Drupal\Core\Installer\InstallerRedirectTrait
 *
 * @group Installer
 * @group #slow
 */
class InstallerRedirectTraitTest extends KernelTestBase {
  
  /**
   * Data provider for testShouldRedirectToInstaller().
   *
   * @return array
   *   - Expected result from shouldRedirectToInstaller().
   *   - Exceptions to be handled by shouldRedirectToInstaller()
   *   - Whether or not there is a database connection.
   *   - Whether or not there is database connection info.
   *   - Whether or not there exists a sequences table in the database.
   */
  public static function providerShouldRedirectToInstaller() {
    return [
      [
        TRUE,
        DatabaseNotFoundException::class,
        FALSE,
        FALSE,
      ],
      [
        TRUE,
        DatabaseNotFoundException::class,
        TRUE,
        FALSE,
      ],
      [
        TRUE,
        DatabaseNotFoundException::class,
        FALSE,
        TRUE,
      ],
      [
        TRUE,
        DatabaseNotFoundException::class,
        TRUE,
        TRUE,
      ],
      [
        TRUE,
        DatabaseNotFoundException::class,
        TRUE,
        TRUE,
        FALSE,
      ],
      [
        TRUE,
        \PDOException::class,
        FALSE,
        FALSE,
      ],
      [
        TRUE,
        \PDOException::class,
        TRUE,
        FALSE,
      ],
      [
        FALSE,
        \PDOException::class,
        FALSE,
        TRUE,
      ],
      [
        FALSE,
        \PDOException::class,
        TRUE,
        TRUE,
      ],
      [
        TRUE,
        \PDOException::class,
        TRUE,
        TRUE,
        FALSE,
      ],
      [
        TRUE,
        DatabaseExceptionWrapper::class,
        FALSE,
        FALSE,
      ],
      [
        TRUE,
        DatabaseExceptionWrapper::class,
        TRUE,
        FALSE,
      ],
      [
        FALSE,
        DatabaseExceptionWrapper::class,
        FALSE,
        TRUE,
      ],
      [
        FALSE,
        DatabaseExceptionWrapper::class,
        TRUE,
        TRUE,
      ],
      [
        TRUE,
        DatabaseExceptionWrapper::class,
        TRUE,
        TRUE,
        FALSE,
      ],
      [
        TRUE,
        NotFoundHttpException::class,
        FALSE,
        FALSE,
      ],
      [
        TRUE,
        NotFoundHttpException::class,
        TRUE,
        FALSE,
      ],
      [
        FALSE,
        NotFoundHttpException::class,
        FALSE,
        TRUE,
      ],
      [
        FALSE,
        NotFoundHttpException::class,
        TRUE,
        TRUE,
      ],
      [
        TRUE,
        NotFoundHttpException::class,
        TRUE,
        TRUE,
        FALSE,
      ],
      [
        FALSE,
        \Exception::class,
        FALSE,
        FALSE,
      ],
      [
        FALSE,
        \Exception::class,
        TRUE,
        FALSE,
      ],
      [
        FALSE,
        \Exception::class,
        FALSE,
        TRUE,
      ],
      [
        FALSE,
        \Exception::class,
        TRUE,
        TRUE,
      ],
      [
        FALSE,
        \Exception::class,
        TRUE,
        TRUE,
        FALSE,
      ],
    ];
  }
  
  /**
   * @covers ::shouldRedirectToInstaller
   * @dataProvider providerShouldRedirectToInstaller
   */
  public function testShouldRedirectToInstaller($expected, $exception, $connection, $connection_info, $sequences_table_exists = TRUE) : void {
    try {
      throw new $exception();
    } catch (\Exception $e) {
      // Mock the trait.
      $trait = $this->getMockBuilder(InstallerRedirectTraitMockableClass::class)
        ->onlyMethods([
        'isCli',
      ])
        ->getMock();
      // Make sure that the method thinks we are not using the cli.
      $trait->expects($this->any())
        ->method('isCli')
        ->willReturn(FALSE);
      // Un-protect the method using reflection.
      $method_ref = new \ReflectionMethod($trait, 'shouldRedirectToInstaller');
      // Mock the database connection info.
      $db = $this->getMockForAbstractClass(Database::class);
      $property_ref = new \ReflectionProperty($db, 'databaseInfo');
      $property_ref->setValue($db, [
        'default' => $connection_info,
      ]);
      if ($connection) {
        // Mock the database connection.
        $connection = $this->getMockBuilder(Connection::class)
          ->disableOriginalConstructor()
          ->onlyMethods([
          'schema',
        ])
          ->getMockForAbstractClass();
        if ($connection_info) {
          // Mock the database schema class.
          $schema = $this->getMockBuilder(Schema::class)
            ->disableOriginalConstructor()
            ->onlyMethods([
            'tableExists',
          ])
            ->getMockForAbstractClass();
          $schema->expects($this->any())
            ->method('tableExists')
            ->with('sequences')
            ->willReturn($sequences_table_exists);
          $connection->expects($this->any())
            ->method('schema')
            ->willReturn($schema);
        }
      }
      else {
        // Set the database connection if there is none.
        $connection = NULL;
      }
      // Call shouldRedirectToInstaller.
      $this->assertSame($expected, $method_ref->invoke($trait, $e, $connection));
    }
  }

}

/**
 * A class using the InstallerRedirectTrait for mocking purposes.
 */
class InstallerRedirectTraitMockableClass {
  use InstallerRedirectTrait;

}

Classes

Title Deprecated Summary
InstallerRedirectTraitMockableClass A class using the InstallerRedirectTrait for mocking purposes.
InstallerRedirectTraitTest @coversDefaultClass \Drupal\Core\Installer\InstallerRedirectTrait[[api-linebreak]]

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