/**
  * Constructor
  */
 public function __construct()
 {
     $container = Container::getDefaultContainer();
     $this->container = $container;
     $this->dbi = $this->container->get('dbi');
     $this->response = $this->container->get('response');
 }
 /**
  * Tests for getValuesForInnodbTable()
  *
  * @return void
  * @test
  */
 public function testGetValuesForInnodbTable()
 {
     $container = Container::getDefaultContainer();
     $container->set('db', 'db');
     $container->set('table', 'table');
     $container->set('dbi', $GLOBALS['dbi']);
     $response = new \PMA\Test\Stubs\Response();
     $container->set('PMA\\libraries\\Response', $response);
     $container->alias('response', 'PMA\\libraries\\Response');
     $class = new ReflectionClass('PMA\\libraries\\controllers\\database\\DatabaseStructureController');
     $method = $class->getMethod('getValuesForInnodbTable');
     $method->setAccessible(true);
     $ctrl = new DatabaseStructureController($GLOBALS['db'], null);
     // Showing statistics
     $property = $class->getProperty('_is_show_stats');
     $property->setAccessible(true);
     $property->setValue($ctrl, true);
     $GLOBALS['cfg']['MaxExactCount'] = 10;
     $current_table = array('ENGINE' => 'InnoDB', 'TABLE_ROWS' => 5, 'Data_length' => 16384, 'Index_length' => 0, 'TABLE_NAME' => 'table');
     list($current_table, , , $sum_size) = $method->invokeArgs($ctrl, array($current_table, 10));
     $this->assertEquals(true, $current_table['COUNTED']);
     $this->assertEquals(6, $current_table['TABLE_ROWS']);
     $this->assertEquals(16394, $sum_size);
     $current_table['ENGINE'] = 'MYISAM';
     list($current_table, , , $sum_size) = $method->invokeArgs($ctrl, array($current_table, 10));
     $this->assertEquals(false, $current_table['COUNTED']);
     $this->assertEquals(16394, $sum_size);
     // Not showing statistics
     $is_show_stats = false;
     $ctrl = new DatabaseStructureController($GLOBALS['db'], null);
     $current_table['ENGINE'] = 'InnoDB';
     list($current_table, , , $sum_size) = $method->invokeArgs($ctrl, array($current_table, 10));
     $this->assertEquals(true, $current_table['COUNTED']);
     $this->assertEquals(10, $sum_size);
     $current_table['ENGINE'] = 'MYISAM';
     list($current_table, , , $sum_size) = $method->invokeArgs($ctrl, array($current_table, 10));
     $this->assertEquals(false, $current_table['COUNTED']);
     $this->assertEquals(10, $sum_size);
 }
 /**
  * Test for _getPluginsHtml() method
  *
  * @return void
  */
 public function testPMAGetPluginAndModuleInfo()
 {
     /**
      * Prepare plugin list
      */
     $row = array();
     $row["plugin_name"] = "plugin_name1";
     $row["plugin_type"] = "plugin_type1";
     $row["plugin_type_version"] = "plugin_version1";
     $row["plugin_author"] = "plugin_author1";
     $row["plugin_license"] = "plugin_license1";
     $row["plugin_description"] = "plugin_description1";
     $row["is_active"] = true;
     //Mock DBI
     $dbi = $this->getMockBuilder('PMA\\libraries\\DatabaseInterface')->disableOriginalConstructor()->getMock();
     $dbi->expects($this->once())->method('query')->will($this->returnValue(true));
     $dbi->expects($this->at(1))->method('fetchAssoc')->will($this->returnValue($row));
     $dbi->expects($this->at(2))->method('fetchAssoc')->will($this->returnValue(false));
     $dbi->expects($this->once())->method('freeResult')->will($this->returnValue(true));
     $container = Container::getDefaultContainer();
     $container->set('dbi', $dbi);
     $class = new ReflectionClass('\\PMA\\libraries\\controllers\\server\\ServerPluginsController');
     $method = $class->getMethod('_getPluginsHtml');
     $method->setAccessible(true);
     $ctrl = new ServerPluginsController();
     $html = $method->invoke($ctrl);
     //validate 1:Items
     $this->assertContains('<th>Plugin</th>', $html);
     $this->assertContains('<th>Description</th>', $html);
     $this->assertContains('<th>Version</th>', $html);
     $this->assertContains('<th>Author</th>', $html);
     $this->assertContains('<th>License</th>', $html);
     //validate 2: one Item HTML
     $this->assertContains('<th>plugin_name1</th>', $html);
     $this->assertContains('<td>plugin_description1</td>', $html);
     $this->assertContains('<td>plugin_version1</td>', $html);
     $this->assertContains('<td>plugin_author1</td>', $html);
     $this->assertContains('<td>plugin_license1</td>', $html);
 }
 /**
  * Test for _getHtmlForServerVariablesItems()
  *
  * @return void
  */
 public function testGetHtmlForServerVariablesItems()
 {
     $class = new ReflectionClass('\\PMA\\libraries\\controllers\\server\\ServerVariablesController');
     $method = $class->getMethod('_getHtmlForServerVariablesItems');
     $method->setAccessible(true);
     $container = Container::getDefaultContainer();
     $container->factory('PMA\\libraries\\controllers\\server\\ServerVariablesController');
     $container->alias('ServerVariablesController', 'PMA\\libraries\\controllers\\server\\ServerVariablesController');
     $ctrl = $container->get('ServerVariablesController');
     $serverVarsSession = $GLOBALS['dbi']->fetchResult('SHOW SESSION VARIABLES;', 0, 1);
     $serverVars = $GLOBALS['dbi']->fetchResult('SHOW GLOBAL VARIABLES;', 0, 1);
     $html = $method->invoke($ctrl, $serverVars, $serverVarsSession);
     //validate 1: variable: auto_increment_increment
     $name = "auto_increment_increment";
     $value = htmlspecialchars(str_replace('_', ' ', $name));
     $this->assertContains($value, $html);
     //validate 2: variable: auto_increment_offset
     $name = "auto_increment_offset";
     $value = htmlspecialchars(str_replace('_', ' ', $name));
     $this->assertContains($value, $html);
     $formatVariable = $class->getMethod('_formatVariable');
     $formatVariable->setAccessible(true);
     $args = array($name, "12");
     list($value, $isHtmlFormatted) = $formatVariable->invokeArgs($ctrl, $args);
     $this->assertContains($value, $html);
     //validate 3: variables
     $this->assertContains(__('Session value'), $html);
     $args = array($name, "13");
     list($value, $isHtmlFormatted) = $formatVariable->invokeArgs($ctrl, $args);
     $this->assertContains($value, $html);
 }
