LangcodeToAsciiUpdateTest.php

Namespace

Drupal\Tests\system\Functional\Entity\Update

File

core/modules/system/tests/src/Functional/Entity/Update/LangcodeToAsciiUpdateTest.php

View source
<?php

namespace Drupal\Tests\system\Functional\Entity\Update;

use Drupal\Core\Database\Database;
use Drupal\FunctionalTests\Update\UpdatePathTestBase;

/**
 * Tests that the entity langcode fields have been updated to varchar_ascii.
 *
 * @group Entity
 * @group legacy
 */
class LangcodeToAsciiUpdateTest extends UpdatePathTestBase {
    
    /**
     * {@inheritdoc}
     */
    public function setDatabaseDumpFiles() {
        $this->databaseDumpFiles = [
            __DIR__ . '/../../../../fixtures/update/drupal-8.bare.standard.php.gz',
        ];
    }
    
    /**
     * Tests that the column collation has been updated on MySQL.
     */
    public function testLangcodeColumnCollation() {
        // Only testable on MySQL.
        // @see https://www.drupal.org/node/301038
        if (Database::getConnection()->databaseType() !== 'mysql') {
            $this->pass('This test can only run on MySQL');
            return;
        }
        // Check a few different tables.
        $tables = [
            'node_field_data' => [
                'langcode',
            ],
            'users_field_data' => [
                'langcode',
                'preferred_langcode',
                'preferred_admin_langcode',
            ],
        ];
        foreach ($tables as $table => $columns) {
            foreach ($columns as $column) {
                // Depending on MYSQL versions you get different collations.
                $this->assertContains($this->getColumnCollation($table, $column), [
                    'utf8mb4_0900_ai_ci',
                    'utf8mb4_general_ci',
                ], 'Found correct starting collation for ' . $table . '.' . $column);
            }
        }
        // Apply updates.
        $this->runUpdates();
        foreach ($tables as $table => $columns) {
            foreach ($columns as $column) {
                $this->assertEqual('ascii_general_ci', $this->getColumnCollation($table, $column), 'Found correct updated collation for ' . $table . '.' . $column);
            }
        }
    }
    
    /**
     * Determine the column collation.
     *
     * @param string $table
     *   The table name.
     * @param string $column
     *   The column name.
     */
    protected function getColumnCollation($table, $column) {
        $query = Database::getConnection()->query("SHOW FULL COLUMNS FROM {" . $table . "}");
        while ($row = $query->fetchAssoc()) {
            if ($row['Field'] === $column) {
                return $row['Collation'];
            }
        }
        $this->fail('No collation found for ' . $table . '.' . $column);
    }

}

Classes

Title Deprecated Summary
LangcodeToAsciiUpdateTest Tests that the entity langcode fields have been updated to varchar_ascii.

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