1*814e20b8SYurii K<?php 2*814e20b8SYurii K 3*814e20b8SYurii K/** 4*814e20b8SYurii K * @group ajax 5*814e20b8SYurii K */ 6*814e20b8SYurii Kclass ajax_requests_test extends DokuWikiTest { 7*814e20b8SYurii K 8*814e20b8SYurii K public function defaultCalls() { 9*814e20b8SYurii K return [ 10*814e20b8SYurii K // TODO: better logic and DOM walks 11*814e20b8SYurii K // Call | POST | regexp pattern to match 12*814e20b8SYurii K [ 'linkwiz', ['q' => ''], '/^<div class="odd type_d/' ], 13*814e20b8SYurii K [ 'suggestions', ['q' => ''], null ], 14*814e20b8SYurii K [ 'lock', ['id' => ''], null ], 15*814e20b8SYurii K [ 'draftdel', ['id' => ''], null ], 16*814e20b8SYurii K [ 'medians', ['ns' => 'some:ns'], null ], 17*814e20b8SYurii K [ 'medialist', ['ns' => '', 'recent' => '', 'do' => ''], null ], 18*814e20b8SYurii K [ 'mediadetails', ['image' => ''], null ], 19*814e20b8SYurii K [ 'mediadiff', ['image' => ''], null ], 20*814e20b8SYurii K [ 'mediaupload', ['mediaid' => '', 'qqfile' => '' ], null ], // $_FILES 21*814e20b8SYurii K [ 'index', ['idx' => ''], null ], 22*814e20b8SYurii K [ 'linkwiz', ['q' => ''], null ], 23*814e20b8SYurii K ]; 24*814e20b8SYurii K } 25*814e20b8SYurii K 26*814e20b8SYurii K 27*814e20b8SYurii K /** 28*814e20b8SYurii K * @dataProvider defaultCalls 29*814e20b8SYurii K */ 30*814e20b8SYurii K public function test_defaultCallsExist($call, $post, $regexp) { 31*814e20b8SYurii K 32*814e20b8SYurii K $request = new TestRequest(); 33*814e20b8SYurii K $response = $request->post(['call'=> $call]+$post, '/lib/exe/ajax.php'); 34*814e20b8SYurii K $this->assertNotEquals("AJAX call '$call' unknown!\n", $response->getContent()); 35*814e20b8SYurii K 36*814e20b8SYurii K if (!empty($regexp)) { 37*814e20b8SYurii K $this->assertRegExp($regexp, $response->getContent()); 38*814e20b8SYurii K } 39*814e20b8SYurii K if($call == 'index') { 40*814e20b8SYurii K //echo $response->getContent(); die; 41*814e20b8SYurii K } 42*814e20b8SYurii K $this->assertTrue(function_exists('ajax_'.$call)); 43*814e20b8SYurii K } 44*814e20b8SYurii K 45*814e20b8SYurii K public function test_CallNotProvided() { 46*814e20b8SYurii K $request = new TestRequest(); 47*814e20b8SYurii K $response = $request->post([], '/lib/exe/ajax.php'); 48*814e20b8SYurii K $this->assertEquals('', $response->getContent()); 49*814e20b8SYurii K } 50*814e20b8SYurii K 51*814e20b8SYurii K public function test_UnknownCall() { 52*814e20b8SYurii K $call = 'unknownCALL'; 53*814e20b8SYurii K $request = new TestRequest(); 54*814e20b8SYurii K $response = $request->post(['call'=> $call], '/lib/exe/ajax.php'); 55*814e20b8SYurii K $this->assertEquals("AJAX call '$call' unknown!\n", $response->getContent()); 56*814e20b8SYurii K $this->assertFalse(function_exists('ajax_'.$call)); 57*814e20b8SYurii K } 58*814e20b8SYurii K 59*814e20b8SYurii K 60*814e20b8SYurii K public function test_EventOnUnknownCall() { 61*814e20b8SYurii K global $EVENT_HANDLER; 62*814e20b8SYurii K $call = 'unknownCALL'; 63*814e20b8SYurii K $request = new TestRequest(); 64*814e20b8SYurii K 65*814e20b8SYurii K // referenced data from event hook 66*814e20b8SYurii K $hookTriggered = false; 67*814e20b8SYurii K $eventDataTriggered = ''; 68*814e20b8SYurii K $dataTriggered = ''; 69*814e20b8SYurii K $postTriggered = ''; 70*814e20b8SYurii K 71*814e20b8SYurii K $hookTriggered_AFTER = false; 72*814e20b8SYurii K $eventDataTriggered_AFTER = ''; 73*814e20b8SYurii K $dataTriggered_AFTER = ''; 74*814e20b8SYurii K $postTriggered_AFTER = ''; 75*814e20b8SYurii K 76*814e20b8SYurii K $EVENT_HANDLER->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', null, 77*814e20b8SYurii K function($event, $data) use (&$hookTriggered, &$dataTriggered, &$eventDataTriggered, &$postTriggered) { 78*814e20b8SYurii K /** @var Doku_Event $event */ 79*814e20b8SYurii K $hookTriggered = true; 80*814e20b8SYurii K $dataTriggered = $data; 81*814e20b8SYurii K $eventDataTriggered = $event->data; 82*814e20b8SYurii K $postTriggered = $GLOBALS['INPUT']->post->str('q'); 83*814e20b8SYurii K $event->preventDefault(); 84*814e20b8SYurii K $event->stopPropagation(); 85*814e20b8SYurii K echo "captured event BEFORE\n"; 86*814e20b8SYurii K }, 'some passed data' 87*814e20b8SYurii K ); 88*814e20b8SYurii K 89*814e20b8SYurii K $EVENT_HANDLER->register_hook('AJAX_CALL_UNKNOWN', 'AFTER', null, 90*814e20b8SYurii K function($event, $data) use (&$hookTriggered_AFTER , &$dataTriggered_AFTER , &$eventDataTriggered_AFTER , &$postTriggered_AFTER ) { 91*814e20b8SYurii K /** @var Doku_Event $event */ 92*814e20b8SYurii K $hookTriggered_AFTER = true; 93*814e20b8SYurii K $dataTriggered_AFTER = $data; 94*814e20b8SYurii K $eventDataTriggered_AFTER = $event->data; 95*814e20b8SYurii K $postTriggered_AFTER = $GLOBALS['INPUT']->post->str('q'); 96*814e20b8SYurii K $event->preventDefault(); 97*814e20b8SYurii K $event->stopPropagation(); 98*814e20b8SYurii K echo "captured event AFTER"; 99*814e20b8SYurii K }, 'some passed data AFTER' 100*814e20b8SYurii K ); 101*814e20b8SYurii K 102*814e20b8SYurii K 103*814e20b8SYurii K $response = $request->post(['call'=> $call, 'q' => 'some-post-param'], '/lib/exe/ajax.php'); 104*814e20b8SYurii K 105*814e20b8SYurii K // BEFORE 106*814e20b8SYurii K $this->assertEquals(true, $hookTriggered, 'Testing plugin did not trigger!'); 107*814e20b8SYurii K $this->assertEquals('some passed data', $dataTriggered); 108*814e20b8SYurii K $this->assertEquals($call, $eventDataTriggered, 'Must pass call name as event data'); 109*814e20b8SYurii K $this->assertEquals('some-post-param', $postTriggered); 110*814e20b8SYurii K 111*814e20b8SYurii K // AFTER 112*814e20b8SYurii K $this->assertEquals(true, $hookTriggered_AFTER, 'Testing plugin did not trigger!'); 113*814e20b8SYurii K $this->assertEquals('some passed data AFTER', $dataTriggered_AFTER); 114*814e20b8SYurii K $this->assertEquals($call, $eventDataTriggered_AFTER, 'Must pass call name as event data'); 115*814e20b8SYurii K $this->assertEquals('some-post-param', $postTriggered_AFTER); 116*814e20b8SYurii K 117*814e20b8SYurii K //output 118*814e20b8SYurii K $this->assertEquals("captured event BEFORE\ncaptured event AFTER", $response->getContent()); 119*814e20b8SYurii K 120*814e20b8SYurii K } 121*814e20b8SYurii K}