223 lines
9.0 KiB
PHP
223 lines
9.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace PhpMyAdmin\Tests\Controllers\Table;
|
|
|
|
use PhpMyAdmin\Config;
|
|
use PhpMyAdmin\Config\PageSettings;
|
|
use PhpMyAdmin\ConfigStorage\Relation;
|
|
use PhpMyAdmin\Controllers\Table\ChangeController;
|
|
use PhpMyAdmin\Current;
|
|
use PhpMyAdmin\Dbal\DatabaseInterface;
|
|
use PhpMyAdmin\DbTableExists;
|
|
use PhpMyAdmin\FileListing;
|
|
use PhpMyAdmin\Http\Factory\ServerRequestFactory;
|
|
use PhpMyAdmin\InsertEdit;
|
|
use PhpMyAdmin\Template;
|
|
use PhpMyAdmin\Tests\AbstractTestCase;
|
|
use PhpMyAdmin\Tests\Stubs\ResponseRenderer;
|
|
use PhpMyAdmin\Transformations;
|
|
use PhpMyAdmin\UserPreferences;
|
|
use PHPUnit\Framework\Attributes\CoversClass;
|
|
|
|
#[CoversClass(ChangeController::class)]
|
|
final class ChangeControllerTest extends AbstractTestCase
|
|
{
|
|
public function testChangeController(): void
|
|
{
|
|
Current::$database = 'test_db';
|
|
Current::$table = 'test_table';
|
|
Current::$whereClause = null;
|
|
|
|
$dummyDbi = $this->createDbiDummy();
|
|
$dummyDbi->addSelectDb('test_db');
|
|
$dummyDbi->addResult('SELECT 1 FROM `test_db`.`test_table` LIMIT 1;', [['1']]);
|
|
$dummyDbi->addResult(
|
|
'SELECT * FROM `test_db`.`test_table` LIMIT 1;',
|
|
[['1', 'abcd', '2011-01-20 02:00:02']],
|
|
['id', 'name', 'datetimefield'],
|
|
);
|
|
$dummyDbi->addSelectDb('test_db');
|
|
$dbi = $this->createDatabaseInterface($dummyDbi);
|
|
DatabaseInterface::$instance = $dbi;
|
|
|
|
$response = new ResponseRenderer();
|
|
$pageSettings = new PageSettings(
|
|
new UserPreferences($dbi, new Relation($dbi), new Template()),
|
|
);
|
|
$pageSettings->init('Edit');
|
|
|
|
$request = ServerRequestFactory::create()->createServerRequest('POST', 'http://example.com/')
|
|
->withQueryParams(['db' => 'test_db', 'table' => 'test_table'])
|
|
->withParsedBody(['insert_rows' => '0']);
|
|
|
|
$config = Config::getInstance();
|
|
$config->set('InsertRows', 3);
|
|
$config->set('ShowFunctionFields', true);
|
|
$config->set('ShowFieldTypesInDataEditView', true);
|
|
|
|
$relation = new Relation($dbi);
|
|
$template = new Template();
|
|
(new ChangeController(
|
|
$response,
|
|
$template,
|
|
new InsertEdit($dbi, $relation, new Transformations(), new FileListing(), $template, $config),
|
|
$relation,
|
|
$pageSettings,
|
|
new DbTableExists($dbi),
|
|
$config,
|
|
))($request);
|
|
$actual = $response->getHTMLResult();
|
|
|
|
self::assertStringContainsString($pageSettings->getHTML(), $actual);
|
|
// phpcs:disable Generic.Files.LineLength.TooLong
|
|
self::assertStringContainsString(
|
|
<<<'HTML'
|
|
<input type="text" name="fields[multi_edit][0][b80bb7740288fda1f201890375a60c8f]"
|
|
value="NULL" size="4" min="-2147483648" max="2147483647" data-type="INT"
|
|
class="textfield"
|
|
onchange="return verificationsAfterFieldChange("b80bb7740288fda1f201890375a60c8f", "0","int(11)")"
|
|
tabindex="1" inputmode="numeric"
|
|
id="field_1_3"><input type="hidden" name="auto_increment[multi_edit][0][b80bb7740288fda1f201890375a60c8f]" value="1">
|
|
HTML,
|
|
$actual,
|
|
);
|
|
self::assertStringContainsString(
|
|
<<<'HTML'
|
|
<input type="text" name="fields[multi_edit][0][b068931cc450442b63f5b3d276ea4297]"
|
|
value="NULL" size="20" data-maxlength="20" data-type="CHAR"
|
|
class="textfield"
|
|
onchange="return verificationsAfterFieldChange("b068931cc450442b63f5b3d276ea4297", "0","varchar(20)")"
|
|
tabindex="2"
|
|
id="field_2_3">
|
|
HTML,
|
|
$actual,
|
|
);
|
|
self::assertStringContainsString(
|
|
<<<'HTML'
|
|
<input type="text" name="fields[multi_edit][0][a55dbdcc1a45ed90dbee68864d566b99]"
|
|
value="NULL.000000" size="4" data-type="DATE"
|
|
class="textfield datetimefield"
|
|
onchange="return verificationsAfterFieldChange("a55dbdcc1a45ed90dbee68864d566b99", "0","datetime")"
|
|
tabindex="3"
|
|
id="field_3_3"><input type="hidden" name="fields_type[multi_edit][0][a55dbdcc1a45ed90dbee68864d566b99]" value="datetime">
|
|
HTML,
|
|
$actual,
|
|
);
|
|
// phpcs:enable
|
|
self::assertStringContainsString(
|
|
'<th><a href="index.php?route=/table/change&lang=en" data-post="db=test_db&table=test_table'
|
|
. '&ShowFieldTypesInDataEditView=0&ShowFunctionFields=1'
|
|
. '&goto=index.php%3Froute%3D%2Fsql%26lang%3Den&lang=en" title="Hide">Type</a></th>',
|
|
$actual,
|
|
);
|
|
self::assertStringContainsString(
|
|
'<th><a href="index.php?route=/table/change&lang=en" data-post="db=test_db&table=test_table'
|
|
. '&ShowFunctionFields=0&ShowFieldTypesInDataEditView=1'
|
|
. '&goto=index.php%3Froute%3D%2Fsql%26lang%3Den&lang=en" title="Hide">Function</a></th>',
|
|
$actual,
|
|
);
|
|
self::assertStringContainsString(
|
|
'<input class="form-control" type="number" name="insert_rows" id="insert_rows" value="3" min="1">',
|
|
$actual,
|
|
);
|
|
|
|
$dummyDbi->assertAllSelectsConsumed();
|
|
$dummyDbi->assertAllQueriesConsumed();
|
|
}
|
|
|
|
public function testChangeController2(): void
|
|
{
|
|
Current::$database = 'test_db';
|
|
Current::$table = 'test_table';
|
|
Current::$whereClause = null;
|
|
|
|
$dummyDbi = $this->createDbiDummy();
|
|
$dummyDbi->addSelectDb('test_db');
|
|
$dummyDbi->addResult('SELECT 1 FROM `test_db`.`test_table` LIMIT 1;', [['1']]);
|
|
$dummyDbi->addResult(
|
|
'SELECT * FROM `test_db`.`test_table` LIMIT 1;',
|
|
[['1', 'abcd', '2011-01-20 02:00:02']],
|
|
['id', 'name', 'datetimefield'],
|
|
);
|
|
$dummyDbi->addSelectDb('test_db');
|
|
$dbi = $this->createDatabaseInterface($dummyDbi);
|
|
DatabaseInterface::$instance = $dbi;
|
|
|
|
$response = new ResponseRenderer();
|
|
$pageSettings = new PageSettings(
|
|
new UserPreferences($dbi, new Relation($dbi), new Template()),
|
|
);
|
|
$pageSettings->init('Edit');
|
|
|
|
$request = ServerRequestFactory::create()->createServerRequest('GET', 'http://example.com/')
|
|
->withQueryParams(['db' => 'test_db', 'table' => 'test_table'])
|
|
->withParsedBody(['insert_rows' => '1']);
|
|
|
|
$config = Config::getInstance();
|
|
$config->set('InsertRows', 3);
|
|
$config->set('ShowFunctionFields', false);
|
|
$config->set('ShowFieldTypesInDataEditView', false);
|
|
|
|
$relation = new Relation($dbi);
|
|
$template = new Template();
|
|
(new ChangeController(
|
|
$response,
|
|
$template,
|
|
new InsertEdit($dbi, $relation, new Transformations(), new FileListing(), $template, $config),
|
|
$relation,
|
|
$pageSettings,
|
|
new DbTableExists($dbi),
|
|
$config,
|
|
))($request);
|
|
$actual = $response->getHTMLResult();
|
|
|
|
self::assertStringContainsString(
|
|
'<input class="form-control" type="number" name="insert_rows" id="insert_rows" value="1" min="1">',
|
|
$actual,
|
|
);
|
|
self::assertStringContainsString(
|
|
'Show : <a href="index.php?route=/table/change&lang=en" data-post="'
|
|
. 'db=test_db&table=test_table&ShowFunctionFields=1&ShowFieldTypesInDataEditView=0'
|
|
. '&goto=index.php%3Froute%3D%2Fsql%26lang%3Den&lang=en">Function</a> : <a href="'
|
|
. 'index.php?route=/table/change&lang=en" data-post="db=test_db&table=test_table'
|
|
. '&ShowFieldTypesInDataEditView=1&ShowFunctionFields=0'
|
|
. '&goto=index.php%3Froute%3D%2Fsql%26lang%3Den&lang=en">Type</a>',
|
|
$actual,
|
|
);
|
|
|
|
$dummyDbi->assertAllSelectsConsumed();
|
|
$dummyDbi->assertAllQueriesConsumed();
|
|
}
|
|
|
|
/**
|
|
* Test for urlParamsInEditMode
|
|
*/
|
|
public function testUrlParamsInEditMode(): void
|
|
{
|
|
$changeController = new ChangeController(
|
|
self::createStub(ResponseRenderer::class),
|
|
self::createStub(Template::class),
|
|
self::createStub(InsertEdit::class),
|
|
self::createStub(Relation::class),
|
|
self::createStub(PageSettings::class),
|
|
new DbTableExists($this->createDatabaseInterface()),
|
|
self::createStub(Config::class),
|
|
);
|
|
|
|
$whereClauseArray = ['foo=1', 'bar=2'];
|
|
$_POST['sql_query'] = 'SELECT 1';
|
|
|
|
$request = ServerRequestFactory::create()->createServerRequest('POST', 'http://example.com/')
|
|
->withParsedBody(['sql_query' => 'SELECT 1']);
|
|
|
|
$result = $changeController->urlParamsInEditMode($request, ['temp' => 1], $whereClauseArray);
|
|
|
|
self::assertSame(
|
|
['temp' => 1, 'where_clause' => 'bar=2', 'sql_query' => 'SELECT 1'],
|
|
$result,
|
|
);
|
|
}
|
|
}
|