xref: /dokuwiki/_test/tests/lib/exe/ajax_requests.test.php (revision 9ad2b9131dcbe90c5d256acd8f9f347b14d958fb)
1814e20b8SYurii K<?php
2814e20b8SYurii K
3814e20b8SYurii K/**
4814e20b8SYurii K * @group ajax
5814e20b8SYurii K */
6814e20b8SYurii Kclass ajax_requests_test extends DokuWikiTest {
7814e20b8SYurii K
87eed8b73SAndreas Gohr    /**
97eed8b73SAndreas Gohr     * DataProvider for the builtin Ajax calls
107eed8b73SAndreas Gohr     *
117eed8b73SAndreas Gohr     * @return array
127eed8b73SAndreas Gohr     */
13814e20b8SYurii K    public function defaultCalls() {
14814e20b8SYurii K        return [
15814e20b8SYurii K            // TODO: better logic and DOM walks
16814e20b8SYurii K            // Call           | POST     |   regexp pattern to match
17814e20b8SYurii K            [ 'linkwiz',      ['q' => ''], '/^<div class="odd type_d/' ],
18814e20b8SYurii K            [ 'suggestions',  ['q' => ''], null ],
19814e20b8SYurii K            [ 'lock',         ['id' => ''], null ],
20814e20b8SYurii K            [ 'draftdel',     ['id' => ''], null ],
21814e20b8SYurii K            [ 'medians',      ['ns' => 'some:ns'], null ],
22814e20b8SYurii K            [ 'medialist',    ['ns' => '', 'recent' => '', 'do' => ''], null ],
23814e20b8SYurii K            [ 'mediadetails', ['image' => ''], null ],
24814e20b8SYurii K            [ 'mediadiff',    ['image' => ''], null ],
25814e20b8SYurii K            [ 'mediaupload',  ['mediaid' => '', 'qqfile' => '' ], null ], // $_FILES
26814e20b8SYurii K            [ 'index',        ['idx' => ''], null ],
27814e20b8SYurii K            [ 'linkwiz',      ['q' => ''], null ],
28814e20b8SYurii K        ];
29814e20b8SYurii K    }
30814e20b8SYurii K
31814e20b8SYurii K    /**
32814e20b8SYurii K     * @dataProvider defaultCalls
337eed8b73SAndreas Gohr     * @param string $call
347eed8b73SAndreas Gohr     * @param array $post
357eed8b73SAndreas Gohr     * @param string $regexp
36814e20b8SYurii K     */
37814e20b8SYurii K    public function test_defaultCallsExist($call, $post, $regexp) {
38814e20b8SYurii K
39814e20b8SYurii K        $request = new TestRequest();
40814e20b8SYurii K        $response = $request->post(['call'=> $call]+$post, '/lib/exe/ajax.php');
41814e20b8SYurii K        $this->assertNotEquals("AJAX call '$call' unknown!\n", $response->getContent());
42814e20b8SYurii K
43814e20b8SYurii K        if (!empty($regexp)) {
44*9ad2b913SAndreas Gohr            $this->assertMatchesRegularExpression($regexp, $response->getContent());
45814e20b8SYurii K        }
46814e20b8SYurii K    }
47814e20b8SYurii K
48814e20b8SYurii K    public function test_CallNotProvided() {
49814e20b8SYurii K        $request = new TestRequest();
50814e20b8SYurii K        $response = $request->post([], '/lib/exe/ajax.php');
51814e20b8SYurii K        $this->assertEquals('', $response->getContent());
52814e20b8SYurii K    }
53814e20b8SYurii K
54814e20b8SYurii K    public function test_UnknownCall() {
55814e20b8SYurii K        $call = 'unknownCALL';
56814e20b8SYurii K        $request = new TestRequest();
57814e20b8SYurii K        $response = $request->post(['call'=> $call], '/lib/exe/ajax.php');
58814e20b8SYurii K        $this->assertEquals("AJAX call '$call' unknown!\n", $response->getContent());
59814e20b8SYurii K    }
60814e20b8SYurii K
61814e20b8SYurii K
62814e20b8SYurii K    public function test_EventOnUnknownCall() {
63814e20b8SYurii K        global $EVENT_HANDLER;
64814e20b8SYurii K        $call = 'unknownCALL';
65814e20b8SYurii K        $request = new TestRequest();
66814e20b8SYurii K
67814e20b8SYurii K        // referenced data from event hook
68814e20b8SYurii K        $hookTriggered = false;
69814e20b8SYurii K        $eventDataTriggered = '';
70814e20b8SYurii K        $dataTriggered = '';
71814e20b8SYurii K        $postTriggered = '';
72814e20b8SYurii K
73814e20b8SYurii K        $hookTriggered_AFTER = false;
74814e20b8SYurii K        $eventDataTriggered_AFTER  = '';
75814e20b8SYurii K        $dataTriggered_AFTER  = '';
76814e20b8SYurii K        $postTriggered_AFTER  = '';
77814e20b8SYurii K
78814e20b8SYurii K        $EVENT_HANDLER->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', null,
79814e20b8SYurii K            function($event, $data) use (&$hookTriggered, &$dataTriggered, &$eventDataTriggered, &$postTriggered) {
80814e20b8SYurii K                /** @var Doku_Event $event */
81814e20b8SYurii K                $hookTriggered = true;
82814e20b8SYurii K                $dataTriggered = $data;
83814e20b8SYurii K                $eventDataTriggered = $event->data;
84814e20b8SYurii K                $postTriggered = $GLOBALS['INPUT']->post->str('q');
85814e20b8SYurii K                $event->preventDefault();
86814e20b8SYurii K                $event->stopPropagation();
87814e20b8SYurii K                echo "captured event BEFORE\n";
88814e20b8SYurii K            }, 'some passed data'
89814e20b8SYurii K        );
90814e20b8SYurii K
91814e20b8SYurii K        $EVENT_HANDLER->register_hook('AJAX_CALL_UNKNOWN', 'AFTER', null,
92814e20b8SYurii K            function($event, $data) use (&$hookTriggered_AFTER , &$dataTriggered_AFTER , &$eventDataTriggered_AFTER , &$postTriggered_AFTER ) {
93814e20b8SYurii K                /** @var Doku_Event $event */
94814e20b8SYurii K                $hookTriggered_AFTER  = true;
95814e20b8SYurii K                $dataTriggered_AFTER  = $data;
96814e20b8SYurii K                $eventDataTriggered_AFTER  = $event->data;
97814e20b8SYurii K                $postTriggered_AFTER  = $GLOBALS['INPUT']->post->str('q');
98814e20b8SYurii K                $event->preventDefault();
99814e20b8SYurii K                $event->stopPropagation();
100814e20b8SYurii K                echo "captured event AFTER";
101814e20b8SYurii K            }, 'some passed data AFTER'
102814e20b8SYurii K        );
103814e20b8SYurii K
104814e20b8SYurii K
105814e20b8SYurii K        $response = $request->post(['call'=> $call, 'q' => 'some-post-param'], '/lib/exe/ajax.php');
106814e20b8SYurii K
107814e20b8SYurii K        // BEFORE
108814e20b8SYurii K        $this->assertEquals(true, $hookTriggered, 'Testing plugin did not trigger!');
109814e20b8SYurii K        $this->assertEquals('some passed data', $dataTriggered);
110814e20b8SYurii K        $this->assertEquals($call, $eventDataTriggered, 'Must pass call name as event data');
111814e20b8SYurii K        $this->assertEquals('some-post-param', $postTriggered);
112814e20b8SYurii K
113814e20b8SYurii K        // AFTER
114814e20b8SYurii K        $this->assertEquals(true, $hookTriggered_AFTER, 'Testing plugin did not trigger!');
115814e20b8SYurii K        $this->assertEquals('some passed data AFTER', $dataTriggered_AFTER);
116814e20b8SYurii K        $this->assertEquals($call, $eventDataTriggered_AFTER, 'Must pass call name as event data');
117814e20b8SYurii K        $this->assertEquals('some-post-param', $postTriggered_AFTER);
118814e20b8SYurii K
119814e20b8SYurii K        //output
120814e20b8SYurii K        $this->assertEquals("captured event BEFORE\ncaptured event AFTER", $response->getContent());
121814e20b8SYurii K
122814e20b8SYurii K    }
123814e20b8SYurii K}
124