xref: /dokuwiki/_test/tests/lib/exe/ajax_requests.test.php (revision 814e20b885024d75719ca160139e824af2bb9992)
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        if($call == 'index') {
40            //echo $response->getContent(); die;
41        }
42        $this->assertTrue(function_exists('ajax_'.$call));
43    }
44
45    public function test_CallNotProvided() {
46        $request = new TestRequest();
47        $response = $request->post([], '/lib/exe/ajax.php');
48        $this->assertEquals('', $response->getContent());
49    }
50
51    public function test_UnknownCall() {
52        $call = 'unknownCALL';
53        $request = new TestRequest();
54        $response = $request->post(['call'=> $call], '/lib/exe/ajax.php');
55        $this->assertEquals("AJAX call '$call' unknown!\n", $response->getContent());
56        $this->assertFalse(function_exists('ajax_'.$call));
57    }
58
59
60    public function test_EventOnUnknownCall() {
61        global $EVENT_HANDLER;
62        $call = 'unknownCALL';
63        $request = new TestRequest();
64
65        // referenced data from event hook
66        $hookTriggered = false;
67        $eventDataTriggered = '';
68        $dataTriggered = '';
69        $postTriggered = '';
70
71        $hookTriggered_AFTER = false;
72        $eventDataTriggered_AFTER  = '';
73        $dataTriggered_AFTER  = '';
74        $postTriggered_AFTER  = '';
75
76        $EVENT_HANDLER->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', null,
77            function($event, $data) use (&$hookTriggered, &$dataTriggered, &$eventDataTriggered, &$postTriggered) {
78                /** @var Doku_Event $event */
79                $hookTriggered = true;
80                $dataTriggered = $data;
81                $eventDataTriggered = $event->data;
82                $postTriggered = $GLOBALS['INPUT']->post->str('q');
83                $event->preventDefault();
84                $event->stopPropagation();
85                echo "captured event BEFORE\n";
86            }, 'some passed data'
87        );
88
89        $EVENT_HANDLER->register_hook('AJAX_CALL_UNKNOWN', 'AFTER', null,
90            function($event, $data) use (&$hookTriggered_AFTER , &$dataTriggered_AFTER , &$eventDataTriggered_AFTER , &$postTriggered_AFTER ) {
91                /** @var Doku_Event $event */
92                $hookTriggered_AFTER  = true;
93                $dataTriggered_AFTER  = $data;
94                $eventDataTriggered_AFTER  = $event->data;
95                $postTriggered_AFTER  = $GLOBALS['INPUT']->post->str('q');
96                $event->preventDefault();
97                $event->stopPropagation();
98                echo "captured event AFTER";
99            }, 'some passed data AFTER'
100        );
101
102
103        $response = $request->post(['call'=> $call, 'q' => 'some-post-param'], '/lib/exe/ajax.php');
104
105        // BEFORE
106        $this->assertEquals(true, $hookTriggered, 'Testing plugin did not trigger!');
107        $this->assertEquals('some passed data', $dataTriggered);
108        $this->assertEquals($call, $eventDataTriggered, 'Must pass call name as event data');
109        $this->assertEquals('some-post-param', $postTriggered);
110
111        // AFTER
112        $this->assertEquals(true, $hookTriggered_AFTER, 'Testing plugin did not trigger!');
113        $this->assertEquals('some passed data AFTER', $dataTriggered_AFTER);
114        $this->assertEquals($call, $eventDataTriggered_AFTER, 'Must pass call name as event data');
115        $this->assertEquals('some-post-param', $postTriggered_AFTER);
116
117        //output
118        $this->assertEquals("captured event BEFORE\ncaptured event AFTER", $response->getContent());
119
120    }
121}