<?php

/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
 * Database structure manipulation
 *
 * @package PhpMyAdmin
 */
namespace PMA;

use PMA\libraries\controllers\database\DatabaseStructureController;
use PMA\libraries\Response;
use PMA\libraries\Util;
require_once 'libraries/common.inc.php';
require_once 'libraries/db_common.inc.php';
list($tables, $num_tables, $total_num_tables, $sub_part, $is_show_stats, $db_is_system_schema, $tooltip_truename, $tooltip_aliasname, $pos) = Util::getDbInfo($GLOBALS['db'], isset($sub_part) ? $sub_part : '');
$container = libraries\di\Container::getDefaultContainer();
$container->factory('PMA\\libraries\\controllers\\database\\DatabaseStructureController');
$container->alias('DatabaseStructureController', 'PMA\\libraries\\controllers\\database\\DatabaseStructureController');
$container->set('PMA\\libraries\\Response', Response::getInstance());
$container->alias('response', 'PMA\\libraries\\Response');
global $db, $pos, $db_is_system_schema, $total_num_tables, $tables, $num_tables;
/* Define dependencies for the concerned controller */
$dependency_definitions = array('db' => $db, 'url_query' => &$GLOBALS['url_query'], 'pos' => $pos, 'db_is_system_schema' => $db_is_system_schema, 'num_tables' => $num_tables, 'total_num_tables' => $total_num_tables, 'tables' => $tables);
/** @var DatabaseStructureController $controller */
$controller = $container->get('DatabaseStructureController', $dependency_definitions);
$controller->indexAction();
            $extension = 'mysql';
            if (!PMA\libraries\DatabaseInterface::checkDbExtension($extension)) {
                // warn about both extensions missing and exit
                PMA_warnMissingExtension('mysqli|mysql', true, $doclink);
            } elseif (empty($_SESSION['mysqlwarning'])) {
                trigger_error(__('You are using the mysql extension which is deprecated in ' . 'phpMyAdmin. Please consider installing the mysqli ' . 'extension.') . ' ' . $doclink, E_USER_WARNING);
                // tell the user just once per session
                $_SESSION['mysqlwarning'] = true;
            }
        } else {
            // mysql extension is not part of PHP 7+, so warn and exit
            PMA_warnMissingExtension('mysqli', true, $doclink);
        }
    }
    /**
     * Including The DBI Plugin
     */
    switch ($extension) {
        case 'mysql':
            $extension = new DBIMysql();
            break;
        case 'mysqli':
            include_once 'libraries/dbi/DBIMysqli.lib.php';
            $extension = new DBIMysqli();
            break;
    }
}
$GLOBALS['dbi'] = new DatabaseInterface($extension);
$container = Container::getDefaultContainer();
$container->set('PMA_DatabaseInterface', $GLOBALS['dbi']);
$container->alias('dbi', 'PMA_DatabaseInterface');
 /**
  * Tests for getDataRowAction()
  *
  * @return void
  * @test
  */
 public function testGetDataRowAction()
 {
     $meta_one = new stdClass();
     $meta_one->type = 'int';
     $meta_one->length = 11;
     $meta_two = new stdClass();
     $meta_two->length = 11;
     $meta_two->type = 'int';
     $fields_meta = array($meta_one, $meta_two);
     $GLOBALS['dbi']->expects($this->any())->method('getFieldsMeta')->will($this->returnValue($fields_meta));
     $GLOBALS['dbi']->expects($this->any())->method('fetchAssoc')->will($this->returnCallback(function () {
         static $count = 0;
         if ($count == 0) {
             $count++;
             return array('col1' => 1, 'col2' => 2);
         } else {
             return null;
         }
     }));
     $container = Container::getDefaultContainer();
     $container->set('dbi', $GLOBALS['dbi']);
     $container->factory('\\PMA\\libraries\\controllers\\Table\\TableSearchController');
     $container->alias('TableSearchController', 'PMA\\libraries\\controllers\\table\\TableSearchController');
     $ctrl = $container->get('TableSearchController');
     $_REQUEST['db'] = 'PMA';
     $_REQUEST['table'] = 'PMA_BookMark';
     $_REQUEST['where_clause'] = '`col1` = 1';
     $expected = array('col1' => 1, 'col2' => 2);
     $ctrl->getDataRowAction();
     $json = $this->response->getJSONResult();
     $this->assertEquals($expected, $json['row_info']);
 }
 /**
  * Tests for displayFormAction()
  *
  * @return void
  * @test
  */
 public function testDisplayFormAction()
 {
     $table = $this->getMockBuilder('PMA\\libraries\\Table')->disableOriginalConstructor()->getMock();
     $table->expects($this->any())->method('getStatusInfo')->will($this->returnValue(""));
     $table->expects($this->any())->method('isView')->will($this->returnValue(false));
     $table->expects($this->any())->method('getNameAndTypeOfTheColumns')->will($this->returnValue(array("field_name" => "field_type")));
     $GLOBALS['dbi']->expects($this->any())->method('getTable')->will($this->returnValue($table));
     $container = Container::getDefaultContainer();
     $container->set('db', 'db');
     $container->set('table', 'table');
     $container->set('dbi', $GLOBALS['dbi']);
     $response = new \PMA\Test\Stubs\Response();
     $container->set('PMA\\libraries\\Response', $response);
     $container->alias('response', 'PMA\\libraries\\Response');
     $index = new PMA\libraries\Index();
     $ctrl = new TableIndexesController($index);
     $_REQUEST['create_index'] = true;
     $_REQUEST['added_fields'] = 3;
     $ctrl->displayFormAction();
     $html = $response->getHTMLResult();
     //PMA_URL_getHiddenInputs
     $this->assertContains(PMA_URL_getHiddenInputs(array('db' => 'db', 'table' => 'table', 'create_index' => 1)), $html);
     $doc_html = PMA\libraries\Util::showHint(PMA\libraries\Message::notice(__('"PRIMARY" <b>must</b> be the name of' . ' and <b>only of</b> a primary key!')));
     $this->assertContains($doc_html, $html);
     $this->assertContains(PMA\libraries\Util::showMySQLDocu('ALTER_TABLE'), $html);
     // generateIndexSelector
     $this->assertContains(PMA\libraries\Template::trim($index->generateIndexChoiceSelector(false)), $html);
     $this->assertContains(sprintf(__('Add %s column(s) to index'), 1), $html);
     //$field_name & $field_type
     $this->assertContains("field_name", $html);
     $this->assertContains("field_type", $html);
 }
 /**
  * Test for getDataForSubmitMult()
  *
  * @return void
  * @test
  */
 public function testPMAGetDataForSubmitMult()
 {
     $dbi = $this->getMockBuilder('PMA\\libraries\\DatabaseInterface')->disableOriginalConstructor()->getMock();
     $dbi->expects($this->any())->method('query')->will($this->returnValue(true));
     $class = new ReflectionClass('PMA\\libraries\\controllers\\tableStructureController');
     $method = $class->getMethod('getDataForSubmitMult');
     $method->setAccessible(true);
     $container = Container::getDefaultContainer();
     $container->set('dbi', $dbi);
     $container->factory('PMA\\libraries\\controllers\\tableStructureController');
     $container->alias('TableStructureController', 'PMA\\libraries\\controllers\\tableStructureController');
     $ctrl = $container->get('TableStructureController');
     $submit_mult = "index";
     $db = "PMA_db";
     $table = "PMA_table";
     $selected = array("table1", "table2");
     $action = 'db_delete_row';
     list($what, $query_type, $is_unset_submit_mult, $mult_btn, $centralColsError) = $method->invokeArgs($ctrl, array($submit_mult, $db, $table, $selected, $action));
     //validate 1: $what
     $this->assertEquals(null, $what);
     //validate 2: $query_type
     $this->assertEquals('index_fld', $query_type);
     //validate 3: $is_unset_submit_mult
     $this->assertEquals(true, $is_unset_submit_mult);
     //validate 4:
     $this->assertEquals(__('Yes'), $mult_btn);
     //validate 5: $centralColsError
     $this->assertEquals(null, $centralColsError);
     $submit_mult = "unique";
     list($what, $query_type, $is_unset_submit_mult, $mult_btn, $centralColsError) = $method->invokeArgs($ctrl, array($submit_mult, $db, $table, $selected, $action));
     //validate 1: $what
     $this->assertEquals(null, $what);
     //validate 2: $query_type
     $this->assertEquals('unique_fld', $query_type);
     //validate 3: $is_unset_submit_mult
     $this->assertEquals(true, $is_unset_submit_mult);
     //validate 4: $mult_btn
     $this->assertEquals(__('Yes'), $mult_btn);
     //validate 5: $centralColsError
     $this->assertEquals(null, $centralColsError);
 }
 /**
  * Tests for _getColumnOrder()
  *
  * @return void
  */
 public function testGetColumnOrder()
 {
     $class = new ReflectionClass('\\PMA\\libraries\\controllers\\server\\ServerDatabasesController');
     $method = $class->getMethod('_getColumnOrder');
     $method->setAccessible(true);
     $container = Container::getDefaultContainer();
     $container->factory('PMA\\libraries\\controllers\\server\\ServerDatabasesController');
     $container->alias('ServerDatabasesController', 'PMA\\libraries\\controllers\\server\\ServerDatabasesController');
     $ctrl = $container->get('ServerDatabasesController');
     $this->assertEquals(array('DEFAULT_COLLATION_NAME' => array('disp_name' => __('Collation'), 'description_function' => 'PMA_getCollationDescr', 'format' => 'string', 'footer' => 'utf8_general_ci'), 'SCHEMA_TABLES' => array('disp_name' => __('Tables'), 'format' => 'number', 'footer' => 0), 'SCHEMA_TABLE_ROWS' => array('disp_name' => __('Rows'), 'format' => 'number', 'footer' => 0), 'SCHEMA_DATA_LENGTH' => array('disp_name' => __('Data'), 'format' => 'byte', 'footer' => 0), 'SCHEMA_INDEX_LENGTH' => array('disp_name' => __('Indexes'), 'format' => 'byte', 'footer' => 0), 'SCHEMA_LENGTH' => array('disp_name' => __('Total'), 'format' => 'byte', 'footer' => 0), 'SCHEMA_DATA_FREE' => array('disp_name' => __('Overhead'), 'format' => 'byte', 'footer' => 0)), $method->invoke($ctrl));
 }
 /**
  * Tests for getDropdownValueForDbAction()
  *
  * Case two: not foreign
  *
  * @return void
  * @test
  */
 public function testGetDropdownValueForDbActionTwo()
 {
     $GLOBALS['dbi']->expects($this->any())->method('fetchArray')->will($this->returnCallback(function () {
         static $count = 0;
         if ($count == 0) {
             $count++;
             return array('table');
         }
         return null;
     }));
     $container = Container::getDefaultContainer();
     $container->set('dbi', $GLOBALS['dbi']);
     $container->factory('PMA\\libraries\\controllers\\table\\TableRelationController');
     $container->alias('TableRelationController', 'PMA\\libraries\\controllers\\table\\TableRelationController');
     $ctrl = $container->get('TableRelationController', array('tbl_storage_engine' => 'INNODB'));
     $_REQUEST['foreign'] = 'false';
     $ctrl->getDropdownValueForDbAction();
     $json = $this->_response->getJSONResult();
     $this->assertEquals(array('table'), $json['tables']);
 }
 /**
  * Tests for _getAllLogItemInfo
  *
  * @return void
  */
 public function testGetAllLogItemInfo()
 {
     $class = new ReflectionClass('\\PMA\\libraries\\controllers\\server\\ServerBinlogController');
     $method = $class->getMethod('_getAllLogItemInfo');
     $method->setAccessible(true);
     $ctrl = new ServerBinlogController();
     //Mock DBI
     $container = Container::getDefaultContainer();
     $dbi = $container->get('dbi');
     $fetchAssoc = array('Info' => 'Info', 'Log_name' => 'Log_name', 'Pos' => 'Pos', 'Event_type' => 'Event_type', 'Server_id' => 'Server_id', 'Orig_log_pos' => 'Orig_log_pos', 'End_log_pos' => 'End_log_pos');
     $dbi->expects($this->at(0))->method('fetchAssoc')->will($this->returnValue($fetchAssoc));
     $dbi->expects($this->at(1))->method('fetchAssoc')->will($this->returnValue(false));
     $container->set('dbi', $dbi);
     $GLOBALS['cfg']['LimitChars'] = 2;
     $result = array();
     $dontlimitchars = ";";
     $html = $method->invoke($ctrl, $result, $dontlimitchars);
     $value = $fetchAssoc;
     $this->assertContains($value['Log_name'], $html);
     $this->assertContains($value['Pos'], $html);
     $this->assertContains($value['Event_type'], $html);
     $this->assertContains($value['Server_id'], $html);
     $this->assertContains($value['Orig_log_pos'], $html);
     $this->assertContains(htmlspecialchars($value['Info']), $html);
 }
    $form_params['orig_num_fields'] = $num_fields;
}
$form_params = array_merge($form_params, array('orig_field_where' => Util\get($_REQUEST, 'field_where'), 'orig_after_field' => Util\get($_REQUEST, 'after_field')));
if (isset($selected) && is_array($selected)) {
    foreach ($selected as $o_fld_nr => $o_fld_val) {
        $form_params['selected[' . $o_fld_nr . ']'] = $o_fld_val;
    }
}
$is_backup = $action != 'tbl_create.php' && $action != 'tbl_addfield.php';
require_once './libraries/transformations.lib.php';
$cfgRelation = PMA_getRelationsParam();
$comments_map = PMA_getComments($db, $table);
$move_columns = array();
if (isset($fields_meta)) {
    /** @var PMA\libraries\DatabaseInterface $dbi */
    $dbi = \PMA\libraries\di\Container::getDefaultContainer()->get('dbi');
    $move_columns = $dbi->getTable($db, $table)->getColumnsMeta();
}
$available_mime = array();
if ($cfgRelation['mimework'] && $GLOBALS['cfg']['BrowseMIME']) {
    $mime_map = PMA_getMIME($db, $table);
    $available_mime = PMA_getAvailableMIMEtypes();
}
//  workaround for field_fulltext, because its submitted indices contain
//  the index as a value, not a key. Inserted here for easier maintenance
//  and less code to change in existing files.
if (isset($field_fulltext) && is_array($field_fulltext)) {
    foreach ($field_fulltext as $fulltext_nr => $fulltext_indexkey) {
        $submit_fulltext[$fulltext_indexkey] = $fulltext_indexkey;
    }
}