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}