phpmyadmin/tests/unit/Table/IndexesTest.php
Maurício Meneghini Fauth c52edb3e07
Move indexes classes to the Indexes namespace
Signed-off-by: Maurício Meneghini Fauth <mauricio@mfauth.net>
2025-03-30 14:23:23 -03:00

90 lines
2.9 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpMyAdmin\Tests\Table;
use PhpMyAdmin\Current;
use PhpMyAdmin\Dbal\DatabaseInterface;
use PhpMyAdmin\Indexes\Index;
use PhpMyAdmin\Message;
use PhpMyAdmin\Table\Indexes;
use PhpMyAdmin\Table\Table;
use PhpMyAdmin\Tests\AbstractTestCase;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\MockObject\MockObject;
#[CoversClass(Indexes::class)]
class IndexesTest extends AbstractTestCase
{
private DatabaseInterface&MockObject $dbi;
protected function setUp(): void
{
parent::setUp();
Current::$database = 'db';
Current::$table = 'table';
$this->dbi = $this->getMockBuilder(DatabaseInterface::class)
->disableOriginalConstructor()
->getMock();
}
public function testGetSqlQueryForRename(): void
{
$sqlQuery = 'ALTER TABLE `db`.`table` RENAME INDEX `0` TO `ABC`;';
$this->dbi->expects(self::any())->method('getVersion')
->willReturn(50700);
$index = new Index(['Key_name' => 'ABC']);
$indexes = new Indexes($this->dbi);
$sqlResult = $indexes->getSqlQueryForRename('0', $index, Current::$database, Current::$table);
self::assertStringContainsString($sqlQuery, $sqlResult);
// Error message
$index->setName('NOT PRIMARY'); // Cannot rename primary so the operation should fail
$indexes->getSqlQueryForRename('PRIMARY', $index, Current::$database, Current::$table);
$error = $indexes->getError();
self::assertInstanceOf(Message::class, $error);
$index->setName('PRIMARY'); // The new name cannot be PRIMARY so the operation should fail
$indexes->getSqlQueryForRename('NOT PRIMARY', $index, Current::$database, Current::$table);
$error = $indexes->getError();
self::assertInstanceOf(Message::class, $error);
}
public function testGetSqlQueryForIndexCreateOrEdit(): void
{
$table = $this->getMockBuilder(Table::class)
->disableOriginalConstructor()
->getMock();
$this->dbi->expects(self::any())->method('getTable')
->willReturn($table);
$indexes = new Indexes($this->dbi);
$db = 'pma_db';
$table = 'pma_table';
$index = new Index([
'Key_name' => 'PRIMARY',
'columns' => [['Column_name' => 'id']],
]);
$sqlQueryExpected = 'ALTER TABLE `pma_db`.`pma_table` DROP PRIMARY KEY, ADD PRIMARY KEY (`id`);';
$_POST['old_index'] = 'PRIMARY';
self::assertSame(
$sqlQueryExpected,
$indexes->getSqlQueryForIndexCreateOrEdit('PRIMARY', $index, $db, $table),
);
// Error message
$index->setName('NOT PRIMARY'); // Cannot rename primary so the operation should fail
$indexes->getSqlQueryForIndexCreateOrEdit('PRIMARY', $index, $db, $table);
self::assertInstanceOf(Message::class, $indexes->getError());
}
}