1<?php
2
3/**
4 * @group ajax
5 */
6class ajax_requests_test extends DokuWikiTest {
7
8    /**
9     * DataProvider for the builtin Ajax calls
10     *
11     * @return array
12     */
13    public function defaultCalls() {
14        return [
15            // TODO: better logic and DOM walks
16            // Call           | POST     |   regexp pattern to match
17            [ 'linkwiz',      ['q' => ''], '/^<div class="odd type_d/' ],
18            [ 'suggestions',  ['q' => ''], null ],
19            [ 'lock',         ['id' => ''], null ],
20            [ 'draftdel',     ['id' => ''], null ],
21            [ 'medians',      ['ns' => 'some:ns'], null ],
22            [ 'medialist',    ['ns' => '', 'recent' => '', 'do' => ''], null ],
23            [ 'mediadetails', ['image' => ''], null ],
24            [ 'mediadiff',    ['image' => ''], null ],
25            [ 'mediaupload',  ['mediaid' => '', 'qqfile' => '' ], null ], // $_FILES
26            [ 'index',        ['idx' => ''], null ],
27            [ 'linkwiz',      ['q' => ''], null ],
28        ];
29    }
30
31    /**
32     * @dataProvider defaultCalls
33     * @param string $call
34     * @param array $post
35     * @param string $regexp
36     */
37    public function test_defaultCallsExist($call, $post, $regexp) {
38
39        $request = new TestRequest();
40        $response = $request->post(['call'=> $call]+$post, '/lib/exe/ajax.php');
41        $this->assertNotEquals("AJAX call '$call' unknown!\n", $response->getContent());
42
43        if (!empty($regexp)) {
44            $this->assertMatchesRegularExpression($regexp, $response->getContent());
45        }
46    }
47
48    public function test_CallNotProvided() {
49        $request = new TestRequest();
50        $response = $request->post([], '/lib/exe/ajax.php');
51        $this->assertEquals('', $response->getContent());
52    }
53
54    public function test_UnknownCall() {
55        $call = 'unknownCALL';
56        $request = new TestRequest();
57        $response = $request->post(['call'=> $call], '/lib/exe/ajax.php');
58        $this->assertEquals("AJAX call '$call' unknown!\n", $response->getContent());
59    }
60
61
62    public function test_EventOnUnknownCall() {
63        global $EVENT_HANDLER;
64        $call = 'unknownCALL';
65        $request = new TestRequest();
66
67        // referenced data from event hook
68        $hookTriggered = false;
69        $eventDataTriggered = '';
70        $dataTriggered = '';
71        $postTriggered = '';
72
73        $hookTriggered_AFTER = false;
74        $eventDataTriggered_AFTER  = '';
75        $dataTriggered_AFTER  = '';
76        $postTriggered_AFTER  = '';
77
78        $EVENT_HANDLER->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', null,
79            function($event, $data) use (&$hookTriggered, &$dataTriggered, &$eventDataTriggered, &$postTriggered) {
80                /** @var Doku_Event $event */
81                $hookTriggered = true;
82                $dataTriggered = $data;
83                $eventDataTriggered = $event->data;
84                $postTriggered = $GLOBALS['INPUT']->post->str('q');
85                $event->preventDefault();
86                $event->stopPropagation();
87                echo "captured event BEFORE\n";
88            }, 'some passed data'
89        );
90
91        $EVENT_HANDLER->register_hook('AJAX_CALL_UNKNOWN', 'AFTER', null,
92            function($event, $data) use (&$hookTriggered_AFTER , &$dataTriggered_AFTER , &$eventDataTriggered_AFTER , &$postTriggered_AFTER ) {
93                /** @var Doku_Event $event */
94                $hookTriggered_AFTER  = true;
95                $dataTriggered_AFTER  = $data;
96                $eventDataTriggered_AFTER  = $event->data;
97                $postTriggered_AFTER  = $GLOBALS['INPUT']->post->str('q');
98                $event->preventDefault();
99                $event->stopPropagation();
100                echo "captured event AFTER";
101            }, 'some passed data AFTER'
102        );
103
104
105        $response = $request->post(['call'=> $call, 'q' => 'some-post-param'], '/lib/exe/ajax.php');
106
107        // BEFORE
108        $this->assertEquals(true, $hookTriggered, 'Testing plugin did not trigger!');
109        $this->assertEquals('some passed data', $dataTriggered);
110        $this->assertEquals($call, $eventDataTriggered, 'Must pass call name as event data');
111        $this->assertEquals('some-post-param', $postTriggered);
112
113        // AFTER
114        $this->assertEquals(true, $hookTriggered_AFTER, 'Testing plugin did not trigger!');
115        $this->assertEquals('some passed data AFTER', $dataTriggered_AFTER);
116        $this->assertEquals($call, $eventDataTriggered_AFTER, 'Must pass call name as event data');
117        $this->assertEquals('some-post-param', $postTriggered_AFTER);
118
119        //output
120        $this->assertEquals("captured event BEFORE\ncaptured event AFTER", $response->getContent());
121
122    }
123}
124