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