1*8fed17f3SAndreas Gohr<?php 2*8fed17f3SAndreas Gohr 3*8fed17f3SAndreas Gohrnamespace dokuwiki\plugin\struct\test; 4*8fed17f3SAndreas Gohr 5*8fed17f3SAndreas Gohruse dokuwiki\plugin\struct\meta; 6*8fed17f3SAndreas Gohr 7*8fed17f3SAndreas Gohr/** 8*8fed17f3SAndreas Gohr * Tests handling dynamic search parameters 9*8fed17f3SAndreas Gohr * 10*8fed17f3SAndreas Gohr * @group plugin_struct 11*8fed17f3SAndreas Gohr * @group plugins 12*8fed17f3SAndreas Gohr * 13*8fed17f3SAndreas Gohr */ 14*8fed17f3SAndreas Gohrclass SearchConfigParameterTest extends StructTest 15*8fed17f3SAndreas Gohr{ 16*8fed17f3SAndreas Gohr 17*8fed17f3SAndreas Gohr public function setUp(): void 18*8fed17f3SAndreas Gohr { 19*8fed17f3SAndreas Gohr parent::setUp(); 20*8fed17f3SAndreas Gohr 21*8fed17f3SAndreas Gohr $this->loadSchemaJSON('schema1'); 22*8fed17f3SAndreas Gohr $this->loadSchemaJSON('schema2'); 23*8fed17f3SAndreas Gohr 24*8fed17f3SAndreas Gohr $as = mock\Assignments::getInstance(); 25*8fed17f3SAndreas Gohr 26*8fed17f3SAndreas Gohr $as->assignPageSchema('page01', 'schema1'); 27*8fed17f3SAndreas Gohr $this->saveData( 28*8fed17f3SAndreas Gohr 'page01', 29*8fed17f3SAndreas Gohr 'schema1', 30*8fed17f3SAndreas Gohr [ 31*8fed17f3SAndreas Gohr 'first' => 'first data', 32*8fed17f3SAndreas Gohr 'second' => ['second data', 'more data', 'even more'], 33*8fed17f3SAndreas Gohr 'third' => 'third data', 34*8fed17f3SAndreas Gohr 'fourth' => 'fourth data' 35*8fed17f3SAndreas Gohr ], 36*8fed17f3SAndreas Gohr time() 37*8fed17f3SAndreas Gohr ); 38*8fed17f3SAndreas Gohr 39*8fed17f3SAndreas Gohr $as->assignPageSchema('page01', 'schema2'); 40*8fed17f3SAndreas Gohr $this->saveData( 41*8fed17f3SAndreas Gohr 'page01', 42*8fed17f3SAndreas Gohr 'schema2', 43*8fed17f3SAndreas Gohr [ 44*8fed17f3SAndreas Gohr 'afirst' => 'first data', 45*8fed17f3SAndreas Gohr 'asecond' => ['second data', 'more data', 'even more'], 46*8fed17f3SAndreas Gohr 'athird' => 'third data', 47*8fed17f3SAndreas Gohr 'afourth' => 'fourth data' 48*8fed17f3SAndreas Gohr ], 49*8fed17f3SAndreas Gohr time() 50*8fed17f3SAndreas Gohr ); 51*8fed17f3SAndreas Gohr 52*8fed17f3SAndreas Gohr for ($i = 10; $i <= 20; $i++) { 53*8fed17f3SAndreas Gohr $as->assignPageSchema("page$i", 'schema2'); 54*8fed17f3SAndreas Gohr $this->saveData( 55*8fed17f3SAndreas Gohr "page$i", 56*8fed17f3SAndreas Gohr 'schema2', 57*8fed17f3SAndreas Gohr [ 58*8fed17f3SAndreas Gohr 'afirst' => "page$i first data", 59*8fed17f3SAndreas Gohr 'asecond' => ["page$i second data"], 60*8fed17f3SAndreas Gohr 'athird' => "page$i third data", 61*8fed17f3SAndreas Gohr 'afourth' => "page$i fourth data" 62*8fed17f3SAndreas Gohr ], 63*8fed17f3SAndreas Gohr time() 64*8fed17f3SAndreas Gohr ); 65*8fed17f3SAndreas Gohr } 66*8fed17f3SAndreas Gohr } 67*8fed17f3SAndreas Gohr 68*8fed17f3SAndreas Gohr public function test_constructor() 69*8fed17f3SAndreas Gohr { 70*8fed17f3SAndreas Gohr global $INPUT; 71*8fed17f3SAndreas Gohr 72*8fed17f3SAndreas Gohr $data = [ 73*8fed17f3SAndreas Gohr 'schemas' => [ 74*8fed17f3SAndreas Gohr ['schema1', 'alias1'], 75*8fed17f3SAndreas Gohr ['schema2', 'alias2'], 76*8fed17f3SAndreas Gohr ], 77*8fed17f3SAndreas Gohr 'cols' => [ 78*8fed17f3SAndreas Gohr '%pageid%', 79*8fed17f3SAndreas Gohr 'first', 'second', 'third', 'fourth', 80*8fed17f3SAndreas Gohr 'afirst', 'asecond', 'athird', 'afourth', 81*8fed17f3SAndreas Gohr ] 82*8fed17f3SAndreas Gohr ]; 83*8fed17f3SAndreas Gohr 84*8fed17f3SAndreas Gohr // init with no parameters 85*8fed17f3SAndreas Gohr $expect = $data; 86*8fed17f3SAndreas Gohr $params = []; 87*8fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 88*8fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 89*8fed17f3SAndreas Gohr $this->assertEquals($expect, $searchConfig->getConf()); 90*8fed17f3SAndreas Gohr $this->assertEquals($params, $dynamic->getURLParameters()); 91*8fed17f3SAndreas Gohr 92*8fed17f3SAndreas Gohr // init with sort 93*8fed17f3SAndreas Gohr $INPUT->set(meta\SearchConfigParameters::$PARAM_SORT, '^alias2.athird'); 94*8fed17f3SAndreas Gohr $expect['sort'] = [['schema2.athird', false]]; 95*8fed17f3SAndreas Gohr $params[meta\SearchConfigParameters::$PARAM_SORT] = '^schema2.athird'; 96*8fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 97*8fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 98*8fed17f3SAndreas Gohr $this->assertEquals($expect, $searchConfig->getConf()); 99*8fed17f3SAndreas Gohr $this->assertEquals($params, $dynamic->getURLParameters()); 100*8fed17f3SAndreas Gohr 101*8fed17f3SAndreas Gohr // init with offset 102*8fed17f3SAndreas Gohr $INPUT->set(meta\SearchConfigParameters::$PARAM_OFFSET, 25); 103*8fed17f3SAndreas Gohr $expect['offset'] = 25; 104*8fed17f3SAndreas Gohr $params[meta\SearchConfigParameters::$PARAM_OFFSET] = 25; 105*8fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 106*8fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 107*8fed17f3SAndreas Gohr $this->assertEquals($expect, $searchConfig->getConf()); 108*8fed17f3SAndreas Gohr $this->assertEquals($params, $dynamic->getURLParameters()); 109*8fed17f3SAndreas Gohr 110*8fed17f3SAndreas Gohr // init with filters 111*8fed17f3SAndreas Gohr $_REQUEST[meta\SearchConfigParameters::$PARAM_FILTER]['alias1.first*~'] = 'test'; 112*8fed17f3SAndreas Gohr $_REQUEST[meta\SearchConfigParameters::$PARAM_FILTER]['afirst='] = 'test2'; 113*8fed17f3SAndreas Gohr $expect['filter'] = [ 114*8fed17f3SAndreas Gohr ['schema1.first', '*~', 'test', 'AND'], 115*8fed17f3SAndreas Gohr ['schema2.afirst', '=', 'test2', 'AND'] 116*8fed17f3SAndreas Gohr ]; 117*8fed17f3SAndreas Gohr $params[meta\SearchConfigParameters::$PARAM_FILTER . '[schema1.first*~]'] = 'test'; 118*8fed17f3SAndreas Gohr $params[meta\SearchConfigParameters::$PARAM_FILTER . '[schema2.afirst=]'] = 'test2'; 119*8fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 120*8fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 121*8fed17f3SAndreas Gohr $this->assertEquals($expect, $searchConfig->getConf()); 122*8fed17f3SAndreas Gohr $this->assertEquals($params, $dynamic->getURLParameters()); 123*8fed17f3SAndreas Gohr } 124*8fed17f3SAndreas Gohr 125*8fed17f3SAndreas Gohr public function test_filter() 126*8fed17f3SAndreas Gohr { 127*8fed17f3SAndreas Gohr $data = [ 128*8fed17f3SAndreas Gohr 'schemas' => [ 129*8fed17f3SAndreas Gohr ['schema1', 'alias1'], 130*8fed17f3SAndreas Gohr ['schema2', 'alias2'], 131*8fed17f3SAndreas Gohr ], 132*8fed17f3SAndreas Gohr 'cols' => [ 133*8fed17f3SAndreas Gohr '%pageid%', 134*8fed17f3SAndreas Gohr 'first', 'second', 'third', 'fourth', 135*8fed17f3SAndreas Gohr 'afirst', 'asecond', 'athird', 'afourth', 136*8fed17f3SAndreas Gohr ] 137*8fed17f3SAndreas Gohr ]; 138*8fed17f3SAndreas Gohr 139*8fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 140*8fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 141*8fed17f3SAndreas Gohr $expect = []; 142*8fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 143*8fed17f3SAndreas Gohr 144*8fed17f3SAndreas Gohr $dynamic->addFilter('first', '*~', 'test'); 145*8fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test']]; 146*8fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 147*8fed17f3SAndreas Gohr 148*8fed17f3SAndreas Gohr $dynamic->addFilter('asecond', '*~', 'test2'); 149*8fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test'], 'schema2.asecond' => ['*~', 'test2']]; 150*8fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 151*8fed17f3SAndreas Gohr 152*8fed17f3SAndreas Gohr // overwrite a filter 153*8fed17f3SAndreas Gohr $dynamic->addFilter('asecond', '*~', 'foobar'); 154*8fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test'], 'schema2.asecond' => ['*~', 'foobar']]; 155*8fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 156*8fed17f3SAndreas Gohr 157*8fed17f3SAndreas Gohr // overwrite a filter with blank removes 158*8fed17f3SAndreas Gohr $dynamic->addFilter('asecond', '*~', ''); 159*8fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test']]; 160*8fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 161*8fed17f3SAndreas Gohr 162*8fed17f3SAndreas Gohr // adding unknown filter does nothing 163*8fed17f3SAndreas Gohr $dynamic->addFilter('nope', '*~', 'foobar'); 164*8fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test']]; 165*8fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 166*8fed17f3SAndreas Gohr 167*8fed17f3SAndreas Gohr // removing unknown column does nothing 168*8fed17f3SAndreas Gohr $dynamic->removeFilter('nope'); 169*8fed17f3SAndreas Gohr $expect = ['schema1.first' => ['*~', 'test']]; 170*8fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 171*8fed17f3SAndreas Gohr 172*8fed17f3SAndreas Gohr $dynamic->removeFilter('first'); 173*8fed17f3SAndreas Gohr $expect = []; 174*8fed17f3SAndreas Gohr $this->assertEquals($expect, $dynamic->getFilters()); 175*8fed17f3SAndreas Gohr } 176*8fed17f3SAndreas Gohr 177*8fed17f3SAndreas Gohr public function test_sort() 178*8fed17f3SAndreas Gohr { 179*8fed17f3SAndreas Gohr $data = [ 180*8fed17f3SAndreas Gohr 'schemas' => [ 181*8fed17f3SAndreas Gohr ['schema1', 'alias1'], 182*8fed17f3SAndreas Gohr ['schema2', 'alias2'], 183*8fed17f3SAndreas Gohr ], 184*8fed17f3SAndreas Gohr 'cols' => [ 185*8fed17f3SAndreas Gohr '%pageid%', 186*8fed17f3SAndreas Gohr 'first', 'second', 'third', 'fourth', 187*8fed17f3SAndreas Gohr 'afirst', 'asecond', 'athird', 'afourth', 188*8fed17f3SAndreas Gohr ] 189*8fed17f3SAndreas Gohr ]; 190*8fed17f3SAndreas Gohr 191*8fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 192*8fed17f3SAndreas Gohr $dynamic = $searchConfig->getDynamicParameters(); 193*8fed17f3SAndreas Gohr 194*8fed17f3SAndreas Gohr $dynamic->setSort('%pageid%', true); 195*8fed17f3SAndreas Gohr $conf = $dynamic->updateConfig($data); 196*8fed17f3SAndreas Gohr $param = $dynamic->getURLParameters(); 197*8fed17f3SAndreas Gohr $this->assertEquals([['%pageid%', true]], $conf['sort']); 198*8fed17f3SAndreas Gohr $this->assertArrayHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param); 199*8fed17f3SAndreas Gohr $this->assertEquals('%pageid%', $param[meta\SearchConfigParameters::$PARAM_SORT]); 200*8fed17f3SAndreas Gohr 201*8fed17f3SAndreas Gohr $dynamic->setSort('%pageid%', false); 202*8fed17f3SAndreas Gohr $conf = $dynamic->updateConfig($data); 203*8fed17f3SAndreas Gohr $param = $dynamic->getURLParameters(); 204*8fed17f3SAndreas Gohr $this->assertEquals([['%pageid%', false]], $conf['sort']); 205*8fed17f3SAndreas Gohr $this->assertArrayHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param); 206*8fed17f3SAndreas Gohr $this->assertEquals('^%pageid%', $param[meta\SearchConfigParameters::$PARAM_SORT]); 207*8fed17f3SAndreas Gohr 208*8fed17f3SAndreas Gohr $dynamic->removeSort(); 209*8fed17f3SAndreas Gohr $conf = $dynamic->updateConfig($data); 210*8fed17f3SAndreas Gohr $param = $dynamic->getURLParameters(); 211*8fed17f3SAndreas Gohr $this->assertArrayNotHasKey('sort', $conf); 212*8fed17f3SAndreas Gohr $this->assertArrayNotHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param); 213*8fed17f3SAndreas Gohr } 214*8fed17f3SAndreas Gohr 215*8fed17f3SAndreas Gohr public function test_pagination() 216*8fed17f3SAndreas Gohr { 217*8fed17f3SAndreas Gohr global $INPUT; 218*8fed17f3SAndreas Gohr 219*8fed17f3SAndreas Gohr $data = [ 220*8fed17f3SAndreas Gohr 'schemas' => [ 221*8fed17f3SAndreas Gohr ['schema2', 'alias2'], 222*8fed17f3SAndreas Gohr ], 223*8fed17f3SAndreas Gohr 'cols' => [ 224*8fed17f3SAndreas Gohr 'afirst' 225*8fed17f3SAndreas Gohr ], 226*8fed17f3SAndreas Gohr 'rownumbers' => '1', 227*8fed17f3SAndreas Gohr 'limit' => '5', 228*8fed17f3SAndreas Gohr ]; 229*8fed17f3SAndreas Gohr 230*8fed17f3SAndreas Gohr $R = new \Doku_Renderer_xhtml(); 231*8fed17f3SAndreas Gohr // init with offset 232*8fed17f3SAndreas Gohr $INPUT->set(meta\SearchConfigParameters::$PARAM_OFFSET, 5); 233*8fed17f3SAndreas Gohr //$params[meta\SearchConfigParameters::$PARAM_OFFSET] = 25; 234*8fed17f3SAndreas Gohr $searchConfig = new meta\SearchConfig($data); 235*8fed17f3SAndreas Gohr $aggregationTable = new meta\AggregationTable('test_pagination', 'xhtml', $R, $searchConfig); 236*8fed17f3SAndreas Gohr $aggregationTable->render(); 237*8fed17f3SAndreas Gohr 238*8fed17f3SAndreas Gohr $rev = time(); 239*8fed17f3SAndreas Gohr $expect_html = '<div class="structaggregation"><div class="table"><table class="inline"> 240*8fed17f3SAndreas Gohr <thead> 241*8fed17f3SAndreas Gohr <tr class="row0"> 242*8fed17f3SAndreas Gohr <th class="col0">#</th><th data-field="schema2.afirst"><a href="/./doku.php?id=test_pagination&ofs=5&srt=schema2.afirst" class="" title="Sort by this column">afirst</a></th> 243*8fed17f3SAndreas Gohr </tr> 244*8fed17f3SAndreas Gohr </thead> 245*8fed17f3SAndreas Gohr <tbody> 246*8fed17f3SAndreas Gohr <tr class="row1" data-pid="page14" data-rev="' . $rev . '" data-rid="0"><td class="col0">6</td><td class="col1">page14 first data</td> 247*8fed17f3SAndreas Gohr </tr> 248*8fed17f3SAndreas Gohr <tr class="row2" data-pid="page15" data-rev="' . $rev . '" data-rid="0"><td class="col0">7</td><td class="col1">page15 first data</td> 249*8fed17f3SAndreas Gohr </tr> 250*8fed17f3SAndreas Gohr <tr class="row3" data-pid="page16" data-rev="' . $rev . '" data-rid="0"><td class="col0">8</td><td class="col1">page16 first data</td> 251*8fed17f3SAndreas Gohr </tr> 252*8fed17f3SAndreas Gohr <tr class="row4" data-pid="page17" data-rev="' . $rev . '" data-rid="0"><td class="col0">9</td><td class="col1">page17 first data</td> 253*8fed17f3SAndreas Gohr </tr> 254*8fed17f3SAndreas Gohr <tr class="row5" data-pid="page18" data-rev="' . $rev . '" data-rid="0"><td class="col0">10</td><td class="col1">page18 first data</td> 255*8fed17f3SAndreas Gohr </tr> 256*8fed17f3SAndreas Gohr </tbody> 257*8fed17f3SAndreas Gohr <tfoot> 258*8fed17f3SAndreas Gohr <tr class="row6"> 259*8fed17f3SAndreas Gohr <th class="col0" colspan="2"><a href="/./doku.php?id=test_pagination" class="prev">Previous page</a><a href="/./doku.php?id=test_pagination&ofs=10" class="next">Next page</a></th> 260*8fed17f3SAndreas Gohr </tr> 261*8fed17f3SAndreas Gohr </tfoot> 262*8fed17f3SAndreas Gohr</table></div> 263*8fed17f3SAndreas Gohr</div>'; 264*8fed17f3SAndreas Gohr 265*8fed17f3SAndreas Gohr $pq = \phpQuery::newDocument($expect_html); 266*8fed17f3SAndreas Gohr $tr1 = $pq->find(".row1"); 267*8fed17f3SAndreas Gohr $this->assertEquals('6page14 first data', trim($tr1->text())); 268*8fed17f3SAndreas Gohr $this->assertEquals('page14', $tr1->attr('data-pid')); 269*8fed17f3SAndreas Gohr $this->assertEquals('0', $tr1->attr('data-rid')); 270*8fed17f3SAndreas Gohr $this->assertEquals($rev, $tr1->attr('data-rev')); 271*8fed17f3SAndreas Gohr 272*8fed17f3SAndreas Gohr $tr6aPrev = $pq->find(".row6 a.prev"); 273*8fed17f3SAndreas Gohr $this->assertEquals('/./doku.php?id=test_pagination', $tr6aPrev->attr('href')); 274*8fed17f3SAndreas Gohr 275*8fed17f3SAndreas Gohr } 276*8fed17f3SAndreas Gohr} 277