diff options
author | Maurício Meneghini Fauth <mauricio@fauth.dev> | 2021-09-08 03:19:43 +0300 |
---|---|---|
committer | Maurício Meneghini Fauth <mauricio@fauth.dev> | 2021-09-08 03:19:43 +0300 |
commit | e3554879ef7a4879446db25669563df004f832a2 (patch) | |
tree | 6a5788e42622d01918d81971e93b178dd09a6831 /test | |
parent | a73e26c81f0ed01fe717e476ab3c7937efa702e4 (diff) |
Extract actions from controllers to new controllers
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
Diffstat (limited to 'test')
7 files changed, 347 insertions, 195 deletions
diff --git a/test/classes/Controllers/Database/Structure/FavoriteTableControllerTest.php b/test/classes/Controllers/Database/Structure/FavoriteTableControllerTest.php new file mode 100644 index 0000000000..31eb2229f4 --- /dev/null +++ b/test/classes/Controllers/Database/Structure/FavoriteTableControllerTest.php @@ -0,0 +1,63 @@ +<?php + +declare(strict_types=1); + +namespace PhpMyAdmin\Tests\Controllers\Database\Structure; + +use PhpMyAdmin\Controllers\Database\Structure\FavoriteTableController; +use PhpMyAdmin\RecentFavoriteTable; +use PhpMyAdmin\Relation; +use PhpMyAdmin\Template; +use PhpMyAdmin\Tests\AbstractTestCase; +use PhpMyAdmin\Tests\Stubs\ResponseRenderer as ResponseStub; +use ReflectionClass; + +use function json_encode; + +/** + * @covers \PhpMyAdmin\Controllers\Database\Structure\FavoriteTableController + */ +class FavoriteTableControllerTest extends AbstractTestCase +{ + public function testSynchronizeFavoriteTables(): void + { + $GLOBALS['server'] = 1; + $GLOBALS['text_dir'] = 'ltr'; + $GLOBALS['PMA_PHP_SELF'] = 'index.php'; + + $favoriteInstance = $this->getMockBuilder(RecentFavoriteTable::class) + ->disableOriginalConstructor() + ->getMock(); + $favoriteInstance->expects($this->exactly(2)) + ->method('getTables') + ->will($this->onConsecutiveCalls([[]], [['db' => 'db', 'table' => 'table']])); + + $class = new ReflectionClass(FavoriteTableController::class); + $method = $class->getMethod('synchronizeFavoriteTables'); + $method->setAccessible(true); + $template = new Template(); + + $controller = new FavoriteTableController( + new ResponseStub(), + $template, + 'db', + new Relation($this->dbi, $template) + ); + + // The user hash for test + $user = 'abcdefg'; + $favoriteTable = [ + $user => [ + [ + 'db' => 'db', + 'table' => 'table', + ], + ], + ]; + + $json = $method->invokeArgs($controller, [$favoriteInstance, $user, $favoriteTable]); + + $this->assertEquals(json_encode($favoriteTable), $json['favoriteTables'] ?? ''); + $this->assertArrayHasKey('list', $json); + } +} diff --git a/test/classes/Controllers/Database/Structure/RealRowCountControllerTest.php b/test/classes/Controllers/Database/Structure/RealRowCountControllerTest.php new file mode 100644 index 0000000000..07ddd9ad8d --- /dev/null +++ b/test/classes/Controllers/Database/Structure/RealRowCountControllerTest.php @@ -0,0 +1,50 @@ +<?php + +declare(strict_types=1); + +namespace PhpMyAdmin\Tests\Controllers\Database\Structure; + +use PhpMyAdmin\Controllers\Database\Structure\RealRowCountController; +use PhpMyAdmin\Template; +use PhpMyAdmin\Tests\AbstractTestCase; +use PhpMyAdmin\Tests\Stubs\ResponseRenderer as ResponseStub; + +use function json_encode; + +/** + * @covers \PhpMyAdmin\Controllers\Database\Structure\RealRowCountController + */ +class RealRowCountControllerTest extends AbstractTestCase +{ + public function testRealRowCount(): void + { + $GLOBALS['server'] = 1; + $GLOBALS['text_dir'] = 'ltr'; + $GLOBALS['PMA_PHP_SELF'] = 'index.php'; + $GLOBALS['cfg']['Server']['DisableIS'] = true; + $GLOBALS['is_db'] = true; + $GLOBALS['db'] = 'world'; + + $response = new ResponseStub(); + $response->setAjax(true); + + $_REQUEST['table'] = 'City'; + + (new RealRowCountController($response, new Template(), 'world', $this->dbi))(); + + $json = $response->getJSONResult(); + $this->assertEquals('4,079', $json['real_row_count']); + + $_REQUEST['real_row_count_all'] = 'on'; + + (new RealRowCountController($response, new Template(), 'world', $this->dbi))(); + + $json = $response->getJSONResult(); + $expected = [ + ['table' => 'City', 'row_count' => 4079], + ['table' => 'Country', 'row_count' => 239], + ['table' => 'CountryLanguage', 'row_count' => 984], + ]; + $this->assertEquals(json_encode($expected), $json['real_row_count_all']); + } +} diff --git a/test/classes/Controllers/Database/StructureControllerTest.php b/test/classes/Controllers/Database/StructureControllerTest.php index 576a1e7804..5aa1a450a5 100644 --- a/test/classes/Controllers/Database/StructureControllerTest.php +++ b/test/classes/Controllers/Database/StructureControllerTest.php @@ -8,7 +8,6 @@ use PhpMyAdmin\Controllers\Database\StructureController; use PhpMyAdmin\DatabaseInterface; use PhpMyAdmin\FlashMessages; use PhpMyAdmin\Operations; -use PhpMyAdmin\RecentFavoriteTable; use PhpMyAdmin\Relation; use PhpMyAdmin\RelationCleanup; use PhpMyAdmin\Replication; @@ -16,12 +15,9 @@ use PhpMyAdmin\Table; use PhpMyAdmin\Template; use PhpMyAdmin\Tests\AbstractTestCase; use PhpMyAdmin\Tests\Stubs\ResponseRenderer as ResponseStub; -use PHPUnit\Framework\MockObject\MockObject; use ReflectionClass; use ReflectionException; -use function json_encode; - /** * @covers \PhpMyAdmin\Controllers\Database\StructureController */ @@ -393,113 +389,6 @@ class StructureControllerTest extends AbstractTestCase } /** - * Tests for synchronizeFavoriteTables() - */ - public function testSynchronizeFavoriteTables(): void - { - $favoriteInstance = $this->getFavoriteTablesMock(); - - $class = new ReflectionClass(StructureController::class); - $method = $class->getMethod('synchronizeFavoriteTables'); - $method->setAccessible(true); - - $controller = new StructureController( - $this->response, - $this->template, - $GLOBALS['db'], - $this->relation, - $this->replication, - $this->relationCleanup, - $this->operations, - $GLOBALS['dbi'], - $this->flash - ); - - // The user hash for test - $user = 'abcdefg'; - $favoriteTable = [ - $user => [ - [ - 'db' => 'db', - 'table' => 'table', - ], - ], - ]; - - $json = $method->invokeArgs($controller, [$favoriteInstance, $user, $favoriteTable]); - - $this->assertEquals(json_encode($favoriteTable), $json['favoriteTables'] ?? ''); - $this->assertArrayHasKey('list', $json); - } - - /** - * @return MockObject|RecentFavoriteTable - */ - private function getFavoriteTablesMock() - { - $favoriteInstance = $this->getMockBuilder(RecentFavoriteTable::class) - ->disableOriginalConstructor() - ->getMock(); - $favoriteInstance->expects($this->exactly(2)) - ->method('getTables') - ->will($this->onConsecutiveCalls([[]], [['db' => 'db', 'table' => 'table']])); - - return $favoriteInstance; - } - - /** - * Tests for handleRealRowCountRequestAction() - */ - public function testHandleRealRowCountRequestAction(): void - { - global $is_db; - - $is_db = true; - - $this->response->setAjax(true); - $controller = new StructureController( - $this->response, - $this->template, - $GLOBALS['db'], - $this->relation, - $this->replication, - $this->relationCleanup, - $this->operations, - $GLOBALS['dbi'], - $this->flash - ); - // Showing statistics - $class = new ReflectionClass(StructureController::class); - $property = $class->getProperty('tables'); - $property->setAccessible(true); - - $_REQUEST['table'] = 'table'; - $controller->handleRealRowCountRequestAction(); - $json = $this->response->getJSONResult(); - $this->assertEquals( - 6, - $json['real_row_count'] - ); - - // Fall into another branch - $property->setValue($controller, [['TABLE_NAME' => 'table']]); - $_REQUEST['real_row_count_all'] = 'abc'; - $controller->handleRealRowCountRequestAction(); - $json = $this->response->getJSONResult(); - - $expectedResult = [ - [ - 'table' => 'table', - 'row_count' => 6, - ], - ]; - $this->assertEquals( - json_encode($expectedResult), - $json['real_row_count_all'] - ); - } - - /** * @throws ReflectionException */ public function testDisplayTableList(): void diff --git a/test/classes/Controllers/Server/Databases/CreateControllerTest.php b/test/classes/Controllers/Server/Databases/CreateControllerTest.php new file mode 100644 index 0000000000..53116cfa6a --- /dev/null +++ b/test/classes/Controllers/Server/Databases/CreateControllerTest.php @@ -0,0 +1,61 @@ +<?php + +declare(strict_types=1); + +namespace PhpMyAdmin\Tests\Controllers\Server\Databases; + +use PhpMyAdmin\Controllers\Server\Databases\CreateController; +use PhpMyAdmin\Template; +use PhpMyAdmin\Tests\AbstractTestCase; +use PhpMyAdmin\Tests\Stubs\ResponseRenderer; + +use function __; +use function sprintf; + +/** + * @covers \PhpMyAdmin\Controllers\Server\Databases\CreateController + */ +final class CreateControllerTest extends AbstractTestCase +{ + public function testCreateDatabase(): void + { + $GLOBALS['server'] = 1; + $GLOBALS['text_dir'] = 'ltr'; + $GLOBALS['PMA_PHP_SELF'] = 'index.php'; + $GLOBALS['cfg']['Server']['DisableIS'] = false; + $GLOBALS['db'] = 'pma_test'; + $GLOBALS['table'] = ''; + + $response = new ResponseRenderer(); + $response->setAjax(true); + + $template = new Template(); + $controller = new CreateController($response, $template, $this->dbi); + + $_POST['new_db'] = 'test_db_error'; + + $controller(); + $actual = $response->getJSONResult(); + + $this->assertArrayHasKey('message', $actual); + $this->assertStringContainsString('<div class="alert alert-danger" role="alert">', $actual['message']); + + $response = new ResponseRenderer(); + $response->setAjax(true); + + $controller = new CreateController($response, $template, $this->dbi); + + $_POST['new_db'] = 'test_db'; + $_POST['db_collation'] = 'utf8_general_ci'; + + $controller(); + $actual = $response->getJSONResult(); + + $this->assertArrayHasKey('message', $actual); + $this->assertStringContainsString('<div class="alert alert-success" role="alert">', $actual['message']); + $this->assertStringContainsString( + sprintf(__('Database %1$s has been created.'), 'test_db'), + $actual['message'] + ); + } +} diff --git a/test/classes/Controllers/Server/Databases/DestroyControllerTest.php b/test/classes/Controllers/Server/Databases/DestroyControllerTest.php new file mode 100644 index 0000000000..377d84dc24 --- /dev/null +++ b/test/classes/Controllers/Server/Databases/DestroyControllerTest.php @@ -0,0 +1,58 @@ +<?php + +declare(strict_types=1); + +namespace PhpMyAdmin\Tests\Controllers\Server\Databases; + +use PhpMyAdmin\Controllers\Server\Databases\DestroyController; +use PhpMyAdmin\DatabaseInterface; +use PhpMyAdmin\Relation; +use PhpMyAdmin\RelationCleanup; +use PhpMyAdmin\Template; +use PhpMyAdmin\Tests\AbstractTestCase; +use PhpMyAdmin\Tests\Stubs\ResponseRenderer; +use PhpMyAdmin\Transformations; + +use function __; + +/** + * @covers \PhpMyAdmin\Controllers\Server\Databases\DestroyController + */ +class DestroyControllerTest extends AbstractTestCase +{ + public function testDropDatabases(): void + { + global $cfg; + + $GLOBALS['server'] = 1; + $GLOBALS['text_dir'] = 'ltr'; + $GLOBALS['PMA_PHP_SELF'] = 'index.php'; + + $dbi = $this->getMockBuilder(DatabaseInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $response = new ResponseRenderer(); + $response->setAjax(true); + + $cfg['AllowUserDropDatabase'] = true; + + $template = new Template(); + $controller = new DestroyController( + $response, + $template, + $dbi, + new Transformations(), + new RelationCleanup($dbi, new Relation($dbi, $template)) + ); + + $_POST['drop_selected_dbs'] = '1'; + + $controller(); + $actual = $response->getJSONResult(); + + $this->assertArrayHasKey('message', $actual); + $this->assertStringContainsString('<div class="alert alert-danger" role="alert">', $actual['message']); + $this->assertStringContainsString(__('No databases selected.'), $actual['message']); + } +} diff --git a/test/classes/Controllers/Server/DatabasesControllerTest.php b/test/classes/Controllers/Server/DatabasesControllerTest.php index 40815e6718..0e60029bd4 100644 --- a/test/classes/Controllers/Server/DatabasesControllerTest.php +++ b/test/classes/Controllers/Server/DatabasesControllerTest.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace PhpMyAdmin\Tests\Controllers\Server; use PhpMyAdmin\Controllers\Server\DatabasesController; -use PhpMyAdmin\DatabaseInterface; use PhpMyAdmin\Relation; use PhpMyAdmin\RelationCleanup; use PhpMyAdmin\Template; @@ -15,7 +14,6 @@ use PhpMyAdmin\Transformations; use stdClass; use function __; -use function sprintf; /** * @covers \PhpMyAdmin\Controllers\Server\DatabasesController @@ -64,7 +62,7 @@ class DatabasesControllerTest extends AbstractTestCase ); $this->dummyDbi->addSelectDb('mysql'); - $controller->index(); + $controller(); $this->assertAllSelectsConsumed(); $actual = $response->getHTMLResult(); @@ -101,7 +99,7 @@ class DatabasesControllerTest extends AbstractTestCase $_REQUEST['sort_order'] = 'desc'; $this->dummyDbi->addSelectDb('mysql'); - $controller->index(); + $controller(); $this->assertAllSelectsConsumed(); $actual = $response->getHTMLResult(); @@ -117,84 +115,4 @@ class DatabasesControllerTest extends AbstractTestCase $this->assertStringContainsString('MiB', $actual); $this->assertStringContainsString('name="db_collation"', $actual); } - - public function testCreateDatabaseAction(): void - { - $response = new ResponseRenderer(); - $response->setAjax(true); - - $template = new Template(); - $transformations = new Transformations(); - $controller = new DatabasesController( - $response, - $template, - $transformations, - new RelationCleanup($this->dbi, new Relation($this->dbi, $template)), - $this->dbi - ); - - $_POST['new_db'] = 'test_db_error'; - - $controller->create(); - $actual = $response->getJSONResult(); - - $this->assertArrayHasKey('message', $actual); - $this->assertStringContainsString('<div class="alert alert-danger" role="alert">', $actual['message']); - - $response = new ResponseRenderer(); - $response->setAjax(true); - - $controller = new DatabasesController( - $response, - $template, - $transformations, - new RelationCleanup($this->dbi, new Relation($this->dbi, $template)), - $this->dbi - ); - - $_POST['new_db'] = 'test_db'; - $_POST['db_collation'] = 'utf8_general_ci'; - - $controller->create(); - $actual = $response->getJSONResult(); - - $this->assertArrayHasKey('message', $actual); - $this->assertStringContainsString('<div class="alert alert-success" role="alert">', $actual['message']); - $this->assertStringContainsString( - sprintf(__('Database %1$s has been created.'), 'test_db'), - $actual['message'] - ); - } - - public function testDropDatabasesAction(): void - { - global $cfg; - - $dbi = $this->getMockBuilder(DatabaseInterface::class) - ->disableOriginalConstructor() - ->getMock(); - - $response = new ResponseRenderer(); - $response->setAjax(true); - - $cfg['AllowUserDropDatabase'] = true; - - $template = new Template(); - $controller = new DatabasesController( - $response, - $template, - new Transformations(), - new RelationCleanup($dbi, new Relation($dbi, $template)), - $dbi - ); - - $_POST['drop_selected_dbs'] = '1'; - - $controller->destroy(); - $actual = $response->getJSONResult(); - - $this->assertArrayHasKey('message', $actual); - $this->assertStringContainsString('<div class="alert alert-danger" role="alert">', $actual['message']); - $this->assertStringContainsString(__('No databases selected.'), $actual['message']); - } } diff --git a/test/classes/Stubs/DbiDummy.php b/test/classes/Stubs/DbiDummy.php index eebc63d455..82632fa6cb 100644 --- a/test/classes/Stubs/DbiDummy.php +++ b/test/classes/Stubs/DbiDummy.php @@ -3026,6 +3026,119 @@ class DbiDummy implements DbiExtension ], ], ], + [ + 'query' => 'SHOW TABLE STATUS FROM `world`', + 'columns' => [ + 'Name', + 'Engine', + 'Version', + 'Row_format', + 'Rows', + 'Avg_row_length', + 'Data_length', + 'Max_data_length', + 'Index_length', + 'Data_free', + 'Auto_increment', + 'Create_time', + 'Update_time', + 'Check_time', + 'Collation', + 'Checksum', + 'Create_options', + 'Comment', + 'Max_index_length', + 'Temporary', + ], + 'result' => [ + [ + 'City', + 'InnoDB', + '10', + 'Dynamic', + '4046', + '101', + '409600', + '0', + '114688', + '0', + '4080', + '2020-07-03 17:24:47', + null, + null, + 'utf8mb4_general_ci', + null, + '', + '', + '0', + 'N', + ], + [ + 'Country', + 'InnoDB', + '10', + 'Dynamic', + '239', + '479', + '114688', + '0', + '0', + '0', + null, + '2020-07-03 17:24:47', + null, + null, + 'utf8mb4_general_ci', + null, + '', + '', + '0', + 'N', + ], + [ + 'CountryLanguage', + 'InnoDB', + '10', + 'Dynamic', + '984', + '99', + '98304', + '0', + '65536', + '0', + null, + '2020-07-03 17:24:47', + null, + null, + 'utf8mb4_general_ci', + null, + '', + '', + '0', + 'N', + ], + ], + ], + [ + 'query' => 'SHOW TABLES FROM `world`;', + 'columns' => ['Tables_in_world'], + 'result' => [['City'], ['Country'], ['CountryLanguage']], + ], + [ + 'query' => 'SELECT COUNT(*) AS `row_count` FROM `world`.`City`', + 'columns' => ['row_count'], + 'result' => [['4079']], + ], + [ + 'query' => 'SELECT COUNT(*) AS `row_count` FROM `world`.`Country`', + 'columns' => ['row_count'], + 'result' => [['239']], + ], + [ + 'query' => 'SELECT COUNT(*) AS `row_count` FROM `world`.`CountryLanguage`', + 'columns' => ['row_count'], + 'result' => [['984']], + ], ]; /* Some basic setup for dummy driver */ |