18fed17f3SAndreas Gohr<?php 28fed17f3SAndreas Gohr 38fed17f3SAndreas Gohrnamespace dokuwiki\plugin\struct\test; 48fed17f3SAndreas Gohr 58fed17f3SAndreas Gohruse dokuwiki\plugin\struct\meta; 6850ad33eSAndreas 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{ 173ff5da8aSAndreas Gohr /** @var int fixed revision timestamp */ 183ff5da8aSAndreas Gohr protected $fixedrev; 198fed17f3SAndreas Gohr 208fed17f3SAndreas Gohr public function setUp(): void 218fed17f3SAndreas Gohr { 228fed17f3SAndreas Gohr parent::setUp(); 238fed17f3SAndreas Gohr 248fed17f3SAndreas Gohr $this->loadSchemaJSON('schema1'); 258fed17f3SAndreas Gohr $this->loadSchemaJSON('schema2'); 268fed17f3SAndreas Gohr 278fed17f3SAndreas Gohr $as = mock\Assignments::getInstance(); 288fed17f3SAndreas Gohr 293ff5da8aSAndreas Gohr // save all data with the same fake revision 303ff5da8aSAndreas Gohr $this->fixedrev = time(); 313ff5da8aSAndreas Gohr 328fed17f3SAndreas Gohr $as->assignPageSchema('page01', 'schema1'); 338fed17f3SAndreas Gohr $this->saveData( 348fed17f3SAndreas Gohr 'page01', 358fed17f3SAndreas Gohr 'schema1', 368fed17f3SAndreas Gohr [ 378fed17f3SAndreas Gohr 'first' => 'first data', 388fed17f3SAndreas Gohr 'second' => ['second data', 'more data', 'even more'], 398fed17f3SAndreas Gohr 'third' => 'third data', 408fed17f3SAndreas Gohr 'fourth' => 'fourth data' 418fed17f3SAndreas Gohr ], 423ff5da8aSAndreas Gohr $this->fixedrev 438fed17f3SAndreas Gohr ); 448fed17f3SAndreas Gohr 458fed17f3SAndreas Gohr $as->assignPageSchema('page01', 'schema2'); 468fed17f3SAndreas Gohr $this->saveData( 478fed17f3SAndreas Gohr 'page01', 488fed17f3SAndreas Gohr 'schema2', 498fed17f3SAndreas Gohr [ 508fed17f3SAndreas Gohr 'afirst' => 'first data', 518fed17f3SAndreas Gohr 'asecond' => ['second data', 'more data', 'even more'], 528fed17f3SAndreas Gohr 'athird' => 'third data', 538fed17f3SAndreas Gohr 'afourth' => 'fourth data' 548fed17f3SAndreas Gohr ], 553ff5da8aSAndreas Gohr $this->fixedrev 568fed17f3SAndreas Gohr ); 578fed17f3SAndreas Gohr 588fed17f3SAndreas Gohr for ($i = 10; $i <= 20; $i++) { 598fed17f3SAndreas Gohr $as->assignPageSchema("page$i", 'schema2'); 608fed17f3SAndreas Gohr $this->saveData( 618fed17f3SAndreas Gohr "page$i", 628fed17f3SAndreas Gohr 'schema2', 638fed17f3SAndreas Gohr [ 648fed17f3SAndreas Gohr 'afirst' => "page$i first data", 658fed17f3SAndreas Gohr 'asecond' => ["page$i second data"], 668fed17f3SAndreas Gohr 'athird' => "page$i third data", 678fed17f3SAndreas Gohr 'afourth' => "page$i fourth data" 688fed17f3SAndreas Gohr ], 693ff5da8aSAndreas Gohr $this->fixedrev 708fed17f3SAndreas Gohr ); 718fed17f3SAndreas Gohr } 728fed17f3SAndreas Gohr } 738fed17f3SAndreas Gohr 748fed17f3SAndreas Gohr public function test_constructor() 758fed17f3SAndreas Gohr { 768fed17f3SAndreas Gohr global $INPUT; 778fed17f3SAndreas Gohr 788fed17f3SAndreas Gohr $data = [ 798fed17f3SAndreas Gohr 'schemas' => [ 808fed17f3SAndreas Gohr ['schema1', 'alias1'], 818fed17f3SAndreas Gohr ['schema2', 'alias2'], 828fed17f3SAndreas Gohr ], 838fed17f3SAndreas Gohr 'cols' => [ 848fed17f3SAndreas Gohr '%pageid%', 858fed17f3SAndreas Gohr 'first', 'second', 'third', 'fourth', 868fed17f3SAndreas Gohr 'afirst', 'asecond', 'athird', 'afourth', 878fed17f3SAndreas Gohr ] 888fed17f3SAndreas Gohr ]; 898fed17f3SAndreas Gohr 908fed17f3SAndreas Gohr // init with no parameters 918fed17f3SAndreas Gohr $expect = $data; 928fed17f3SAndreas Gohr $params = []; 938fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 948fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 958fed17f3SAndreas Gohr $this->assertEquals($expect, $searchConfig->getConf()); 968fed17f3SAndreas Gohr $this->assertEquals($params, $dynamic->getURLParameters()); 978fed17f3SAndreas Gohr 988fed17f3SAndreas Gohr // init with sort 998fed17f3SAndreas Gohr $INPUT->set(meta\SearchConfigParameters::$PARAM_SORT, '^alias2.athird'); 1008fed17f3SAndreas Gohr $expect['sort'] = [['schema2.athird', false]]; 1018fed17f3SAndreas Gohr $params[meta\SearchConfigParameters::$PARAM_SORT] = '^schema2.athird'; 1028fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 1038fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 1048fed17f3SAndreas Gohr $this->assertEquals($expect, $searchConfig->getConf()); 1058fed17f3SAndreas Gohr $this->assertEquals($params, $dynamic->getURLParameters()); 1068fed17f3SAndreas Gohr 1078fed17f3SAndreas Gohr // init with offset 1088fed17f3SAndreas Gohr $INPUT->set(meta\SearchConfigParameters::$PARAM_OFFSET, 25); 1098fed17f3SAndreas Gohr $expect['offset'] = 25; 1108fed17f3SAndreas Gohr $params[meta\SearchConfigParameters::$PARAM_OFFSET] = 25; 1118fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 1128fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 1138fed17f3SAndreas Gohr $this->assertEquals($expect, $searchConfig->getConf()); 1148fed17f3SAndreas Gohr $this->assertEquals($params, $dynamic->getURLParameters()); 1158fed17f3SAndreas Gohr 1168fed17f3SAndreas Gohr // init with filters 1178fed17f3SAndreas Gohr $_REQUEST[meta\SearchConfigParameters::$PARAM_FILTER]['alias1.first*~'] = 'test'; 1188fed17f3SAndreas Gohr $_REQUEST[meta\SearchConfigParameters::$PARAM_FILTER]['afirst='] = 'test2'; 1198fed17f3SAndreas Gohr $expect['filter'] = [ 1208fed17f3SAndreas Gohr ['schema1.first', '*~', 'test', 'AND'], 1218fed17f3SAndreas Gohr ['schema2.afirst', '=', 'test2', 'AND'] 1228fed17f3SAndreas Gohr ]; 1238fed17f3SAndreas Gohr $params[meta\SearchConfigParameters::$PARAM_FILTER . '[schema1.first*~]'] = 'test'; 1248fed17f3SAndreas Gohr $params[meta\SearchConfigParameters::$PARAM_FILTER . '[schema2.afirst=]'] = 'test2'; 1258fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 1268fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 1278fed17f3SAndreas Gohr $this->assertEquals($expect, $searchConfig->getConf()); 1288fed17f3SAndreas Gohr $this->assertEquals($params, $dynamic->getURLParameters()); 1298fed17f3SAndreas Gohr } 1308fed17f3SAndreas Gohr 1318fed17f3SAndreas Gohr public function test_filter() 1328fed17f3SAndreas Gohr { 1338fed17f3SAndreas Gohr $data = [ 1348fed17f3SAndreas Gohr 'schemas' => [ 1358fed17f3SAndreas Gohr ['schema1', 'alias1'], 1368fed17f3SAndreas Gohr ['schema2', 'alias2'], 1378fed17f3SAndreas Gohr ], 1388fed17f3SAndreas Gohr 'cols' => [ 1398fed17f3SAndreas Gohr '%pageid%', 1408fed17f3SAndreas Gohr 'first', 'second', 'third', 'fourth', 1418fed17f3SAndreas Gohr 'afirst', 'asecond', 'athird', 'afourth', 1428fed17f3SAndreas Gohr ] 1438fed17f3SAndreas Gohr ]; 1448fed17f3SAndreas Gohr 1458fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 1468fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 1478fed17f3SAndreas Gohr $expect = []; 1488fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1498fed17f3SAndreas Gohr 1508fed17f3SAndreas Gohr $dynamic->addFilter('first', '*~', 'test'); 1518fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test']]; 1528fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1538fed17f3SAndreas Gohr 1548fed17f3SAndreas Gohr $dynamic->addFilter('asecond', '*~', 'test2'); 1558fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test'], 'schema2.asecond' => ['*~', 'test2']]; 1568fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1578fed17f3SAndreas Gohr 1588fed17f3SAndreas Gohr // overwrite a filter 1598fed17f3SAndreas Gohr $dynamic->addFilter('asecond', '*~', 'foobar'); 1608fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test'], 'schema2.asecond' => ['*~', 'foobar']]; 1618fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1628fed17f3SAndreas Gohr 1638fed17f3SAndreas Gohr // overwrite a filter with blank removes 1648fed17f3SAndreas Gohr $dynamic->addFilter('asecond', '*~', ''); 1658fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test']]; 1668fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1678fed17f3SAndreas Gohr 1688fed17f3SAndreas Gohr // adding unknown filter does nothing 1698fed17f3SAndreas Gohr $dynamic->addFilter('nope', '*~', 'foobar'); 1708fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test']]; 1718fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1728fed17f3SAndreas Gohr 1738fed17f3SAndreas Gohr // removing unknown column does nothing 1748fed17f3SAndreas Gohr $dynamic->removeFilter('nope'); 1758fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test']]; 1768fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1778fed17f3SAndreas Gohr 1788fed17f3SAndreas Gohr $dynamic->removeFilter('first'); 1798fed17f3SAndreas Gohr $expect = []; 1808fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 1818fed17f3SAndreas Gohr } 1828fed17f3SAndreas Gohr 1838fed17f3SAndreas Gohr public function test_sort() 1848fed17f3SAndreas Gohr { 1858fed17f3SAndreas Gohr $data = [ 1868fed17f3SAndreas Gohr 'schemas' => [ 1878fed17f3SAndreas Gohr ['schema1', 'alias1'], 1888fed17f3SAndreas Gohr ['schema2', 'alias2'], 1898fed17f3SAndreas Gohr ], 1908fed17f3SAndreas Gohr 'cols' => [ 1918fed17f3SAndreas Gohr '%pageid%', 1928fed17f3SAndreas Gohr 'first', 'second', 'third', 'fourth', 1938fed17f3SAndreas Gohr 'afirst', 'asecond', 'athird', 'afourth', 1948fed17f3SAndreas Gohr ] 1958fed17f3SAndreas Gohr ]; 1968fed17f3SAndreas Gohr 1978fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 1988fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 1998fed17f3SAndreas Gohr 200850ad33eSAndreas Gohr $dynamic->setSort('%pageid%'); 2018fed17f3SAndreas Gohr $conf = $dynamic->updateConfig($data); 2028fed17f3SAndreas Gohr $param = $dynamic->getURLParameters(); 2038fed17f3SAndreas Gohr $this->assertEquals([['%pageid%', true]], $conf['sort']); 2048fed17f3SAndreas Gohr $this->assertArrayHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param); 2058fed17f3SAndreas Gohr $this->assertEquals('%pageid%', $param[meta\SearchConfigParameters::$PARAM_SORT]); 2068fed17f3SAndreas Gohr 2078fed17f3SAndreas Gohr $dynamic->setSort('%pageid%', false); 2088fed17f3SAndreas Gohr $conf = $dynamic->updateConfig($data); 2098fed17f3SAndreas Gohr $param = $dynamic->getURLParameters(); 2108fed17f3SAndreas Gohr $this->assertEquals([['%pageid%', false]], $conf['sort']); 2118fed17f3SAndreas Gohr $this->assertArrayHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param); 2128fed17f3SAndreas Gohr $this->assertEquals('^%pageid%', $param[meta\SearchConfigParameters::$PARAM_SORT]); 2138fed17f3SAndreas Gohr 2148fed17f3SAndreas Gohr $dynamic->removeSort(); 2158fed17f3SAndreas Gohr $conf = $dynamic->updateConfig($data); 2168fed17f3SAndreas Gohr $param = $dynamic->getURLParameters(); 2178fed17f3SAndreas Gohr $this->assertArrayNotHasKey('sort', $conf); 2188fed17f3SAndreas Gohr $this->assertArrayNotHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param); 2198fed17f3SAndreas Gohr } 2208fed17f3SAndreas Gohr 2218fed17f3SAndreas Gohr public function test_pagination() 2228fed17f3SAndreas Gohr { 2238fed17f3SAndreas Gohr global $INPUT; 2248fed17f3SAndreas Gohr 2258fed17f3SAndreas Gohr $data = [ 2268fed17f3SAndreas Gohr 'schemas' => [ 2278fed17f3SAndreas Gohr ['schema2', 'alias2'], 2288fed17f3SAndreas Gohr ], 2298fed17f3SAndreas Gohr 'cols' => [ 2308fed17f3SAndreas Gohr 'afirst' 2318fed17f3SAndreas Gohr ], 2328fed17f3SAndreas Gohr 'rownumbers' => '1', 2338fed17f3SAndreas Gohr 'limit' => '5', 234*af0ce8d2SAndreas Gohr 'nesting' => 0, 235*af0ce8d2SAndreas Gohr 'index' => 0, 236*af0ce8d2SAndreas Gohr 'classes' => [], 2378fed17f3SAndreas Gohr ]; 2388fed17f3SAndreas Gohr 2398fed17f3SAndreas Gohr $R = new \Doku_Renderer_xhtml(); 2408fed17f3SAndreas Gohr // init with offset 2418fed17f3SAndreas Gohr $INPUT->set(meta\SearchConfigParameters::$PARAM_OFFSET, 5); 2428fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 2438fed17f3SAndreas Gohr $aggregationTable = new meta\AggregationTable('test_pagination', 'xhtml', $R, $searchConfig); 244*af0ce8d2SAndreas Gohr $aggregationTable->startScope(); 2458fed17f3SAndreas Gohr $aggregationTable->render(); 246*af0ce8d2SAndreas Gohr $aggregationTable->finishScope(); 2478fed17f3SAndreas Gohr 2488fed17f3SAndreas Gohr $rev = time(); 2498fed17f3SAndreas Gohr 250850ad33eSAndreas Gohr $doc = new Document(); 25176e537bfSAndreas Gohr $doc->html($R->doc); 252850ad33eSAndreas Gohr $table = $doc->find('div.structaggregation'); 253850ad33eSAndreas Gohr 254850ad33eSAndreas Gohr $tr1 = $table->find(".row1"); 2558fed17f3SAndreas Gohr $this->assertEquals('6page14 first data', trim($tr1->text())); 2568fed17f3SAndreas Gohr $this->assertEquals('page14', $tr1->attr('data-pid')); 2578fed17f3SAndreas Gohr $this->assertEquals('0', $tr1->attr('data-rid')); 2583ff5da8aSAndreas Gohr $this->assertEquals($this->fixedrev, $tr1->attr('data-rev')); 2598fed17f3SAndreas Gohr 260850ad33eSAndreas Gohr $tr6aPrev = $table->find(".row6 a.prev"); 2618fed17f3SAndreas Gohr $this->assertEquals('/./doku.php?id=test_pagination', $tr6aPrev->attr('href')); 2628fed17f3SAndreas Gohr 2638fed17f3SAndreas Gohr } 2648fed17f3SAndreas Gohr} 265