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