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