[Tͪ#n$;<:a4sX[ 6F1f=VĀC7Y@*.zhEidCI!-sLtPbR[8%W>Os9˓ELEp+s !{5^Lf캮J82Є|jS2>aJ] _ho 6CCQ{*5Np8eiD F{.QTR,#S:|ROZSB#='OEH?!lS]ٱv9a(+s!~}}~2h&k75bd)? T~AP8:
p}+Pw,0aXHjfk9DK*ٿ#djZƧ>1?,<͵u$#vEXm#;Xipq^EL'MO<Cl8rJ3tR"Q끽3ƞB;)WKB6SkfS_n\l/&Y$N=XXH-#Q|2~<g2VQK8i<F,Blѩ_/j+-G0tgmкm#"bܹ5PF0ˣ*һS04kLk/hPF* ރ#B^.{Z[ޑZ2]IOn2.u/Wi*~wiu;8l,\{!HAw 5ԥԼuOjQ:b5G8WfմfXAi,RD]Y(4a@՜VIծOy`踢i "rL H߮o_xzrnb0US%Vx%9C'(i%1*<Jw	yʬu Ҡx:koB8@+T4;@RL!;I-K2`z<?uq51&BBI¯ha;J[Һ[f}4:2kbb43RPL5I;Јݦnj@hcu3@Tnsd_7QL
*=}=lA.jA37	0d Ra"Rޅ"˄F!7VIr-䉿GhNo&g<oҜpC'X`0ܤ=;;(1/CLVNgA[UF>.h$2y'g5.ޢc:\C\$;$lTF)w]p3o֋nYlL&Ks9gFAޱ]$eRi^/淣VVtTTEU㡀n/(S{RӶ3ב>7ۘ7^b/VΑn͗b$=̒>AVlsVb3x+ֹ]S,2TR~Lh٪KH6I STi@jcܣs]t'Y`0qrcDY 9»IM5"<%'g=N^~K D}"7%=|` L_)ѦT9O97hԑVws`$Y2?wyl\f6:/vsZ1d""|B~Bu<n* 1.(RӀuE8LN16(@0%"`n 8"KU]]~ܧ:Ԉ!jCW5M!م~>MEn%*ٳ4tj`NV"ln8B%0PشG&P5]F~,O8ёwv}[jthpjLĀ=)*u[iX|SpCy0N6Iq"?Ǳ, 0u`=9esO?݁N%yo.`fd̺WS&?/|nc`F7'N7U[;|B\QqW׵/-L(2p'0߲W
\m!O7)%abI2j_E]<Gd
`fd̺WS&?/|ArH@NXMC5m=zMd.ұ݃D?'4?oé~sG:yÜЅ-R^
LϔjuF#OA_Lm=jaHDmJ̞iEmp,H{RD}X.uxDs='(L]"^٤4P-څ̙-?;^?;jUc\!7enazNr\[.<j3iP8W*nh&J(Li#tbM#+_![Ls`FAj%SOE`bApӈGނ23il(}35:Fن&yja&80%35HFG~G(DvFduN#̍b4C,xy3ޚ?,DKHXik%Bܻ%e@9tCw>g#4Wp~~X,O\{Spuo&^])f7a=pSVг-Qiap"OD<RNYe3̋˷V̒;fBEPBJoW~듷34y<ss%X_4B-&>efßd9iU!$Hdsq_`0t6I^* {WV-A[f:D9
D<RNYjMu4{Y,rW,nܞϲn"3dZ.`Y+;߮cJ%(jitܹ~V+?Ăo*ݏc@_pmS\CD 2/k+(R%ڹI'qGNc
؍c_>dkᡂ$G?_#mvPS4K5ڡyI6c(3>wJwĒXjMP6dj ]܃Wz"AMiڧؚP5Msk})Za2{5g g|aQRHE1wơ߹&!SP1[<+q02̗į{ۂ=RΏv.@
:Miʞ3DW[?1xBꉚ	ؗ(P&?`4X6SA97DUhcMpTcԅ[7uV0dFꍬ2Y,S6j@= /N7ovYvҊ>6-3%%x\/ax`SR1c~D3\.HkH}Ű/]=y2H}<M93D*rZO
{17?.yWt"mjz!ꔴUVKmkb,8ǅX=ݵR2L\Ìx'<(XvGo4T\C7GbxeGT\cKEb7%Ѹ?doO3<@1,Pc_	yרÙu@Nf%L+8	YmO3-oE^cY{T;2YNQd}NaT; I&B-F",oJn&R(XB]9750ӌkrNDXD(>RI|Hj\5NGZw~p ~γc =93"}cP/gC\^ԡ]H:[wl{RѤiE&)l,ܾnct'] = true;
        $_POST['zoom_submit'] = true;
        $_POST['table'] = "PMA";
        $_POST['orderByColumn'] = "name";
        $_POST['order'] = "asc";
        $_POST['customWhereClause'] = "name='pma'";

        $class = new ReflectionClass('PMA\libraries\controllers\table\TableSearchController');
        $method = $class->getMethod('_buildSqlQuery');
        $method->setAccessible(true);
        $tableSearch = new TableSearchController("zoom", null);

        $sql = $method->invoke($tableSearch);
        $result = "SELECT DISTINCT *  FROM `PMA` WHERE name='pma' "
            . "ORDER BY `name` asc";

        $this->assertEquals(
            $result,
            $sql
        );

        unset($_POST['customWhereClause']);
        $sql = $method->invoke($tableSearch);
        $result = "SELECT DISTINCT *  FROM `PMA` ORDER BY `name` asc";
        $this->assertEquals(
            $result,
            $sql
        );

        $_POST['criteriaValues'] = array(
            'value1',
            'value2',
            'value3',
            'value4',
            'value5',
            'value6',
            'value7,value8'
        );
        $_POST['criteriaColumnNames'] = array(
            'name',
            'id',
            'index',
            'index2',
            'index3',
            'index4',
            'index5',
        );
        $_POST['criteriaColumnTypes'] = array(
            'varchar',
            'int',
            'enum',
            'type1',
            'type2',
            'type3',
            'type4'
        );
        $_POST['criteriaColumnCollations'] = array(
            "char1",
            "char2",
            "char3",
            "char4",
            "char5",
            "char6",
            "char7",
        );
        $_POST['criteriaColumnOperators'] = array(
            "!=",
            ">",
            "IS NULL",
            "LIKE %...%",
            "REGEXP ^...$",
            "IN (...)",
            "BETWEEN"
        );

        $sql = $method->invoke($tableSearch);
        $result = "SELECT DISTINCT *  FROM `PMA` WHERE `name` != 'value1'"
            . " AND `id` > value2 AND `index` IS NULL AND `index2` LIKE '%value4%'"
            . " AND `index3` REGEXP ^value5$ AND `index4` IN (value6) AND `index5`"
            . " BETWEEN value7 AND value8 ORDER BY `name` asc";
        $this->assertEquals(
            $result,
            $sql
        );
    }

    /**
     * Tests for getColumnMinMax()
     *
     * @return void
     * @test
     */
    public function testGetColumnMinMax()
    {
        $GLOBALS['dbi']->expects($this->any())->method('fetchSingleRow')
            ->will($this->returnArgument(0));

        $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');

        $result = $ctrl->getColumnMinMax('column');
        $expected = 'SELECT MIN(`column`) AS `min`, '
            . 'MAX(`column`) AS `max` '
            . 'FROM `PMA`.`PMA_BookMark`';
        $this->assertEquals(
            $expected,
            $result
        );
    }

    /**
     * Tests for _generateWhereClause()
     *
     * @return void
     * @test
     */
    public function testGenerateWhereClause()
    {
        $types = $this->getMockBuilder('PMA\libraries\Types')
            ->disableOriginalConstructor()
            ->getMock();
        $types->expects($this->any())->method('isUnaryOperator')
            ->will($this->returnValue(false));
        $GLOBALS['PMA_Types'] = $types;

        $class = new ReflectionClass('\PMA\libraries\controllers\Table\TableSearchController');
        $method = $class->getMethod('_generateWhereClause');
        $method->setAccessible(true);

        $container = Container::getDefaultContainer();
        $container->factory('\PMA\libraries\controllers\Table\TableSearchController');
        $container->alias(
            'TableSearchController', 'PMA\libraries\controllers\table\TableSearchController'
        );
        $ctrl = $container->get('TableSearchController');

        $_POST['customWhereClause'] = '`table` = \'PMA_BookMark\'';
        $result = $method->invoke($ctrl);
        $this->assertEquals(
            ' WHERE `table` = \'PMA_BookMark\'',
            $result
        );

        unset($_POST['customWhereClause']);
        $this->assertEquals(
            '',
            $method->invoke($ctrl)
        );

        $_POST['criteriaColumnNames'] = array(
            'b', 'a'
        );
        $_POST['criteriaColumnOperators'] = array(
            '<=', '='
        );
        $_POST['criteriaValues'] = array(
            '10', '2'
        );
        $_POST['criteriaColumnTypes'] = array(
            'int(11)', 'int(11)'
        );
        $result = $method->invoke($ctrl);
        $this->assertEquals(
            ' WHERE `b` <= 10 AND `a` = 2',
            $result
        );
    }

    /**
     * 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']
        );
    }
}
