getMockBuilder(DatabaseInterface::class) ->disableOriginalConstructor() ->getMock(); $dbi->expects(self::any()) ->method('getColumns') ->with('pma', 'table1') ->willReturn([ new Column('column1', '', null, false, '', null, '', '', ''), new Column('column2', '', null, false, '', null, '', '', ''), ]); $dbi->expects(self::any()) ->method('quoteString') ->willReturnCallback(static fn (string $string): string => "'" . $string . "'"); DatabaseInterface::$instance = $dbi; $this->object = new Search($dbi, 'pma_test', new Template(new Config())); // $this->object->setSearchParams(new \PhpMyAdmin\Http\ServerRequest()); } /** * Test for generating where clause for different search types * * @param string $type type * @param string $includeHex includeHex * @param string $expected expected */ #[DataProvider('searchTypesAndOptions')] public function testGetWhereClause(string $type, string $includeHex, string $expected): void { $request = ServerRequestFactory::create()->createServerRequest('POST', 'http://example.com/') ->withParsedBody([ 'criteriaSearchType' => $type, 'criteriaSearchString' => 'search string', 'criteriaSearchOptionIncludeHex' => $includeHex, ]); $this->object = new Search(DatabaseInterface::getInstance(), 'pma_test', new Template(new Config())); $this->object->setSearchParams($request); self::assertSame( $expected, (new ReflectionMethod(Search::class, 'getWhereClause'))->invokeArgs($this->object, ['table1']), ); } /** * Data provider for testGetWhereClause * * @return array> */ public static function searchTypesAndOptions(): array { return [ [ '1', '0', " WHERE (CONVERT(`column1` USING utf8) LIKE '%search%'" . " OR CONVERT(`column2` USING utf8) LIKE '%search%') " . " OR (CONVERT(`column1` USING utf8) LIKE '%string%'" . " OR CONVERT(`column2` USING utf8) LIKE '%string%')", ], [ '2', '0', " WHERE (CONVERT(`column1` USING utf8) LIKE '%search%'" . " OR CONVERT(`column2` USING utf8) LIKE '%search%') " . " AND (CONVERT(`column1` USING utf8) LIKE '%string%'" . " OR CONVERT(`column2` USING utf8) LIKE '%string%')", ], [ '3', '0', " WHERE (CONVERT(`column1` USING utf8) LIKE '%search string%'" . " OR CONVERT(`column2` USING utf8) LIKE '%search string%')", ], [ '4', '0', " WHERE (CONVERT(`column1` USING utf8) LIKE 'search string'" . " OR CONVERT(`column2` USING utf8) LIKE 'search string')", ], [ '5', '0', " WHERE (CONVERT(`column1` USING utf8) REGEXP 'search string'" . " OR CONVERT(`column2` USING utf8) REGEXP 'search string')", ], [ '1', '1', " WHERE (CONVERT(`column1` USING utf8) LIKE '%search%'" . " OR HEX(`column1`) LIKE '%search%'" . " OR CONVERT(`column2` USING utf8) LIKE '%search%'" . " OR HEX(`column2`) LIKE '%search%') " . " OR (CONVERT(`column1` USING utf8) LIKE '%string%'" . " OR HEX(`column1`) LIKE '%string%'" . " OR CONVERT(`column2` USING utf8) LIKE '%string%'" . " OR HEX(`column2`) LIKE '%string%')", ], [ '2', '1', " WHERE (CONVERT(`column1` USING utf8) LIKE '%search%'" . " OR HEX(`column1`) LIKE '%search%'" . " OR CONVERT(`column2` USING utf8) LIKE '%search%'" . " OR HEX(`column2`) LIKE '%search%') " . " AND (CONVERT(`column1` USING utf8) LIKE '%string%'" . " OR HEX(`column1`) LIKE '%string%'" . " OR CONVERT(`column2` USING utf8) LIKE '%string%'" . " OR HEX(`column2`) LIKE '%string%')", ], [ '3', '1', " WHERE (CONVERT(`column1` USING utf8) LIKE '%search string%'" . " OR HEX(`column1`) LIKE '%search string%'" . " OR CONVERT(`column2` USING utf8) LIKE '%search string%'" . " OR HEX(`column2`) LIKE '%search string%')", 'on', ], [ '4', '1', " WHERE (CONVERT(`column1` USING utf8) LIKE 'search string'" . " OR HEX(`column1`) LIKE 'search string'" . " OR CONVERT(`column2` USING utf8) LIKE 'search string'" . " OR HEX(`column2`) LIKE 'search string')", ], [ '5', '1', " WHERE (CONVERT(`column1` USING utf8) REGEXP 'search string'" . " OR HEX(`column1`) REGEXP 'search string'" . " OR CONVERT(`column2` USING utf8) REGEXP 'search string'" . " OR HEX(`column2`) REGEXP 'search string')", ], ]; } /** * Test for getSearchSqls */ public function testGetSearchSqls(): void { self::assertSame( [ 'select_columns' => 'SELECT * FROM `pma`.`table1` WHERE FALSE', 'select_count' => 'SELECT COUNT(*) AS `count` FROM `pma`.`table1` WHERE FALSE', 'delete' => 'DELETE FROM `pma`.`table1` WHERE FALSE', ], (new ReflectionMethod(Search::class, 'getSearchSqls'))->invokeArgs($this->object, ['table1']), ); } /** * Test for getSearchResults */ public function testGetSearchResults(): void { self::assertStringContainsString( 'Search results for "" :', $this->object->getSearchResults(), ); } /** * Test for getSelectionForm */ public function testGetMainHtml(): void { $main = $this->object->getMainHtml(); // test selection form self::assertStringContainsString('', $main, ); self::assertStringContainsString('criteriaSearchType', $main); // test result divs self::assertStringContainsString('