You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

346 lines
11 KiB

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