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