phpmyadmin/tests/classes/Table/ColumnsDefinitionTest.php
Maurício Meneghini Fauth 4fefea40c7 Extract privileges globals to static props of UserPrivileges class
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
2024-01-05 17:50:13 -03:00

286 lines
12 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpMyAdmin\Tests\Table;
use PhpMyAdmin\Config;
use PhpMyAdmin\ConfigStorage\Relation;
use PhpMyAdmin\Current;
use PhpMyAdmin\DatabaseInterface;
use PhpMyAdmin\Table\ColumnsDefinition;
use PhpMyAdmin\Tests\AbstractTestCase;
use PhpMyAdmin\Tests\FieldHelper;
use PhpMyAdmin\Transformations;
use PhpMyAdmin\UserPrivileges;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\DataProvider;
use function array_merge;
use const MYSQLI_TYPE_STRING;
#[CoversClass(ColumnsDefinition::class)]
class ColumnsDefinitionTest extends AbstractTestCase
{
public function testDisplayForm(): void
{
Config::getInstance()->selectedServer['DisableIS'] = false;
$dummyDbi = $this->createDbiDummy();
$dbi = $this->createDatabaseInterface($dummyDbi);
DatabaseInterface::$instance = $dbi;
// phpcs:disable Generic.Files.LineLength.TooLong
$columnMeta = ['Field' => 'actor_id', 'Type' => 'smallint(5) unsigned', 'Collation' => null, 'Null' => 'NO', 'Key' => 'PRI', 'Default' => null, 'Extra' => 'auto_increment', 'Privileges' => 'select,insert,update,references', 'Comment' => ''];
$dummyDbi->addResult(
'SHOW FULL COLUMNS FROM `sakila`.`actor`',
[
['actor_id', 'smallint(5) unsigned', null, 'NO', 'PRI', null, 'auto_increment', 'select,insert,update,references', ''],
['first_name', 'varchar(45)', 'utf8mb4_general_ci', 'NO', '', null, '', 'select,insert,update,references', ''],
['last_name', 'varchar(45)', 'utf8mb4_general_ci', 'NO', 'MUL', null, '', 'select,insert,update,references', ''],
['last_update', 'timestamp', null, 'NO', '', 'current_timestamp()', 'on update current_timestamp()', 'select,insert,update,references', ''],
],
['Field', 'Type', 'Collation', 'Null', 'Key', 'Default', 'Extra', 'Privileges', 'Comment'],
);
$dummyDbi->addResult(
'SHOW INDEXES FROM `sakila`.`actor`',
[
['actor', '0', 'PRIMARY', '1', 'actor_id', 'A', '2', null, null, '', 'BTREE', '', '', 'NO'],
['actor', '1', 'idx_actor_last_name', '1', 'last_name', 'A', '2', null, null, '', 'BTREE', '', '', 'NO'],
],
['Table', 'Non_unique', 'Key_name', 'Seq_in_index', 'Column_name', 'Collation', 'Cardinality', 'Sub_part', 'Packed', 'Null', 'Index_type', 'Comment', 'Index_comment', 'Ignored'],
);
// phpcs:enable
$dummyDbi->addResult(
'SELECT * FROM `sakila`.`actor` LIMIT 1',
[['1', 'PENELOPE', 'GUINESS', '2006-02-15 04:34:33']],
['actor_id', 'first_name', 'last_name', 'last_update'],
);
$createTable = <<<'SQL'
CREATE TABLE `actor` (
`actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(45) NOT NULL,
`last_name` varchar(45) NOT NULL,
`last_update` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`actor_id`),
KEY `idx_actor_last_name` (`last_name`)
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8mb4
SQL;
$dummyDbi->addResult(
'SHOW CREATE TABLE `sakila`.`actor`',
[['actor', $createTable]],
['actor_id', 'first_name', 'last_name', 'last_update'],
);
$relation = new Relation($dbi);
$columnsDefinition = new ColumnsDefinition($dbi, $relation, new Transformations());
Current::$database = 'sakila';
Current::$table = 'actor';
UserPrivileges::$column = true;
UserPrivileges::$isReload = true;
$GLOBALS['mime_map'] = null;
$actual = $columnsDefinition->displayForm('/table/structure/save', 1, ['actor_id'], [$columnMeta]);
$contentCell = [
'column_number' => 0,
'column_meta' => array_merge($columnMeta, ['DefaultType' => 'NONE', 'DefaultValue' => '']),
'type_upper' => 'SMALLINT',
'default_value' => '',
'length_values_input_size' => 8,
'length' => '5',
'extracted_columnspec' => [
'type' => 'smallint',
'spec_in_brackets' => '5',
'enum_set_values' => [],
'print_type' => 'smallint(5)',
'binary' => false,
'unsigned' => true,
'zerofill' => false,
'attribute' => 'UNSIGNED',
'can_contain_collation' => false,
'displayed_type' => 'smallint(5)',
],
'submit_attribute' => null,
'comments_map' => [],
'fields_meta' => [$columnMeta],
'is_backup' => true,
'move_columns' => [
FieldHelper::fromArray(['type' => MYSQLI_TYPE_STRING, 'name' => 'actor_id']),
FieldHelper::fromArray(['type' => MYSQLI_TYPE_STRING, 'name' => 'first_name']),
FieldHelper::fromArray(['type' => MYSQLI_TYPE_STRING, 'name' => 'last_name']),
FieldHelper::fromArray(['type' => MYSQLI_TYPE_STRING, 'name' => 'last_update']),
],
'available_mime' => [],
'mime_map' => [],
];
$expected = [
'is_backup' => true,
'fields_meta' => [$columnMeta],
'relation_parameters' => $relation->getRelationParameters(),
'action' => '/table/structure/save',
'form_params' => [
'db' => 'sakila',
'table' => 'actor',
'orig_num_fields' => 1,
'orig_field_where' => null,
'orig_after_field' => null,
'selected[0]' => 'actor_id',
'field_orig[0]' => 'actor_id',
'field_type_orig[0]' => 'SMALLINT',
'field_length_orig[0]' => '5',
'field_default_value_orig[0]' => '',
'field_default_type_orig[0]' => 'NONE',
'field_collation_orig[0]' => '',
'field_attribute_orig[0]' => 'UNSIGNED',
'field_null_orig[0]' => 'NO',
'field_extra_orig[0]' => 'auto_increment',
'field_comments_orig[0]' => '',
'field_virtuality_orig[0]' => '',
'field_expression_orig[0]' => '',
],
'content_cells' => [$contentCell],
'partition_details' => [
'partition_by' => null,
'partition_expr' => null,
'subpartition_by' => null,
'subpartition_expr' => null,
'partition_count' => 0,
'subpartition_count' => 0,
'can_have_subpartitions' => false,
'value_enabled' => false,
],
'primary_indexes' => null,
'unique_indexes' => null,
'indexes' => null,
'fulltext_indexes' => null,
'spatial_indexes' => null,
'table' => null,
'comment' => null,
'tbl_collation' => null,
'charsets' => [
[
'name' => 'armscii8',
'description' => 'armscii8_general_ci',
'collations' => [['name' => 'armscii8_general_ci', 'description' => 'Armenian, case-insensitive']],
],
[
'name' => 'latin1',
'description' => 'cp1252 West European',
'collations' => [['name' => 'latin1_swedish_ci', 'description' => 'Swedish, case-insensitive']],
],
[
'name' => 'utf8',
'description' => 'UTF-8 Unicode',
'collations' => [
['name' => 'utf8_bin', 'description' => 'Unicode, binary'],
['name' => 'utf8_general_ci', 'description' => 'Unicode, case-insensitive'],
],
],
[
'name' => 'utf8mb4',
'description' => 'utf8mb4_0900_ai_ci',
'collations' => [
['name' => 'utf8mb4_general_ci', 'description' => 'Unicode (UCA 4.0.0), case-insensitive'],
],
],
],
'tbl_storage_engine' => null,
'storage_engines' => ['dummy' => ['name' => 'dummy', 'comment' => 'dummy comment', 'is_default' => false]],
'connection' => null,
'change_column' => null,
'is_virtual_columns_supported' => true,
'is_integers_length_restricted' => false,
'browse_mime' => true,
'supports_stored_keyword' => true,
'server_version' => $dbi->getVersion(),
'max_rows' => 25,
'char_editing' => 'input',
'attribute_types' => ['', 'BINARY', 'UNSIGNED', 'UNSIGNED ZEROFILL', 'on update CURRENT_TIMESTAMP'],
'privs_available' => true,
'max_length' => 1024,
'have_partitioning' => true,
'disable_is' => false,
];
$this->assertEquals($expected, $actual);
}
/**
* test for ColumnsDefinition::decorateColumnMetaDefault
*
* @phpstan-param array<string, string> $expected
*/
#[DataProvider('providerColumnMetaDefault')]
public function testDecorateColumnMetaDefault(
string $type,
string|null $default,
bool $isNull,
array $expected,
): void {
$result = ColumnsDefinition::decorateColumnMetaDefault($type, $default, $isNull);
$this->assertEquals($expected, $result);
}
/**
* Data provider for testDecorateColumnMetaDefault
*
* @psalm-return array<string, array{string, string|null, bool, array<string, string>}>
*/
public static function providerColumnMetaDefault(): array
{
return [
'when Default is null and Null is YES' => [
'',
null,
true,
['DefaultType' => 'NULL', 'DefaultValue' => ''],
],
'when Default is null and Null is NO' => [
'',
null,
false,
['DefaultType' => 'NONE', 'DefaultValue' => ''],
],
'when Default is CURRENT_TIMESTAMP' => [
'',
'CURRENT_TIMESTAMP',
false,
['DefaultType' => 'CURRENT_TIMESTAMP', 'DefaultValue' => ''],
],
'when Default is current_timestamp' => [
'',
'current_timestamp()',
false,
['DefaultType' => 'CURRENT_TIMESTAMP', 'DefaultValue' => ''],
],
'when Default is UUID' => [
'',
'UUID',
false,
['DefaultType' => 'UUID', 'DefaultValue' => ''],
],
'when Default is uuid()' => [
'',
'uuid()',
false,
['DefaultType' => 'UUID', 'DefaultValue' => ''],
],
'when Default is anything else and Type is text' => [
'text',
'"some\/thing"',
false,
['Default' => 'some/thing', 'DefaultType' => 'USER_DEFINED', 'DefaultValue' => '"some\/thing"'],
],
'when Default is anything else and Type is not text' => [
'something',
'"some\/thing"',
false,
['DefaultType' => 'USER_DEFINED', 'DefaultValue' => '"some\/thing"'],
],
];
}
}