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}