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