1<?php 2 3/** 4 * Test sorting 5 * 6 * Principle copied from _test/tests/lib/exe/ajax_requests.test.php 7 * 8 * @group ajax 9 * @group plugin_indexmenu 10 * @group plugins 11 */ 12class AjaxRequestsTest extends DokuWikiTest 13{ 14 public function setUp(): void 15 { 16 $this->pluginsEnabled[] = 'indexmenu'; 17 parent::setUp(); // this enables the indexmenu plugin 18 19 //needed for 'tsort' to use First headings, sets title during search, otherwise as fallback page name used. 20 global $conf; 21 $conf['useheading'] = 'navigation'; 22 23 24 // for testing sorting pages 25 saveWikiText('ns2:cpage', "======Bb======\nText", 'Sort different page/title/creation date'); 26 sleep(1); // ensure different timestamps for 'dsort' 27 saveWikiText('ns2:bpage', "======Aa======\nText", 'Sort different page/title/creation date'); 28 sleep(1); 29 saveWikiText('ns2:apage', "======Cc======\nText", 'Sort different page/title/creation date'); 30 31 //ensures title is added to metadata of page 32 idx_addPage('ns2:cpage'); 33 idx_addPage('ns2:bpage'); 34 idx_addPage('ns2:apage'); 35 36 // pages on different levels 37 saveWikiText('ns1:ns2:apage', "======Bb======\nPage on level 2", 'Created page on level 2'); 38 saveWikiText('ns1:ns1:apage', "======Ee======\nPage on level 2", 'Created page on level 2'); 39 saveWikiText('ns1:ns1:lvl3:lvl4:apage', "======Cc======\nPage on levl 4", 'Page on level 4'); 40 saveWikiText('ns1:ns1:start', "======Aa======\nPage on level 2", 'Startpage on level 2'); 41 saveWikiText('ns1:ns0:bpage', "======Aa2======\nPage on level 2", 'Created page on level 2'); 42 saveWikiText('ns1:apage', "======Dd======\nPage on level 1", 'Created page on level 1'); 43 44 //ensures title is added to metadata 45 idx_addPage('ns1:ns1:apage'); 46 idx_addPage('ns1:ns1:lvl3:lvl4:apage'); 47 idx_addPage('ns1:ns1:start'); 48 idx_addPage('ns1:ns2:apage'); 49 idx_addPage('ns1:ns0:bpage'); 50 idx_addPage('ns1:apage'); 51 } 52 53 /** 54 * DataProvider for the builtin Ajax calls 55 * 56 * @return array 57 */ 58 public static function indexmenuCalls() 59 { 60 return [ 61 // Call, POST parameters, result function 62 [ 63 'indexmenu', 64 AjaxRequestsTest::prepareParams(['level' => 1]), 65 'expectedResultWiki' 66 ], 67 [ 68 'indexmenu', 69 AjaxRequestsTest::prepareParams(['ns' => 'ns2', 'level' => 1]), 70 'expectedResultNs2PageSort' 71 ], 72 [ 73 'indexmenu', 74 AjaxRequestsTest::prepareParams(['ns' => 'ns2', 'level' => 1, 'sort' => 't']), 75 'expectedResultNs2TitleSort' 76 ], 77 [ 78 'indexmenu', 79 AjaxRequestsTest::prepareParams(['ns' => 'ns2', 'level' => 1, 'sort' => 'd']), 80 'expectedResultNs2CreationDateSort' 81 ], 82 [ 83 'indexmenu', 84 AjaxRequestsTest::prepareParams(['ns' => 'ns1', 'level' => 1, 'sort' => 't']), 85 'expectedResultNs1TitleSort' 86 ], 87 [ 88 'indexmenu', 89 AjaxRequestsTest::prepareParams(['ns' => 'ns1', 'level' => 1, 'sort' => 't', 'nsort' => 1]), 90 'expectedResultNs1TitleSortNamespaceSort' 91 ] 92 ]; 93 } 94 95 /** 96 * @dataProvider indexmenuCalls 97 * 98 * @param string $call 99 * @param array $post 100 * @param $expectedResult 101 */ 102 public function testBasicSorting($call, $post, $expectedResult) 103 { 104 $request = new TestRequest(); 105 $response = $request->post(['call' => $call] + $post, '/lib/exe/ajax.php'); 106// $this->assertNotEquals("AJAX call '$call' unknown!\n", $response->getContent()); 107 108//var_export(json_decode($response->getContent()), true); // print as PHP array 109 110 $actualArray = json_decode($response->getContent(), true); 111 unset($actualArray['debug']); 112 unset($actualArray['sort']); 113 unset($actualArray['opts']); 114 115 $this->assertEquals($this->$expectedResult(), $actualArray); 116 117// $regexp: null, or regexp pattern to match 118// example: '/^<div class="odd type_d/' 119// if (!empty($regexp)) { 120// $this->assertRegExp($regexp, $response->getContent()); 121// } 122 123 } 124 125 public function test_params() 126 { 127// print_r(AjaxRequestsTest::prepareParams(['level' => 2])); 128 129 $this->assertTrue(true); 130 } 131 132 public static function prepareParams($params = []) 133 { 134 $defaults = [ 135 'ns' => 'wiki', 136 'req' => 'fancytree', 137 'level' => 1, 138 'nons' => 0, 139 'nopg' => 0, 140 'max' => 0, 141 'skipns' => ['/^board:(first|second|third|fourth|fifth)$/'], 142 'skipfile' => ['/(:start$)/'], 143 'sort' => 0, 144 'msort' => 0, 145 'rsort' => 0, 146 'nsort' => 0, 147 'hsort' => 0, 148 'init' => 1 149 ]; 150 $return = []; 151 foreach ($defaults as $key => $default) { 152 $return[$key] = $params[$key] ?? $default; 153 } 154 return $return; 155 } 156 157 public function expectedResultWiki() 158 { 159 return [ 160 'children' => [ 161 0 => [ 162 'title' => 'dokuwiki', 163 'key' => 'wiki:dokuwiki', 164 'hns' => false, 165 'url' => '/./doku.php?id=wiki:dokuwiki' 166 ], 167 1 => [ 168 'title' => 'syntax', 169 'key' => 'wiki:syntax', 170 'hns' => false, 171 'url' => '/./doku.php?id=wiki:syntax' 172 ] 173 ]]; 174 } 175 176 public function expectedResultNs1() 177 { 178 return [ 179 'children' => [ 180 0 => [ 181 'title' => 'dokuwiki', 182 'key' => 'wiki:dokuwiki', 183 'hns' => false, 184 'url' => '/./doku.php?id=wiki:dokuwiki' 185 ], 186 1 => [ 187 'title' => 'syntax', 188 'key' => 'wiki:syntax', 189 'hns' => false, 190 'url' => '/./doku.php?id=wiki:syntax' 191 ] 192 ]]; 193 } 194 195 public function expectedResultNs2PageSort() 196 { 197 return [ 198 'children' => [ 199 0 => [ 200 'title' => 'Cc', 201 'key' => 'ns2:apage', 202 'hns' => false, 203 'url' => '/./doku.php?id=ns2:apage' 204 ], 205 1 => [ 206 'title' => 'Aa', 207 'key' => 'ns2:bpage', 208 'hns' => false, 209 'url' => '/./doku.php?id=ns2:bpage' 210 ], 211 2 => [ 212 'title' => 'Bb', 213 'key' => 'ns2:cpage', 214 'hns' => false, 215 'url' => '/./doku.php?id=ns2:cpage' 216 ] 217 ]]; 218 } 219 220 public function expectedResultNs2TitleSort() 221 { 222 return [ 223 'children' => [ 224 0 => [ 225 'title' => 'Aa', 226 'key' => 'ns2:bpage', 227 'hns' => false, 228 'url' => '/./doku.php?id=ns2:bpage' 229 ], 230 1 => [ 231 'title' => 'Bb', 232 'key' => 'ns2:cpage', 233 'hns' => false, 234 'url' => '/./doku.php?id=ns2:cpage' 235 ], 236 2 => [ 237 'title' => 'Cc', 238 'key' => 'ns2:apage', 239 'hns' => false, 240 'url' => '/./doku.php?id=ns2:apage' 241 ] 242 ]]; 243 } 244 245 public function expectedResultNs2CreationDateSort() 246 { 247 return [ 248 'children' => [ 249 0 => [ 250 'title' => 'Bb', 251 'key' => 'ns2:cpage', 252 'hns' => false, 253 'url' => '/./doku.php?id=ns2:cpage' 254 ], 255 1 => [ 256 'title' => 'Aa', 257 'key' => 'ns2:bpage', 258 'hns' => false, 259 'url' => '/./doku.php?id=ns2:bpage' 260 ], 261 2 => [ 262 'title' => 'Cc', 263 'key' => 'ns2:apage', 264 'hns' => false, 265 'url' => '/./doku.php?id=ns2:apage' 266 ] 267 ]]; 268 } 269 270 public function expectedResultNs1TitleSort() 271 { 272 return [ 273 'children' => [ 274 0 => [ 275 'title' => 'ns0', 276 'key' => 'ns1:ns0:', 277 'hns' => false, 278 'folder' => true, 279 'lazy' => true, 280 'url' => false 281 ], 282 1 => [ 283 'title' => 'Aa', 284 'key' => 'ns1:ns1:', 285 'hns' => 'ns1:ns1:start', 286 'folder' => true, 287 'lazy' => true, 288 'url' => '/./doku.php?id=ns1:ns1:start' 289 ], 290 2 => [ 291 'title' => 'ns2', 292 'key' => 'ns1:ns2:', 293 'hns' => false, 294 'folder' => true, 295 'lazy' => true, 296 'url' => false 297 ], 298 3 => [ 299 'title' => 'Dd', 300 'key' => 'ns1:apage', 301 'hns' => false, 302 'url' => '/./doku.php?id=ns1:apage' 303 ] 304 ]]; 305 } 306 307 public function expectedResultNs1TitleSortNamespaceSort() 308 { 309 // 'nsort' let the sort explicitly use the namespace name as sort key. 310 // 'nsort' + 'tsort' works only for nsort if head pages are used. 311 return [ 312 'children' => [ 313 0 => [ 314 'title' => 'Aa', 315 'key' => 'ns1:ns1:', 316 'hns' => 'ns1:ns1:start', 317 'folder' => true, 318 'lazy' => true, 319 'url' => '/./doku.php?id=ns1:ns1:start' 320 ], 321 1 => [ 322 'title' => 'Dd', 323 'key' => 'ns1:apage', 324 'hns' => false, 325 'url' => '/./doku.php?id=ns1:apage' 326 ], 327 2 => [ 328 'title' => 'ns0', 329 'key' => 'ns1:ns0:', 330 'hns' => false, 331 'folder' => true, 332 'lazy' => true, 333 'url' => false 334 ], 335 3 => [ 336 'title' => 'ns2', 337 'key' => 'ns1:ns2:', 338 'hns' => false, 339 'folder' => true, 340 'lazy' => true, 341 'url' => false 342 ] 343 ]]; 344 } 345} 346