18fed17f3SAndreas Gohr<?php 28fed17f3SAndreas Gohr 38fed17f3SAndreas Gohrnamespace dokuwiki\plugin\struct\test; 48fed17f3SAndreas Gohr 58fed17f3SAndreas Gohruse dokuwiki\plugin\struct\meta; 6*850ad33eSAndreas Gohruse DOMWrap\Document; 78fed17f3SAndreas Gohr 88fed17f3SAndreas Gohr/** 98fed17f3SAndreas Gohr * Tests handling dynamic search parameters 108fed17f3SAndreas Gohr * 118fed17f3SAndreas Gohr * @group plugin_struct 128fed17f3SAndreas Gohr * @group plugins 138fed17f3SAndreas Gohr * 148fed17f3SAndreas Gohr */ 158fed17f3SAndreas Gohrclass SearchConfigParameterTest extends StructTest 168fed17f3SAndreas Gohr{ 178fed17f3SAndreas Gohr 188fed17f3SAndreas Gohr public function setUp(): void 198fed17f3SAndreas Gohr { 208fed17f3SAndreas Gohr parent::setUp(); 218fed17f3SAndreas Gohr 228fed17f3SAndreas Gohr $this->loadSchemaJSON('schema1'); 238fed17f3SAndreas Gohr $this->loadSchemaJSON('schema2'); 248fed17f3SAndreas Gohr 258fed17f3SAndreas Gohr $as = mock\Assignments::getInstance(); 268fed17f3SAndreas Gohr 278fed17f3SAndreas Gohr $as->assignPageSchema('page01', 'schema1'); 288fed17f3SAndreas Gohr $this->saveData( 298fed17f3SAndreas Gohr 'page01', 308fed17f3SAndreas Gohr 'schema1', 318fed17f3SAndreas Gohr [ 328fed17f3SAndreas Gohr 'first' => 'first data', 338fed17f3SAndreas Gohr 'second' => ['second data', 'more data', 'even more'], 348fed17f3SAndreas Gohr 'third' => 'third data', 358fed17f3SAndreas Gohr 'fourth' => 'fourth data' 368fed17f3SAndreas Gohr ], 378fed17f3SAndreas Gohr time() 388fed17f3SAndreas Gohr ); 398fed17f3SAndreas Gohr 408fed17f3SAndreas Gohr $as->assignPageSchema('page01', 'schema2'); 418fed17f3SAndreas Gohr $this->saveData( 428fed17f3SAndreas Gohr 'page01', 438fed17f3SAndreas Gohr 'schema2', 448fed17f3SAndreas Gohr [ 458fed17f3SAndreas Gohr 'afirst' => 'first data', 468fed17f3SAndreas Gohr 'asecond' => ['second data', 'more data', 'even more'], 478fed17f3SAndreas Gohr 'athird' => 'third data', 488fed17f3SAndreas Gohr 'afourth' => 'fourth data' 498fed17f3SAndreas Gohr ], 508fed17f3SAndreas Gohr time() 518fed17f3SAndreas Gohr ); 528fed17f3SAndreas Gohr 538fed17f3SAndreas Gohr for ($i = 10; $i <= 20; $i++) { 548fed17f3SAndreas Gohr $as->assignPageSchema("page$i", 'schema2'); 558fed17f3SAndreas Gohr $this->saveData( 568fed17f3SAndreas Gohr "page$i", 578fed17f3SAndreas Gohr 'schema2', 588fed17f3SAndreas Gohr [ 598fed17f3SAndreas Gohr 'afirst' => "page$i first data", 608fed17f3SAndreas Gohr 'asecond' => ["page$i second data"], 618fed17f3SAndreas Gohr 'athird' => "page$i third data", 628fed17f3SAndreas Gohr 'afourth' => "page$i fourth data" 638fed17f3SAndreas Gohr ], 648fed17f3SAndreas Gohr time() 658fed17f3SAndreas Gohr ); 668fed17f3SAndreas Gohr } 678fed17f3SAndreas Gohr } 688fed17f3SAndreas Gohr 698fed17f3SAndreas Gohr public function test_constructor() 708fed17f3SAndreas Gohr { 718fed17f3SAndreas Gohr global $INPUT; 728fed17f3SAndreas Gohr 738fed17f3SAndreas Gohr $data = [ 748fed17f3SAndreas Gohr 'schemas' => [ 758fed17f3SAndreas Gohr ['schema1', 'alias1'], 768fed17f3SAndreas Gohr ['schema2', 'alias2'], 778fed17f3SAndreas Gohr ], 788fed17f3SAndreas Gohr 'cols' => [ 798fed17f3SAndreas Gohr '%pageid%', 808fed17f3SAndreas Gohr 'first', 'second', 'third', 'fourth', 818fed17f3SAndreas Gohr 'afirst', 'asecond', 'athird', 'afourth', 828fed17f3SAndreas Gohr ] 838fed17f3SAndreas Gohr ]; 848fed17f3SAndreas Gohr 858fed17f3SAndreas Gohr // init with no parameters 868fed17f3SAndreas Gohr $expect = $data; 878fed17f3SAndreas Gohr $params = []; 888fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 898fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 908fed17f3SAndreas Gohr $this->assertEquals($expect, $searchConfig->getConf()); 918fed17f3SAndreas Gohr $this->assertEquals($params, $dynamic->getURLParameters()); 928fed17f3SAndreas Gohr 938fed17f3SAndreas Gohr // init with sort 948fed17f3SAndreas Gohr $INPUT->set(meta\SearchConfigParameters::$PARAM_SORT, '^alias2.athird'); 958fed17f3SAndreas Gohr $expect['sort'] = [['schema2.athird', false]]; 968fed17f3SAndreas Gohr $params[meta\SearchConfigParameters::$PARAM_SORT] = '^schema2.athird'; 978fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 988fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 998fed17f3SAndreas Gohr $this->assertEquals($expect, $searchConfig->getConf()); 1008fed17f3SAndreas Gohr $this->assertEquals($params, $dynamic->getURLParameters()); 1018fed17f3SAndreas Gohr 1028fed17f3SAndreas Gohr // init with offset 1038fed17f3SAndreas Gohr $INPUT->set(meta\SearchConfigParameters::$PARAM_OFFSET, 25); 1048fed17f3SAndreas Gohr $expect['offset'] = 25; 1058fed17f3SAndreas Gohr $params[meta\SearchConfigParameters::$PARAM_OFFSET] = 25; 1068fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 1078fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 1088fed17f3SAndreas Gohr $this->assertEquals($expect, $searchConfig->getConf()); 1098fed17f3SAndreas Gohr $this->assertEquals($params, $dynamic->getURLParameters()); 1108fed17f3SAndreas Gohr 1118fed17f3SAndreas Gohr // init with filters 1128fed17f3SAndreas Gohr $_REQUEST[meta\SearchConfigParameters::$PARAM_FILTER]['alias1.first*~'] = 'test'; 1138fed17f3SAndreas Gohr $_REQUEST[meta\SearchConfigParameters::$PARAM_FILTER]['afirst='] = 'test2'; 1148fed17f3SAndreas Gohr $expect['filter'] = [ 1158fed17f3SAndreas Gohr ['schema1.first', '*~', 'test', 'AND'], 1168fed17f3SAndreas Gohr ['schema2.afirst', '=', 'test2', 'AND'] 1178fed17f3SAndreas Gohr ]; 1188fed17f3SAndreas Gohr $params[meta\SearchConfigParameters::$PARAM_FILTER . '[schema1.first*~]'] = 'test'; 1198fed17f3SAndreas Gohr $params[meta\SearchConfigParameters::$PARAM_FILTER . '[schema2.afirst=]'] = 'test2'; 1208fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 1218fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 1228fed17f3SAndreas Gohr $this->assertEquals($expect, $searchConfig->getConf()); 1238fed17f3SAndreas Gohr $this->assertEquals($params, $dynamic->getURLParameters()); 1248fed17f3SAndreas Gohr } 1258fed17f3SAndreas Gohr 1268fed17f3SAndreas Gohr public function test_filter() 1278fed17f3SAndreas Gohr { 1288fed17f3SAndreas Gohr $data = [ 1298fed17f3SAndreas Gohr 'schemas' => [ 1308fed17f3SAndreas Gohr ['schema1', 'alias1'], 1318fed17f3SAndreas Gohr ['schema2', 'alias2'], 1328fed17f3SAndreas Gohr ], 1338fed17f3SAndreas Gohr 'cols' => [ 1348fed17f3SAndreas Gohr '%pageid%', 1358fed17f3SAndreas Gohr 'first', 'second', 'third', 'fourth', 1368fed17f3SAndreas Gohr 'afirst', 'asecond', 'athird', 'afourth', 1378fed17f3SAndreas Gohr ] 1388fed17f3SAndreas Gohr ]; 1398fed17f3SAndreas Gohr 1408fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 1418fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 1428fed17f3SAndreas Gohr $expect = []; 1438fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1448fed17f3SAndreas Gohr 1458fed17f3SAndreas Gohr $dynamic->addFilter('first', '*~', 'test'); 1468fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test']]; 1478fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1488fed17f3SAndreas Gohr 1498fed17f3SAndreas Gohr $dynamic->addFilter('asecond', '*~', 'test2'); 1508fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test'], 'schema2.asecond' => ['*~', 'test2']]; 1518fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1528fed17f3SAndreas Gohr 1538fed17f3SAndreas Gohr // overwrite a filter 1548fed17f3SAndreas Gohr $dynamic->addFilter('asecond', '*~', 'foobar'); 1558fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test'], 'schema2.asecond' => ['*~', 'foobar']]; 1568fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1578fed17f3SAndreas Gohr 1588fed17f3SAndreas Gohr // overwrite a filter with blank removes 1598fed17f3SAndreas Gohr $dynamic->addFilter('asecond', '*~', ''); 1608fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test']]; 1618fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1628fed17f3SAndreas Gohr 1638fed17f3SAndreas Gohr // adding unknown filter does nothing 1648fed17f3SAndreas Gohr $dynamic->addFilter('nope', '*~', 'foobar'); 1658fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test']]; 1668fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1678fed17f3SAndreas Gohr 1688fed17f3SAndreas Gohr // removing unknown column does nothing 1698fed17f3SAndreas Gohr $dynamic->removeFilter('nope'); 1708fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test']]; 1718fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1728fed17f3SAndreas Gohr 1738fed17f3SAndreas Gohr $dynamic->removeFilter('first'); 1748fed17f3SAndreas Gohr $expect = []; 1758fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1768fed17f3SAndreas Gohr } 1778fed17f3SAndreas Gohr 1788fed17f3SAndreas Gohr public function test_sort() 1798fed17f3SAndreas Gohr { 1808fed17f3SAndreas Gohr $data = [ 1818fed17f3SAndreas Gohr 'schemas' => [ 1828fed17f3SAndreas Gohr ['schema1', 'alias1'], 1838fed17f3SAndreas Gohr ['schema2', 'alias2'], 1848fed17f3SAndreas Gohr ], 1858fed17f3SAndreas Gohr 'cols' => [ 1868fed17f3SAndreas Gohr '%pageid%', 1878fed17f3SAndreas Gohr 'first', 'second', 'third', 'fourth', 1888fed17f3SAndreas Gohr 'afirst', 'asecond', 'athird', 'afourth', 1898fed17f3SAndreas Gohr ] 1908fed17f3SAndreas Gohr ]; 1918fed17f3SAndreas Gohr 1928fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 1938fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 1948fed17f3SAndreas Gohr 195*850ad33eSAndreas Gohr $dynamic->setSort('%pageid%'); 1968fed17f3SAndreas Gohr $conf = $dynamic->updateConfig($data); 1978fed17f3SAndreas Gohr $param = $dynamic->getURLParameters(); 1988fed17f3SAndreas Gohr $this->assertEquals([['%pageid%', true]], $conf['sort']); 1998fed17f3SAndreas Gohr $this->assertArrayHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param); 2008fed17f3SAndreas Gohr $this->assertEquals('%pageid%', $param[meta\SearchConfigParameters::$PARAM_SORT]); 2018fed17f3SAndreas Gohr 2028fed17f3SAndreas Gohr $dynamic->setSort('%pageid%', false); 2038fed17f3SAndreas Gohr $conf = $dynamic->updateConfig($data); 2048fed17f3SAndreas Gohr $param = $dynamic->getURLParameters(); 2058fed17f3SAndreas Gohr $this->assertEquals([['%pageid%', false]], $conf['sort']); 2068fed17f3SAndreas Gohr $this->assertArrayHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param); 2078fed17f3SAndreas Gohr $this->assertEquals('^%pageid%', $param[meta\SearchConfigParameters::$PARAM_SORT]); 2088fed17f3SAndreas Gohr 2098fed17f3SAndreas Gohr $dynamic->removeSort(); 2108fed17f3SAndreas Gohr $conf = $dynamic->updateConfig($data); 2118fed17f3SAndreas Gohr $param = $dynamic->getURLParameters(); 2128fed17f3SAndreas Gohr $this->assertArrayNotHasKey('sort', $conf); 2138fed17f3SAndreas Gohr $this->assertArrayNotHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param); 2148fed17f3SAndreas Gohr } 2158fed17f3SAndreas Gohr 2168fed17f3SAndreas Gohr public function test_pagination() 2178fed17f3SAndreas Gohr { 2188fed17f3SAndreas Gohr global $INPUT; 2198fed17f3SAndreas Gohr 2208fed17f3SAndreas Gohr $data = [ 2218fed17f3SAndreas Gohr 'schemas' => [ 2228fed17f3SAndreas Gohr ['schema2', 'alias2'], 2238fed17f3SAndreas Gohr ], 2248fed17f3SAndreas Gohr 'cols' => [ 2258fed17f3SAndreas Gohr 'afirst' 2268fed17f3SAndreas Gohr ], 2278fed17f3SAndreas Gohr 'rownumbers' => '1', 2288fed17f3SAndreas Gohr 'limit' => '5', 2298fed17f3SAndreas Gohr ]; 2308fed17f3SAndreas Gohr 2318fed17f3SAndreas Gohr $R = new \Doku_Renderer_xhtml(); 2328fed17f3SAndreas Gohr // init with offset 2338fed17f3SAndreas Gohr $INPUT->set(meta\SearchConfigParameters::$PARAM_OFFSET, 5); 2348fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 2358fed17f3SAndreas Gohr $aggregationTable = new meta\AggregationTable('test_pagination', 'xhtml', $R, $searchConfig); 2368fed17f3SAndreas Gohr $aggregationTable->render(); 2378fed17f3SAndreas Gohr 2388fed17f3SAndreas Gohr $rev = time(); 2398fed17f3SAndreas Gohr 240*850ad33eSAndreas Gohr $doc = new Document(); 241*850ad33eSAndreas Gohr $doc->loadHTML($R->doc); 242*850ad33eSAndreas Gohr $table = $doc->find('div.structaggregation'); 243*850ad33eSAndreas Gohr 244*850ad33eSAndreas Gohr $tr1 = $table->find(".row1"); 2458fed17f3SAndreas Gohr $this->assertEquals('6page14 first data', trim($tr1->text())); 2468fed17f3SAndreas Gohr $this->assertEquals('page14', $tr1->attr('data-pid')); 2478fed17f3SAndreas Gohr $this->assertEquals('0', $tr1->attr('data-rid')); 2488fed17f3SAndreas Gohr $this->assertEquals($rev, $tr1->attr('data-rev')); 2498fed17f3SAndreas Gohr 250*850ad33eSAndreas Gohr $tr6aPrev = $table->find(".row6 a.prev"); 2518fed17f3SAndreas Gohr $this->assertEquals('/./doku.php?id=test_pagination', $tr6aPrev->attr('href')); 2528fed17f3SAndreas Gohr 2538fed17f3SAndreas Gohr } 2548fed17f3SAndreas Gohr} 255