153585189SAndreas Gohr<?php 253585189SAndreas Gohr 353585189SAndreas Gohrnamespace dokuwiki\test\Remote; 453585189SAndreas Gohr 5d1f06eb4SAndreas Gohruse dokuwiki\Remote\AccessDeniedException; 653585189SAndreas Gohruse dokuwiki\Remote\Api; 753585189SAndreas Gohruse dokuwiki\Remote\ApiCore; 8d1f06eb4SAndreas Gohruse dokuwiki\Remote\RemoteException; 953585189SAndreas Gohruse dokuwiki\test\mock\AuthPlugin; 1053585189SAndreas Gohr 11d1f06eb4SAndreas Gohr 1253585189SAndreas Gohr/** 1353585189SAndreas Gohr * Class remoteapicore_test 1453585189SAndreas Gohr */ 1553585189SAndreas Gohrclass ApiCoreTest extends \DokuWikiTest 1653585189SAndreas Gohr{ 1753585189SAndreas Gohr 1853585189SAndreas Gohr protected $userinfo; 1953585189SAndreas Gohr protected $oldAuthAcl; 2053585189SAndreas Gohr /** @var Api */ 2153585189SAndreas Gohr protected $remote; 2253585189SAndreas Gohr 2353585189SAndreas Gohr public function setUp(): void 2453585189SAndreas Gohr { 2553585189SAndreas Gohr // we need a clean setup before each single test: 2653585189SAndreas Gohr \DokuWikiTest::setUpBeforeClass(); 2753585189SAndreas Gohr 2853585189SAndreas Gohr parent::setUp(); 2953585189SAndreas Gohr global $conf; 3053585189SAndreas Gohr global $USERINFO; 3153585189SAndreas Gohr global $AUTH_ACL; 3253585189SAndreas Gohr global $auth; 3353585189SAndreas Gohr $this->oldAuthAcl = $AUTH_ACL; 3453585189SAndreas Gohr $this->userinfo = $USERINFO; 3553585189SAndreas Gohr $auth = new AuthPlugin(); 3653585189SAndreas Gohr 3753585189SAndreas Gohr $conf['remote'] = 1; 3853585189SAndreas Gohr $conf['remoteuser'] = '@user'; 3953585189SAndreas Gohr $conf['useacl'] = 0; 4053585189SAndreas Gohr 4153585189SAndreas Gohr $this->remote = new Api(); 4253585189SAndreas Gohr } 4353585189SAndreas Gohr 4453585189SAndreas Gohr public function tearDown(): void 4553585189SAndreas Gohr { 4653585189SAndreas Gohr parent::tearDown(); 4753585189SAndreas Gohr 4853585189SAndreas Gohr global $USERINFO; 4953585189SAndreas Gohr global $AUTH_ACL; 5053585189SAndreas Gohr 5153585189SAndreas Gohr $USERINFO = $this->userinfo; 5253585189SAndreas Gohr $AUTH_ACL = $this->oldAuthAcl; 5353585189SAndreas Gohr } 5453585189SAndreas Gohr 55d1f06eb4SAndreas Gohr /** 56d1f06eb4SAndreas Gohr * Do an assertion that converts to JSON inbetween 57d1f06eb4SAndreas Gohr * 58d1f06eb4SAndreas Gohr * This lets us compare result objects with arrays 59d1f06eb4SAndreas Gohr */ 60d1f06eb4SAndreas Gohr protected function assertEqualResult($expected, $actual, $msg = '') 6153585189SAndreas Gohr { 62d1f06eb4SAndreas Gohr // sort object arrays 63d1f06eb4SAndreas Gohr if (is_array($actual) && array_key_exists(0, $actual) && is_object($actual[0])) { 64d1f06eb4SAndreas Gohr sort($actual); 65d1f06eb4SAndreas Gohr sort($expected); 6653585189SAndreas Gohr } 6753585189SAndreas Gohr 68d1f06eb4SAndreas Gohr $expected = json_decode(json_encode($expected), true); 69d1f06eb4SAndreas Gohr $actual = json_decode(json_encode($actual), true); 70d1f06eb4SAndreas Gohr $this->assertEquals($expected, $actual, $msg); 7153585189SAndreas Gohr } 7253585189SAndreas Gohr 73d1f06eb4SAndreas Gohr // region info 74d1f06eb4SAndreas Gohr 75d1f06eb4SAndreas Gohr // core.getAPIVersion 76d1f06eb4SAndreas Gohr public function testGetAPIVersion() 7753585189SAndreas Gohr { 78d1f06eb4SAndreas Gohr $this->assertEqualResult( 79d1f06eb4SAndreas Gohr ApiCore::API_VERSION, 80d1f06eb4SAndreas Gohr $this->remote->call('core.getAPIVersion') 81d1f06eb4SAndreas Gohr ); 82d1f06eb4SAndreas Gohr } 83d1f06eb4SAndreas Gohr 84d1f06eb4SAndreas Gohr // core.getWikiVersion 85d1f06eb4SAndreas Gohr public function testGetWikiVersion() 86d1f06eb4SAndreas Gohr { 87d1f06eb4SAndreas Gohr $this->assertEqualResult( 88d1f06eb4SAndreas Gohr getVersion(), 89d1f06eb4SAndreas Gohr $this->remote->call('core.getWikiVersion') 90d1f06eb4SAndreas Gohr ); 91d1f06eb4SAndreas Gohr } 92d1f06eb4SAndreas Gohr 93d1f06eb4SAndreas Gohr // core.getWikiTitle 94d1f06eb4SAndreas Gohr public function testGetWikiTitle() 95d1f06eb4SAndreas Gohr { 96d1f06eb4SAndreas Gohr global $conf; 97d1f06eb4SAndreas Gohr $this->assertEqualResult( 98d1f06eb4SAndreas Gohr $conf['title'], 99d1f06eb4SAndreas Gohr $this->remote->call('core.getWikiTitle') 100d1f06eb4SAndreas Gohr ); 101d1f06eb4SAndreas Gohr } 102d1f06eb4SAndreas Gohr 103d1f06eb4SAndreas Gohr // core.getWikiTime 104d1f06eb4SAndreas Gohr public function testGetWikiTime() 105d1f06eb4SAndreas Gohr { 106d1f06eb4SAndreas Gohr $this->assertEqualsWithDelta( 107d1f06eb4SAndreas Gohr time(), 108d1f06eb4SAndreas Gohr $this->remote->call('core.getWikiTime'), 109d1f06eb4SAndreas Gohr 1 // allow 1 second difference 110d1f06eb4SAndreas Gohr ); 111d1f06eb4SAndreas Gohr } 112d1f06eb4SAndreas Gohr 113d1f06eb4SAndreas Gohr // endregion 114d1f06eb4SAndreas Gohr 115d1f06eb4SAndreas Gohr // region user 116d1f06eb4SAndreas Gohr 117d1f06eb4SAndreas Gohr // core.login 118d1f06eb4SAndreas Gohr public function testLogin() 119d1f06eb4SAndreas Gohr { 120d1f06eb4SAndreas Gohr $this->markTestIncomplete('Missing test for core.login API Call'); 121d1f06eb4SAndreas Gohr } 122d1f06eb4SAndreas Gohr 123d1f06eb4SAndreas Gohr // core.logoff 124d1f06eb4SAndreas Gohr public function testLogoff() 125d1f06eb4SAndreas Gohr { 126d1f06eb4SAndreas Gohr $this->markTestIncomplete('Missing test for core.logoff API Call'); 127d1f06eb4SAndreas Gohr } 128d1f06eb4SAndreas Gohr 129d1f06eb4SAndreas Gohr // core.whoAmI 130d1f06eb4SAndreas Gohr public function testWhoAmI() 131d1f06eb4SAndreas Gohr { 132d1f06eb4SAndreas Gohr $this->markTestIncomplete('Missing test for core.whoAmI API Call'); 133d1f06eb4SAndreas Gohr } 134d1f06eb4SAndreas Gohr 135d1f06eb4SAndreas Gohr // core.aclCheck -> See also ApiCoreAclCheckTest.php 136d1f06eb4SAndreas Gohr public function testAclCheck() 137d1f06eb4SAndreas Gohr { 138d1f06eb4SAndreas Gohr $id = 'aclpage'; 139d1f06eb4SAndreas Gohr 140d1f06eb4SAndreas Gohr $this->assertEquals(AUTH_UPLOAD, $this->remote->call('core.aclCheck', ['page' => $id])); 141d1f06eb4SAndreas Gohr 142d1f06eb4SAndreas Gohr global $conf; 143d1f06eb4SAndreas Gohr global $AUTH_ACL; 144d1f06eb4SAndreas Gohr global $USERINFO; 145d1f06eb4SAndreas Gohr $conf['useacl'] = 1; 146d1f06eb4SAndreas Gohr $_SERVER['REMOTE_USER'] = 'john'; 147d1f06eb4SAndreas Gohr $USERINFO['grps'] = ['user']; 148d1f06eb4SAndreas Gohr $AUTH_ACL = [ 149d1f06eb4SAndreas Gohr '* @ALL 0', 150d1f06eb4SAndreas Gohr '* @user 2', //edit 151d1f06eb4SAndreas Gohr ]; 152d1f06eb4SAndreas Gohr 153d1f06eb4SAndreas Gohr $this->assertEquals(AUTH_EDIT, $this->remote->call('core.aclCheck', ['page' => $id])); 154d1f06eb4SAndreas Gohr } 155d1f06eb4SAndreas Gohr 156d1f06eb4SAndreas Gohr 157d1f06eb4SAndreas Gohr // endregion 158d1f06eb4SAndreas Gohr 159d1f06eb4SAndreas Gohr // region pages 160d1f06eb4SAndreas Gohr 161d1f06eb4SAndreas Gohr // core.listPages 162d1f06eb4SAndreas Gohr public function testlistPagesAll() 163d1f06eb4SAndreas Gohr { 164d1f06eb4SAndreas Gohr // all pages depends on index 165d1f06eb4SAndreas Gohr idx_addPage('wiki:syntax'); 166d1f06eb4SAndreas Gohr idx_addPage('wiki:dokuwiki'); 167d1f06eb4SAndreas Gohr 168d1f06eb4SAndreas Gohr $file1 = wikiFN('wiki:syntax'); 169d1f06eb4SAndreas Gohr $file2 = wikiFN('wiki:dokuwiki'); 170d1f06eb4SAndreas Gohr 17153585189SAndreas Gohr $expected = [ 17253585189SAndreas Gohr [ 173d1f06eb4SAndreas Gohr 'id' => 'wiki:syntax', 174d1f06eb4SAndreas Gohr 'title' => 'wiki:syntax', 175d1f06eb4SAndreas Gohr 'permission' => 8, 17653585189SAndreas Gohr 'size' => filesize($file1), 177d1f06eb4SAndreas Gohr 'revision' => filemtime($file1), 1786535a28fSEduardo Mozart de Oliveira 'hash' => md5(trim(io_readFile($file1))), 179d1f06eb4SAndreas Gohr 'author' => '', 18053585189SAndreas Gohr ], 18153585189SAndreas Gohr [ 182d1f06eb4SAndreas Gohr 'id' => 'wiki:dokuwiki', 183d1f06eb4SAndreas Gohr 'title' => 'wiki:dokuwiki', 184d1f06eb4SAndreas Gohr 'permission' => 8, 18553585189SAndreas Gohr 'size' => filesize($file2), 186d1f06eb4SAndreas Gohr 'revision' => filemtime($file2), 1876535a28fSEduardo Mozart de Oliveira 'hash' => md5(trim(io_readFile($file2))), 188d1f06eb4SAndreas Gohr 'author' => '', 18953585189SAndreas Gohr ] 19053585189SAndreas Gohr ]; 191d1f06eb4SAndreas Gohr $this->assertEqualResult( 192d1f06eb4SAndreas Gohr $expected, 193d1f06eb4SAndreas Gohr $this->remote->call( 194d1f06eb4SAndreas Gohr 'core.listPages', 19553585189SAndreas Gohr [ 196d1f06eb4SAndreas Gohr 'namespace' => '', 19753585189SAndreas Gohr 'depth' => 0, // 0 for all 198d1f06eb4SAndreas Gohr 'hash' => true 19953585189SAndreas Gohr ] 200d1f06eb4SAndreas Gohr ) 201d1f06eb4SAndreas Gohr ); 20253585189SAndreas Gohr } 20353585189SAndreas Gohr 204d1f06eb4SAndreas Gohr // core.listPages 205d1f06eb4SAndreas Gohr public function testListPagesNamespace() 206d1f06eb4SAndreas Gohr { 207d1f06eb4SAndreas Gohr $file1 = wikiFN('wiki:syntax'); 208d1f06eb4SAndreas Gohr $file2 = wikiFN('wiki:dokuwiki'); 209d1f06eb4SAndreas Gohr // no indexing needed here 210d1f06eb4SAndreas Gohr 211d1f06eb4SAndreas Gohr global $conf; 212d1f06eb4SAndreas Gohr $conf['useheading'] = 1; 213d1f06eb4SAndreas Gohr 214d1f06eb4SAndreas Gohr $expected = [ 215d1f06eb4SAndreas Gohr [ 216d1f06eb4SAndreas Gohr 'id' => 'wiki:syntax', 217d1f06eb4SAndreas Gohr 'title' => 'Formatting Syntax', 218d1f06eb4SAndreas Gohr 'permission' => 8, 219d1f06eb4SAndreas Gohr 'size' => filesize($file1), 220d1f06eb4SAndreas Gohr 'revision' => filemtime($file1), 221d1f06eb4SAndreas Gohr 'hash' => '', 222d1f06eb4SAndreas Gohr 'author' => '', 223d1f06eb4SAndreas Gohr ], 224d1f06eb4SAndreas Gohr [ 225d1f06eb4SAndreas Gohr 'id' => 'wiki:dokuwiki', 226d1f06eb4SAndreas Gohr 'title' => 'DokuWiki', 227d1f06eb4SAndreas Gohr 'permission' => 8, 228d1f06eb4SAndreas Gohr 'size' => filesize($file2), 229d1f06eb4SAndreas Gohr 'revision' => filemtime($file2), 230d1f06eb4SAndreas Gohr 'hash' => '', 231d1f06eb4SAndreas Gohr 'author' => '', 232d1f06eb4SAndreas Gohr ], 233d1f06eb4SAndreas Gohr ]; 234d1f06eb4SAndreas Gohr 235d1f06eb4SAndreas Gohr $this->assertEqualResult( 236d1f06eb4SAndreas Gohr $expected, 237d1f06eb4SAndreas Gohr $this->remote->call( 238d1f06eb4SAndreas Gohr 'core.listPages', 239d1f06eb4SAndreas Gohr [ 240d1f06eb4SAndreas Gohr 'namespace' => 'wiki:', 241d1f06eb4SAndreas Gohr 'depth' => 1, 242d1f06eb4SAndreas Gohr ] 243d1f06eb4SAndreas Gohr ) 244d1f06eb4SAndreas Gohr ); 245d1f06eb4SAndreas Gohr } 246d1f06eb4SAndreas Gohr 247d1f06eb4SAndreas Gohr // core.searchPages 248d1f06eb4SAndreas Gohr public function testSearchPages() 24953585189SAndreas Gohr { 25053585189SAndreas Gohr $id = 'wiki:syntax'; 25153585189SAndreas Gohr $file = wikiFN($id); 25253585189SAndreas Gohr 25353585189SAndreas Gohr idx_addPage($id); //full text search depends on index 25453585189SAndreas Gohr $expected = [ 25553585189SAndreas Gohr [ 25653585189SAndreas Gohr 'id' => $id, 25753585189SAndreas Gohr 'score' => 1, 258d1f06eb4SAndreas Gohr 'revision' => filemtime($file), 259d1f06eb4SAndreas Gohr 'permission' => 8, 26053585189SAndreas Gohr 'size' => filesize($file), 26153585189SAndreas Gohr 'snippet' => ' a footnote)) by using double parentheses. 26253585189SAndreas Gohr 26353585189SAndreas Gohr===== <strong class="search_hit">Sectioning</strong> ===== 26453585189SAndreas Gohr 26553585189SAndreas GohrYou can use up to five different levels of', 266d1f06eb4SAndreas Gohr 'title' => 'wiki:syntax', 267d1f06eb4SAndreas Gohr 'author' => '', 268d1f06eb4SAndreas Gohr 'hash' => '', 26953585189SAndreas Gohr ] 27053585189SAndreas Gohr ]; 27153585189SAndreas Gohr 272d1f06eb4SAndreas Gohr $this->assertEqualResult( 273d1f06eb4SAndreas Gohr $expected, 274d1f06eb4SAndreas Gohr $this->remote->call( 275d1f06eb4SAndreas Gohr 'core.searchPages', 27653585189SAndreas Gohr [ 277d1f06eb4SAndreas Gohr 'query' => 'Sectioning' 27853585189SAndreas Gohr ] 279d1f06eb4SAndreas Gohr ) 280d1f06eb4SAndreas Gohr ); 281d1f06eb4SAndreas Gohr } 282d1f06eb4SAndreas Gohr 283d1f06eb4SAndreas Gohr //core.getRecentPageChanges 284d1f06eb4SAndreas Gohr public function testGetRecentPageChanges() 285d1f06eb4SAndreas Gohr { 286d1f06eb4SAndreas Gohr $_SERVER['REMOTE_USER'] = 'testuser'; 287d1f06eb4SAndreas Gohr 288d1f06eb4SAndreas Gohr saveWikiText('pageone', 'test', 'test one'); 289d1f06eb4SAndreas Gohr $rev1 = filemtime(wikiFN('pageone')); 290d1f06eb4SAndreas Gohr saveWikiText('pagetwo', 'test', 'test two'); 291d1f06eb4SAndreas Gohr $rev2 = filemtime(wikiFN('pagetwo')); 29253585189SAndreas Gohr 29353585189SAndreas Gohr $expected = [ 29453585189SAndreas Gohr [ 295d1f06eb4SAndreas Gohr 'id' => 'pageone', 296d1f06eb4SAndreas Gohr 'revision' => $rev1, 297d1f06eb4SAndreas Gohr 'author' => 'testuser', 298d1f06eb4SAndreas Gohr 'sizechange' => 4, 299d1f06eb4SAndreas Gohr 'summary' => 'test one', 300d1f06eb4SAndreas Gohr 'type' => 'C', 301d1f06eb4SAndreas Gohr 'ip' => clientIP(), 302d1f06eb4SAndreas Gohr ], 303d1f06eb4SAndreas Gohr [ 304d1f06eb4SAndreas Gohr 'id' => 'pagetwo', 305d1f06eb4SAndreas Gohr 'revision' => $rev2, 306d1f06eb4SAndreas Gohr 'author' => 'testuser', 307d1f06eb4SAndreas Gohr 'sizechange' => 4, 308d1f06eb4SAndreas Gohr 'summary' => 'test two', 309d1f06eb4SAndreas Gohr 'type' => 'C', 310d1f06eb4SAndreas Gohr 'ip' => clientIP(), 31153585189SAndreas Gohr ] 31253585189SAndreas Gohr ]; 31353585189SAndreas Gohr 314d1f06eb4SAndreas Gohr $this->assertEqualResult( 315d1f06eb4SAndreas Gohr $expected, 316d1f06eb4SAndreas Gohr $this->remote->call( 317d1f06eb4SAndreas Gohr 'core.getRecentPageChanges', 31853585189SAndreas Gohr [ 319d1f06eb4SAndreas Gohr 'timestamp' => 0 // all recent changes 32053585189SAndreas Gohr ] 321d1f06eb4SAndreas Gohr ) 322d1f06eb4SAndreas Gohr ); 32353585189SAndreas Gohr } 32453585189SAndreas Gohr 325d1f06eb4SAndreas Gohr // core.getPage 32653585189SAndreas Gohr public function testGetPage() 32753585189SAndreas Gohr { 32853585189SAndreas Gohr $id = 'pageversion'; 32953585189SAndreas Gohr $file = wikiFN($id); 33053585189SAndreas Gohr 33153585189SAndreas Gohr saveWikiText($id, 'first version', 'first'); 33253585189SAndreas Gohr $rev1 = filemtime($file); 33353585189SAndreas Gohr clearstatcache(false, $file); 33453585189SAndreas Gohr $this->waitForTick(true); 33553585189SAndreas Gohr saveWikiText($id, 'second version', 'second'); 33653585189SAndreas Gohr $rev2 = filemtime($file); 33753585189SAndreas Gohr 338d1f06eb4SAndreas Gohr $this->assertEqualResult( 339d1f06eb4SAndreas Gohr 'second version', 340d1f06eb4SAndreas Gohr $this->remote->call('core.getPage', ['page' => $id, 'rev' => 0]), 341d1f06eb4SAndreas Gohr 'no revision given -> current' 342d1f06eb4SAndreas Gohr ); 34353585189SAndreas Gohr 344d1f06eb4SAndreas Gohr $this->assertEqualResult( 345d1f06eb4SAndreas Gohr 'first version', 346d1f06eb4SAndreas Gohr $this->remote->call('core.getPage', ['page' => $id, 'rev' => $rev1]), 347d1f06eb4SAndreas Gohr '1st revision given' 348d1f06eb4SAndreas Gohr ); 34953585189SAndreas Gohr 350d1f06eb4SAndreas Gohr $this->assertEqualResult( 351d1f06eb4SAndreas Gohr 'second version', 352d1f06eb4SAndreas Gohr $this->remote->call('core.getPage', ['page' => $id, 'rev' => $rev2]), 353d1f06eb4SAndreas Gohr '2nd revision given' 354d1f06eb4SAndreas Gohr ); 35553585189SAndreas Gohr 356d1f06eb4SAndreas Gohr $this->assertEqualResult( 357d1f06eb4SAndreas Gohr '', 358d1f06eb4SAndreas Gohr $this->remote->call('core.getPage', ['page' => $id, 'rev' => 1234]), 359d1f06eb4SAndreas Gohr 'Non existing revision given' 360d1f06eb4SAndreas Gohr ); 36153585189SAndreas Gohr 362d1f06eb4SAndreas Gohr $this->assertEqualResult( 363d1f06eb4SAndreas Gohr '', 364d1f06eb4SAndreas Gohr $this->remote->call('core.getPage', ['page' => 'foobar', 'rev' => 1234]), 365d1f06eb4SAndreas Gohr 'Non existing page given' 366d1f06eb4SAndreas Gohr ); 36753585189SAndreas Gohr } 36853585189SAndreas Gohr 369d1f06eb4SAndreas Gohr //core.getPageHTML 37053585189SAndreas Gohr public function testGetPageHTMLVersion() 37153585189SAndreas Gohr { 37253585189SAndreas Gohr $id = 'htmltest'; 37353585189SAndreas Gohr $file = wikiFN($id); 37453585189SAndreas Gohr 37553585189SAndreas Gohr $content1 = "====Title====\nText"; 37653585189SAndreas Gohr $html1 = "\n<h3 class=\"sectionedit1\" id=\"title\">Title</h3>\n<div class=\"level3\">\n\n<p>\nText\n</p>\n\n</div>\n"; 37753585189SAndreas Gohr $content2 = "====Foobar====\nText Bamm"; 37853585189SAndreas Gohr $html2 = "\n<h3 class=\"sectionedit1\" id=\"foobar\">Foobar</h3>\n<div class=\"level3\">\n\n<p>\nText Bamm\n</p>\n\n</div>\n"; 37953585189SAndreas Gohr 38053585189SAndreas Gohr saveWikiText($id, $content1, 'first'); 38153585189SAndreas Gohr $rev1 = filemtime($file); 38253585189SAndreas Gohr clearstatcache(false, $file); 38353585189SAndreas Gohr $this->waitForTick(true); 38453585189SAndreas Gohr saveWikiText($id, $content2, 'second'); 38553585189SAndreas Gohr $rev2 = filemtime($file); 38653585189SAndreas Gohr 387d1f06eb4SAndreas Gohr $this->assertEqualResult( 388d1f06eb4SAndreas Gohr $html2, 389d1f06eb4SAndreas Gohr $this->remote->call('core.getPageHTML', ['page' => $id, 'rev' => 0]), 390d1f06eb4SAndreas Gohr 'no revision given -> current' 391d1f06eb4SAndreas Gohr ); 39253585189SAndreas Gohr 393d1f06eb4SAndreas Gohr $this->assertEqualResult( 394d1f06eb4SAndreas Gohr $html1, 395d1f06eb4SAndreas Gohr $this->remote->call('core.getPageHTML', ['page' => $id, 'rev' => $rev1]), 396d1f06eb4SAndreas Gohr '1st revision given' 397d1f06eb4SAndreas Gohr ); 39853585189SAndreas Gohr 399d1f06eb4SAndreas Gohr $this->assertEqualResult( 400d1f06eb4SAndreas Gohr $html2, 401d1f06eb4SAndreas Gohr $this->remote->call('core.getPageHTML', ['page' => $id, 'rev' => $rev2]), 402d1f06eb4SAndreas Gohr '2nd revision given' 403d1f06eb4SAndreas Gohr ); 40453585189SAndreas Gohr 405d1f06eb4SAndreas Gohr $e = null; 406d1f06eb4SAndreas Gohr try { 407d1f06eb4SAndreas Gohr $this->remote->call('core.getPageHTML', ['page' => $id, 'rev' => 1234]); 408d1f06eb4SAndreas Gohr } catch (RemoteException $e) { 409d1f06eb4SAndreas Gohr } 410d1f06eb4SAndreas Gohr $this->assertInstanceOf(RemoteException::class, $e); 411d1f06eb4SAndreas Gohr $this->assertEquals(121, $e->getCode(), 'Non existing revision given'); 41253585189SAndreas Gohr 413d1f06eb4SAndreas Gohr $e = null; 414d1f06eb4SAndreas Gohr try { 415d1f06eb4SAndreas Gohr $this->remote->call('core.getPageHTML', ['page' => 'foobar', 'rev' => 1234]); 416d1f06eb4SAndreas Gohr } catch (RemoteException $e) { 417d1f06eb4SAndreas Gohr } 418d1f06eb4SAndreas Gohr $this->assertInstanceOf(RemoteException::class, $e); 419d1f06eb4SAndreas Gohr $this->assertEquals(121, $e->getCode(), 'Non existing page given'); 42053585189SAndreas Gohr } 42153585189SAndreas Gohr 422d1f06eb4SAndreas Gohr //core.getPageInfo 42353585189SAndreas Gohr public function testGetPageInfo() 42453585189SAndreas Gohr { 42553585189SAndreas Gohr $id = 'pageinfo'; 42653585189SAndreas Gohr $file = wikiFN($id); 42753585189SAndreas Gohr 428d1f06eb4SAndreas Gohr $_SERVER['REMOTE_USER'] = 'testuser'; 42953585189SAndreas Gohr 43053585189SAndreas Gohr saveWikiText($id, 'first version', 'first'); 43153585189SAndreas Gohr $rev1 = filemtime($file); 43253585189SAndreas Gohr clearstatcache(false, $file); 43353585189SAndreas Gohr $this->waitForTick(true); 43453585189SAndreas Gohr saveWikiText($id, 'second version', 'second'); 43553585189SAndreas Gohr $rev2 = filemtime($file); 43653585189SAndreas Gohr 43753585189SAndreas Gohr $expected = [ 438d1f06eb4SAndreas Gohr 'id' => $id, 439d1f06eb4SAndreas Gohr 'revision' => $rev2, 440d1f06eb4SAndreas Gohr 'author' => 'testuser', 4416535a28fSEduardo Mozart de Oliveira 'hash' => md5(trim(io_readFile($file))), 442d1f06eb4SAndreas Gohr 'title' => $id, 443d1f06eb4SAndreas Gohr 'size' => filesize($file), 444d1f06eb4SAndreas Gohr 'permission' => 8, 44553585189SAndreas Gohr ]; 446d1f06eb4SAndreas Gohr $this->assertEqualResult( 447d1f06eb4SAndreas Gohr $expected, 448d1f06eb4SAndreas Gohr $this->remote->call('core.getPageInfo', ['page' => $id, 'rev' => 0, 'hash' => true, 'author' => true]), 449d1f06eb4SAndreas Gohr 'no revision given -> current' 450d1f06eb4SAndreas Gohr ); 45153585189SAndreas Gohr 45253585189SAndreas Gohr $expected = [ 453d1f06eb4SAndreas Gohr 'id' => $id, 454d1f06eb4SAndreas Gohr 'revision' => $rev1, 455d1f06eb4SAndreas Gohr 'author' => '', 456d1f06eb4SAndreas Gohr 'hash' => '', 457d1f06eb4SAndreas Gohr 'title' => $id, 458d1f06eb4SAndreas Gohr 'size' => filesize(wikiFN($id, $rev1)), 459d1f06eb4SAndreas Gohr 'permission' => 8, 46053585189SAndreas Gohr ]; 461d1f06eb4SAndreas Gohr $this->assertEqualResult( 462d1f06eb4SAndreas Gohr $expected, 463d1f06eb4SAndreas Gohr $this->remote->call('core.getPageInfo', ['page' => $id, 'rev' => $rev1]), 464d1f06eb4SAndreas Gohr '1st revision given' 465d1f06eb4SAndreas Gohr ); 46653585189SAndreas Gohr 46753585189SAndreas Gohr $expected = [ 468d1f06eb4SAndreas Gohr 'id' => $id, 469d1f06eb4SAndreas Gohr 'revision' => $rev2, 470d1f06eb4SAndreas Gohr 'author' => '', 471d1f06eb4SAndreas Gohr 'hash' => '', 472d1f06eb4SAndreas Gohr 'title' => $id, 473d1f06eb4SAndreas Gohr 'size' => filesize(wikiFN($id, $rev2)), 474d1f06eb4SAndreas Gohr 'permission' => 8, 47553585189SAndreas Gohr ]; 476d1f06eb4SAndreas Gohr $this->assertEqualResult( 477d1f06eb4SAndreas Gohr $expected, 478d1f06eb4SAndreas Gohr $this->remote->call('core.getPageInfo', ['page' => $id, 'rev' => $rev2]), 479d1f06eb4SAndreas Gohr '2nd revision given' 480d1f06eb4SAndreas Gohr ); 481d1f06eb4SAndreas Gohr 482d1f06eb4SAndreas Gohr $e = null; 483d1f06eb4SAndreas Gohr try { 484d1f06eb4SAndreas Gohr $this->remote->call('core.getPageInfo', ['page' => $id, 'rev' => 1234]); 485d1f06eb4SAndreas Gohr } catch (RemoteException $e) { 486d1f06eb4SAndreas Gohr } 487d1f06eb4SAndreas Gohr $this->assertInstanceOf(RemoteException::class, $e); 488d1f06eb4SAndreas Gohr $this->assertEquals(121, $e->getCode(), 'Non existing revision given'); 489d1f06eb4SAndreas Gohr 490d1f06eb4SAndreas Gohr $e = null; 491d1f06eb4SAndreas Gohr try { 492d1f06eb4SAndreas Gohr $this->remote->call('core.getPageInfo', ['page' => 'foobar', 'rev' => 1234]); 493d1f06eb4SAndreas Gohr } catch (RemoteException $e) { 494d1f06eb4SAndreas Gohr } 495d1f06eb4SAndreas Gohr $this->assertInstanceOf(RemoteException::class, $e); 496d1f06eb4SAndreas Gohr $this->assertEquals(121, $e->getCode(), 'Non existing page given'); 49753585189SAndreas Gohr } 49853585189SAndreas Gohr 499d1f06eb4SAndreas Gohr //core.getPageHistory 500d1f06eb4SAndreas Gohr public function testGetPageHistory() 50153585189SAndreas Gohr { 50253585189SAndreas Gohr global $conf; 50353585189SAndreas Gohr 50453585189SAndreas Gohr $id = 'revpage'; 50553585189SAndreas Gohr $file = wikiFN($id); 50653585189SAndreas Gohr 50753585189SAndreas Gohr $rev = []; 50853585189SAndreas Gohr for ($i = 0; $i < 6; $i++) { 50953585189SAndreas Gohr $this->waitForTick(); 51053585189SAndreas Gohr saveWikiText($id, "rev$i", "rev$i"); 51153585189SAndreas Gohr clearstatcache(false, $file); 51253585189SAndreas Gohr $rev[$i] = filemtime($file); 51353585189SAndreas Gohr } 51453585189SAndreas Gohr 515d1f06eb4SAndreas Gohr $params = ['page' => $id, 'first' => 0]; 516d1f06eb4SAndreas Gohr $versions = $this->remote->call('core.getPageHistory', $params); 517d1f06eb4SAndreas Gohr $versions = json_decode(json_encode($versions), true); 51853585189SAndreas Gohr $this->assertEquals(6, count($versions)); 519d1f06eb4SAndreas Gohr $this->assertEquals($rev[5], $versions[0]['revision']); 520d1f06eb4SAndreas Gohr $this->assertEquals($rev[4], $versions[1]['revision']); 521d1f06eb4SAndreas Gohr $this->assertEquals($rev[3], $versions[2]['revision']); 522d1f06eb4SAndreas Gohr $this->assertEquals($rev[2], $versions[3]['revision']); 523d1f06eb4SAndreas Gohr $this->assertEquals($rev[1], $versions[4]['revision']); 524d1f06eb4SAndreas Gohr $this->assertEquals($rev[0], $versions[5]['revision']); 52553585189SAndreas Gohr 526d1f06eb4SAndreas Gohr $params = ['page' => $id, 'first' => 1]; // offset 1 527d1f06eb4SAndreas Gohr $versions = $this->remote->call('core.getPageHistory', $params); 528d1f06eb4SAndreas Gohr $versions = json_decode(json_encode($versions), true); 52953585189SAndreas Gohr $this->assertEquals(5, count($versions)); 530d1f06eb4SAndreas Gohr $this->assertEquals($rev[4], $versions[0]['revision']); 531d1f06eb4SAndreas Gohr $this->assertEquals($rev[3], $versions[1]['revision']); 532d1f06eb4SAndreas Gohr $this->assertEquals($rev[2], $versions[2]['revision']); 533d1f06eb4SAndreas Gohr $this->assertEquals($rev[1], $versions[3]['revision']); 534d1f06eb4SAndreas Gohr $this->assertEquals($rev[0], $versions[4]['revision']); 53553585189SAndreas Gohr 53653585189SAndreas Gohr $conf['recent'] = 3; //set number of results per page 53753585189SAndreas Gohr 538d1f06eb4SAndreas Gohr $params = ['page' => $id, 'first' => 0]; // first page 539d1f06eb4SAndreas Gohr $versions = $this->remote->call('core.getPageHistory', $params); 540d1f06eb4SAndreas Gohr $versions = json_decode(json_encode($versions), true); 54153585189SAndreas Gohr $this->assertEquals(3, count($versions)); 542d1f06eb4SAndreas Gohr $this->assertEquals($rev[5], $versions[0]['revision']); 543d1f06eb4SAndreas Gohr $this->assertEquals($rev[4], $versions[1]['revision']); 544d1f06eb4SAndreas Gohr $this->assertEquals($rev[3], $versions[2]['revision']); 54553585189SAndreas Gohr 546d1f06eb4SAndreas Gohr $params = ['page' => $id, 'first' => $conf['recent']]; // second page 547d1f06eb4SAndreas Gohr $versions = $this->remote->call('core.getPageHistory', $params); 548d1f06eb4SAndreas Gohr $versions = json_decode(json_encode($versions), true); 54953585189SAndreas Gohr $this->assertEquals(3, count($versions)); 550d1f06eb4SAndreas Gohr $this->assertEquals($rev[2], $versions[0]['revision']); 551d1f06eb4SAndreas Gohr $this->assertEquals($rev[1], $versions[1]['revision']); 552d1f06eb4SAndreas Gohr $this->assertEquals($rev[0], $versions[2]['revision']); 55353585189SAndreas Gohr 554d1f06eb4SAndreas Gohr $params = ['page' => $id, 'first' => $conf['recent'] * 2]; // third page 555d1f06eb4SAndreas Gohr $versions = $this->remote->call('core.getPageHistory', $params); 556d1f06eb4SAndreas Gohr $versions = json_decode(json_encode($versions), true); 55753585189SAndreas Gohr $this->assertEquals(0, count($versions)); 55853585189SAndreas Gohr } 55953585189SAndreas Gohr 560d1f06eb4SAndreas Gohr //core.getPageLinks 561d1f06eb4SAndreas Gohr public function testGetPageLinks() 56253585189SAndreas Gohr { 56353585189SAndreas Gohr $localdoku = [ 56453585189SAndreas Gohr 'type' => 'local', 56553585189SAndreas Gohr 'page' => 'DokuWiki', 56653585189SAndreas Gohr 'href' => DOKU_BASE . DOKU_SCRIPT . '?id=DokuWiki' 56753585189SAndreas Gohr ]; 568d1f06eb4SAndreas Gohr $expected = [ 56953585189SAndreas Gohr $localdoku, 57053585189SAndreas Gohr [ 57153585189SAndreas Gohr 'type' => 'extern', 57253585189SAndreas Gohr 'page' => 'http://www.freelists.org', 57353585189SAndreas Gohr 'href' => 'http://www.freelists.org' 57453585189SAndreas Gohr ], 57553585189SAndreas Gohr [ 576d1f06eb4SAndreas Gohr 'type' => 'interwiki', 577d1f06eb4SAndreas Gohr 'page' => 'rfc>1855', 57853585189SAndreas Gohr 'href' => 'https://tools.ietf.org/html/rfc1855' 57953585189SAndreas Gohr ], 58053585189SAndreas Gohr [ 58153585189SAndreas Gohr 'type' => 'extern', 58253585189SAndreas Gohr 'page' => 'http://www.catb.org/~esr/faqs/smart-questions.html', 58353585189SAndreas Gohr 'href' => 'http://www.catb.org/~esr/faqs/smart-questions.html' 58453585189SAndreas Gohr ], 58553585189SAndreas Gohr $localdoku, 58653585189SAndreas Gohr $localdoku 58753585189SAndreas Gohr ]; 588d1f06eb4SAndreas Gohr 589d1f06eb4SAndreas Gohr $this->assertEqualResult( 590d1f06eb4SAndreas Gohr $expected, 591d1f06eb4SAndreas Gohr $this->remote->call('core.getPageLinks', ['page' => 'mailinglist']) 592d1f06eb4SAndreas Gohr ); 593d1f06eb4SAndreas Gohr 594d1f06eb4SAndreas Gohr $this->expectExceptionCode(121); 595d1f06eb4SAndreas Gohr $this->remote->call('core.getPageLinks', ['page' => 'foobar']); 59653585189SAndreas Gohr } 59753585189SAndreas Gohr 598d1f06eb4SAndreas Gohr //core.getPageBackLinks 599d1f06eb4SAndreas Gohr public function testGetPageBackLinks() 600d1f06eb4SAndreas Gohr { 601d1f06eb4SAndreas Gohr saveWikiText('linky', '[[wiki:syntax]]', 'test'); 602d1f06eb4SAndreas Gohr // backlinks need index 603d1f06eb4SAndreas Gohr idx_addPage('wiki:syntax'); 604d1f06eb4SAndreas Gohr idx_addPage('linky'); 605d1f06eb4SAndreas Gohr 606d1f06eb4SAndreas Gohr $result = $this->remote->call('core.getPageBackLinks', ['page' => 'wiki:syntax']); 607d1f06eb4SAndreas Gohr $this->assertTrue(count($result) > 0); 608d1f06eb4SAndreas Gohr $this->assertEqualResult(ft_backlinks('wiki:syntax'), $result); 609d1f06eb4SAndreas Gohr 610d1f06eb4SAndreas Gohr $this->assertEquals([], $this->remote->call('core.getPageBackLinks', ['page' => 'foobar'])); 611d1f06eb4SAndreas Gohr } 612d1f06eb4SAndreas Gohr 613d1f06eb4SAndreas Gohr //core.lockPages 614d1f06eb4SAndreas Gohr public function testLockPages() 615d1f06eb4SAndreas Gohr { 616d1f06eb4SAndreas Gohr // lock a first set of pages 617d1f06eb4SAndreas Gohr $_SERVER['REMOTE_USER'] = 'testuser1'; 618d1f06eb4SAndreas Gohr $tolock = ['wiki:dokuwiki', 'nonexisting']; 619d1f06eb4SAndreas Gohr $this->assertEquals( 620d1f06eb4SAndreas Gohr $tolock, 621d1f06eb4SAndreas Gohr $this->remote->call('core.lockPages', ['pages' => $tolock]), 622d1f06eb4SAndreas Gohr 'all pages should lock' 623d1f06eb4SAndreas Gohr ); 624d1f06eb4SAndreas Gohr 625d1f06eb4SAndreas Gohr // now we're someone else 626d1f06eb4SAndreas Gohr $_SERVER['REMOTE_USER'] = 'testuser2'; 627d1f06eb4SAndreas Gohr $tolock = ['wiki:dokuwiki', 'nonexisting', 'wiki:syntax', 'another']; 628d1f06eb4SAndreas Gohr $expected = ['wiki:syntax', 'another']; 629d1f06eb4SAndreas Gohr $this->assertEquals( 630d1f06eb4SAndreas Gohr $expected, 631d1f06eb4SAndreas Gohr $this->remote->call('core.lockPages', ['pages' => $tolock]), 632d1f06eb4SAndreas Gohr 'only half the pages should lock' 633d1f06eb4SAndreas Gohr ); 634d1f06eb4SAndreas Gohr } 635d1f06eb4SAndreas Gohr 636d1f06eb4SAndreas Gohr // core.unlockPages 637d1f06eb4SAndreas Gohr public function testUnlockPages() 638d1f06eb4SAndreas Gohr { 639d1f06eb4SAndreas Gohr $_SERVER['REMOTE_USER'] = 'testuser1'; 640d1f06eb4SAndreas Gohr lock('wiki:dokuwiki'); 641d1f06eb4SAndreas Gohr lock('nonexisting'); 642d1f06eb4SAndreas Gohr 643d1f06eb4SAndreas Gohr $_SERVER['REMOTE_USER'] = 'testuser2'; 644d1f06eb4SAndreas Gohr lock('wiki:syntax'); 645d1f06eb4SAndreas Gohr lock('another'); 646d1f06eb4SAndreas Gohr 647d1f06eb4SAndreas Gohr $tounlock = ['wiki:dokuwiki', 'nonexisting', 'wiki:syntax', 'another', 'notlocked']; 648d1f06eb4SAndreas Gohr $expected = ['wiki:syntax', 'another']; 649d1f06eb4SAndreas Gohr 650d1f06eb4SAndreas Gohr $this->assertEquals( 651d1f06eb4SAndreas Gohr $expected, 652d1f06eb4SAndreas Gohr $this->remote->call('core.unlockPages', ['pages' => $tounlock]) 653d1f06eb4SAndreas Gohr ); 654d1f06eb4SAndreas Gohr } 655d1f06eb4SAndreas Gohr 656d1f06eb4SAndreas Gohr //core.savePage 657d1f06eb4SAndreas Gohr public function testSavePage() 658d1f06eb4SAndreas Gohr { 659d1f06eb4SAndreas Gohr $id = 'putpage'; 660d1f06eb4SAndreas Gohr 661d1f06eb4SAndreas Gohr $content = "====Title====\nText"; 662d1f06eb4SAndreas Gohr $params = [ 663d1f06eb4SAndreas Gohr 'page' => $id, 664d1f06eb4SAndreas Gohr 'text' => $content, 665d1f06eb4SAndreas Gohr 'isminor' => false, 666d1f06eb4SAndreas Gohr 'summary' => 'Summary of nice text' 667d1f06eb4SAndreas Gohr ]; 668d1f06eb4SAndreas Gohr $this->assertTrue($this->remote->call('core.savePage', $params)); 669d1f06eb4SAndreas Gohr $this->assertEquals($content, rawWiki($id)); 670d1f06eb4SAndreas Gohr 671d1f06eb4SAndreas Gohr // remove page 672d1f06eb4SAndreas Gohr $params = [ 673d1f06eb4SAndreas Gohr 'page' => $id, 674d1f06eb4SAndreas Gohr 'text' => '', 675d1f06eb4SAndreas Gohr ]; 676d1f06eb4SAndreas Gohr $this->assertTrue($this->remote->call('core.savePage', $params)); 6779ad2b913SAndreas Gohr $this->assertFileDoesNotExist(wikiFN($id)); 678d1f06eb4SAndreas Gohr 679d1f06eb4SAndreas Gohr // remove non existing page (reusing above params) 680d1f06eb4SAndreas Gohr $e = null; 681d1f06eb4SAndreas Gohr try { 682d1f06eb4SAndreas Gohr $this->remote->call('core.savePage', $params); 683d1f06eb4SAndreas Gohr } catch (RemoteException $e) { 684d1f06eb4SAndreas Gohr } 685d1f06eb4SAndreas Gohr $this->assertInstanceOf(RemoteException::class, $e); 686d1f06eb4SAndreas Gohr $this->assertEquals(132, $e->getCode()); 687d1f06eb4SAndreas Gohr } 688d1f06eb4SAndreas Gohr 689d1f06eb4SAndreas Gohr //core.appendPage 690d1f06eb4SAndreas Gohr public function testAppendPage() 691d1f06eb4SAndreas Gohr { 692d1f06eb4SAndreas Gohr $id = 'appendpage'; 693d1f06eb4SAndreas Gohr $content = 'a test'; 694d1f06eb4SAndreas Gohr $morecontent = "\nOther text"; 695d1f06eb4SAndreas Gohr saveWikiText($id, $content, 'local'); 696d1f06eb4SAndreas Gohr 697d1f06eb4SAndreas Gohr $params = [ 698d1f06eb4SAndreas Gohr 'page' => $id, 699d1f06eb4SAndreas Gohr 'text' => $morecontent, 700d1f06eb4SAndreas Gohr ]; 701d1f06eb4SAndreas Gohr $this->assertEquals(true, $this->remote->call('core.appendPage', $params)); 702d1f06eb4SAndreas Gohr $this->assertEquals($content . $morecontent, rawWiki($id)); 703d1f06eb4SAndreas Gohr } 704d1f06eb4SAndreas Gohr 705d1f06eb4SAndreas Gohr // endregion 706d1f06eb4SAndreas Gohr 707d1f06eb4SAndreas Gohr // region media 708d1f06eb4SAndreas Gohr 709d1f06eb4SAndreas Gohr // core.listMedia 710d1f06eb4SAndreas Gohr public function testListMedia() 711d1f06eb4SAndreas Gohr { 712d1f06eb4SAndreas Gohr $id = 'wiki:dokuwiki-128.png'; 713d1f06eb4SAndreas Gohr $file = mediaFN($id); 714d1f06eb4SAndreas Gohr $content = file_get_contents($file); 715d1f06eb4SAndreas Gohr 716d1f06eb4SAndreas Gohr $expected = [ 717d1f06eb4SAndreas Gohr [ 718d1f06eb4SAndreas Gohr 'id' => $id, 719d1f06eb4SAndreas Gohr 'size' => filesize($file), 720d1f06eb4SAndreas Gohr 'revision' => filemtime($file), 721d1f06eb4SAndreas Gohr 'isimage' => true, 722d1f06eb4SAndreas Gohr 'hash' => md5($content), 723d1f06eb4SAndreas Gohr 'permission' => 8, 724d1f06eb4SAndreas Gohr 'author' => '', 725d1f06eb4SAndreas Gohr ] 726d1f06eb4SAndreas Gohr ]; 727d1f06eb4SAndreas Gohr $this->assertEqualResult( 728d1f06eb4SAndreas Gohr $expected, 729d1f06eb4SAndreas Gohr $this->remote->call( 730d1f06eb4SAndreas Gohr 'core.listMedia', 731d1f06eb4SAndreas Gohr [ 732d1f06eb4SAndreas Gohr 'namespace' => 'wiki', 733d1f06eb4SAndreas Gohr 'pattern' => '/128/', 734d1f06eb4SAndreas Gohr 'hash' => true, 735d1f06eb4SAndreas Gohr ] 736d1f06eb4SAndreas Gohr ) 737d1f06eb4SAndreas Gohr ); 738d1f06eb4SAndreas Gohr } 739d1f06eb4SAndreas Gohr 740d1f06eb4SAndreas Gohr //core.getRecentMediaChanges 741d1f06eb4SAndreas Gohr public function testGetRecentMediaChanges() 74253585189SAndreas Gohr { 74353585189SAndreas Gohr global $conf; 74453585189SAndreas Gohr 745d1f06eb4SAndreas Gohr $_SERVER['REMOTE_USER'] = 'testuser'; 74653585189SAndreas Gohr 747d1f06eb4SAndreas Gohr $orig = mediaFN('wiki:dokuwiki-128.png'); 748d1f06eb4SAndreas Gohr $tmp = $conf['tmpdir'] . 'test.png'; 74953585189SAndreas Gohr 750d1f06eb4SAndreas Gohr $target1 = 'test:image1.png'; 751d1f06eb4SAndreas Gohr $file1 = mediaFN($target1); 752d1f06eb4SAndreas Gohr copy($orig, $tmp); 753d1f06eb4SAndreas Gohr media_save(['name' => $tmp], $target1, true, AUTH_UPLOAD, 'rename'); 75453585189SAndreas Gohr 755d1f06eb4SAndreas Gohr $target2 = 'test:image2.png'; 756d1f06eb4SAndreas Gohr $file2 = mediaFN($target2); 757d1f06eb4SAndreas Gohr copy($orig, $tmp); 758d1f06eb4SAndreas Gohr media_save(['name' => $tmp], $target2, true, AUTH_UPLOAD, 'rename'); 759d1f06eb4SAndreas Gohr 76053585189SAndreas Gohr $expected = [ 76153585189SAndreas Gohr [ 762d1f06eb4SAndreas Gohr 'id' => $target1, 763d1f06eb4SAndreas Gohr 'revision' => filemtime($file1), 764d1f06eb4SAndreas Gohr 'author' => 'testuser', 765d1f06eb4SAndreas Gohr 'ip' => clientIP(), 766d1f06eb4SAndreas Gohr 'sizechange' => filesize($file1), 767d1f06eb4SAndreas Gohr 'summary' => 'created', 768d1f06eb4SAndreas Gohr 'type' => 'C', 769d1f06eb4SAndreas Gohr ], 77053585189SAndreas Gohr [ 771d1f06eb4SAndreas Gohr 'id' => $target2, 772d1f06eb4SAndreas Gohr 'revision' => filemtime($file2), 773d1f06eb4SAndreas Gohr 'author' => 'testuser', 774d1f06eb4SAndreas Gohr 'ip' => clientIP(), 775d1f06eb4SAndreas Gohr 'sizechange' => filesize($file2), 776d1f06eb4SAndreas Gohr 'summary' => 'created', 777d1f06eb4SAndreas Gohr 'type' => 'C', 77853585189SAndreas Gohr ] 77953585189SAndreas Gohr ]; 780d1f06eb4SAndreas Gohr 781d1f06eb4SAndreas Gohr $this->assertEqualResult( 782d1f06eb4SAndreas Gohr $expected, 783d1f06eb4SAndreas Gohr $this->remote->call( 784d1f06eb4SAndreas Gohr 'core.getRecentMediaChanges', 78553585189SAndreas Gohr [ 786d1f06eb4SAndreas Gohr 'timestamp' => 0 // all recent changes 78753585189SAndreas Gohr ] 788d1f06eb4SAndreas Gohr ) 789d1f06eb4SAndreas Gohr ); 79053585189SAndreas Gohr } 79153585189SAndreas Gohr 792d1f06eb4SAndreas Gohr //core.getMedia 793d1f06eb4SAndreas Gohr public function testGetMedia() 794d1f06eb4SAndreas Gohr { 795d1f06eb4SAndreas Gohr $id = 'wiki:dokuwiki-128.png'; 796d1f06eb4SAndreas Gohr $file = mediaFN($id); 797d1f06eb4SAndreas Gohr $base64 = base64_encode(file_get_contents($file)); 798d1f06eb4SAndreas Gohr 799d1f06eb4SAndreas Gohr $this->assertEquals( 800d1f06eb4SAndreas Gohr $base64, 801d1f06eb4SAndreas Gohr $this->remote->call('core.getMedia', ['media' => $id]) 802d1f06eb4SAndreas Gohr ); 803d1f06eb4SAndreas Gohr 804d1f06eb4SAndreas Gohr $e = null; 805d1f06eb4SAndreas Gohr try { 806d1f06eb4SAndreas Gohr $this->remote->call('core.getMedia', ['media' => $id, 'rev' => 1234]); 807d1f06eb4SAndreas Gohr } catch (RemoteException $e) { 808d1f06eb4SAndreas Gohr } 809d1f06eb4SAndreas Gohr $this->assertInstanceOf(RemoteException::class, $e); 810d1f06eb4SAndreas Gohr $this->assertEquals(221, $e->getCode(), 'Non existing revision given'); 811d1f06eb4SAndreas Gohr 812d1f06eb4SAndreas Gohr $e = null; 813d1f06eb4SAndreas Gohr try { 814d1f06eb4SAndreas Gohr $this->remote->call('core.getMedia', ['media' => 'foobar.png']); 815d1f06eb4SAndreas Gohr } catch (RemoteException $e) { 816d1f06eb4SAndreas Gohr } 817d1f06eb4SAndreas Gohr $this->assertInstanceOf(RemoteException::class, $e); 818d1f06eb4SAndreas Gohr $this->assertEquals(221, $e->getCode(), 'Non existing media id given'); 819d1f06eb4SAndreas Gohr } 820d1f06eb4SAndreas Gohr 821d1f06eb4SAndreas Gohr 822d1f06eb4SAndreas Gohr //core.getMediaInfo 823d1f06eb4SAndreas Gohr public function testGetMediaInfo() 824d1f06eb4SAndreas Gohr { 825d1f06eb4SAndreas Gohr $id = 'wiki:dokuwiki-128.png'; 826d1f06eb4SAndreas Gohr $file = mediaFN($id); 827d1f06eb4SAndreas Gohr 828d1f06eb4SAndreas Gohr $expected = [ 829d1f06eb4SAndreas Gohr 'id' => $id, 830d1f06eb4SAndreas Gohr 'revision' => filemtime($file), 831d1f06eb4SAndreas Gohr 'author' => '', 832d1f06eb4SAndreas Gohr 'hash' => md5(file_get_contents($file)), 833d1f06eb4SAndreas Gohr 'size' => filesize($file), 834d1f06eb4SAndreas Gohr 'permission' => 8, 835d1f06eb4SAndreas Gohr 'isimage' => true, 836d1f06eb4SAndreas Gohr ]; 837d1f06eb4SAndreas Gohr $this->assertEqualResult( 838d1f06eb4SAndreas Gohr $expected, 839d1f06eb4SAndreas Gohr $this->remote->call('core.getMediaInfo', ['media' => $id, 'hash' => true, 'author' => false]) 840d1f06eb4SAndreas Gohr ); 841d1f06eb4SAndreas Gohr 842d1f06eb4SAndreas Gohr $e = null; 843d1f06eb4SAndreas Gohr try { 844d1f06eb4SAndreas Gohr $this->remote->call('core.getMediaInfo', ['media' => $id, 'rev' => 1234]); 845d1f06eb4SAndreas Gohr } catch (RemoteException $e) { 846d1f06eb4SAndreas Gohr } 847d1f06eb4SAndreas Gohr $this->assertInstanceOf(RemoteException::class, $e); 848d1f06eb4SAndreas Gohr $this->assertEquals(221, $e->getCode(), 'Non existing revision given'); 849d1f06eb4SAndreas Gohr 850d1f06eb4SAndreas Gohr $e = null; 851d1f06eb4SAndreas Gohr try { 852d1f06eb4SAndreas Gohr $this->remote->call('core.getMediaInfo', ['media' => 'foobar.png']); 853d1f06eb4SAndreas Gohr } catch (RemoteException $e) { 854d1f06eb4SAndreas Gohr } 855d1f06eb4SAndreas Gohr $this->assertInstanceOf(RemoteException::class, $e); 856d1f06eb4SAndreas Gohr $this->assertEquals(221, $e->getCode(), 'Non existing media id given'); 857d1f06eb4SAndreas Gohr } 858d1f06eb4SAndreas Gohr 859*61d21e86Skuangfio //core.getMediaHistory 860*61d21e86Skuangfio public function testGetMediaHistory() 861*61d21e86Skuangfio { 862*61d21e86Skuangfio global $conf; 863*61d21e86Skuangfio 864*61d21e86Skuangfio $_SERVER['REMOTE_USER'] = 'testuser'; 865*61d21e86Skuangfio 866*61d21e86Skuangfio //image to be uploaded 867*61d21e86Skuangfio $orig = mediaFN('wiki:dokuwiki-128.png'); 868*61d21e86Skuangfio $tmp = $conf['tmpdir'] . 'test.png'; 869*61d21e86Skuangfio 870*61d21e86Skuangfio //create image to be revised 871*61d21e86Skuangfio $id = 'test:image3.png'; 872*61d21e86Skuangfio $media = mediaFN($id); 873*61d21e86Skuangfio 874*61d21e86Skuangfio $rev = []; 875*61d21e86Skuangfio for ($i = 0; $i < 2; $i++) { 876*61d21e86Skuangfio $this->waitForTick(); 877*61d21e86Skuangfio copy($orig, $tmp); 878*61d21e86Skuangfio media_save(['name' => $tmp], $id, true, AUTH_UPLOAD, 'rename'); 879*61d21e86Skuangfio $rev[$i] = filemtime($media); 880*61d21e86Skuangfio } 881*61d21e86Skuangfio 882*61d21e86Skuangfio $params = ['media' => $id, 'first' => 0]; // offset 0 883*61d21e86Skuangfio $versions = $this->remote->call('core.getMediaHistory', $params); 884*61d21e86Skuangfio $versions = json_decode(json_encode($versions), true); 885*61d21e86Skuangfio $this->assertEquals(2, count($versions)); 886*61d21e86Skuangfio $this->assertEquals($rev[1], $versions[0]['revision']); 887*61d21e86Skuangfio $this->assertEquals($rev[0], $versions[1]['revision']); 888*61d21e86Skuangfio 889*61d21e86Skuangfio $params = ['media' => $id, 'first' => 1]; // offset 1 890*61d21e86Skuangfio $versions = $this->remote->call('core.getMediaHistory', $params); 891*61d21e86Skuangfio $versions = json_decode(json_encode($versions), true); 892*61d21e86Skuangfio $this->assertEquals(1, count($versions)); 893*61d21e86Skuangfio $this->assertEquals($rev[0], $versions[0]['revision']); 894*61d21e86Skuangfio 895*61d21e86Skuangfio $params = ['media' => $id, 'first' => 2]; // offset 2 896*61d21e86Skuangfio $versions = $this->remote->call('core.getMediaHistory', $params); 897*61d21e86Skuangfio $versions = json_decode(json_encode($versions), true); 898*61d21e86Skuangfio $this->assertEquals(0, count($versions)); 899*61d21e86Skuangfio 900*61d21e86Skuangfio $params = ['media' => $id, 'first' => 2]; // offset 3 901*61d21e86Skuangfio $versions = $this->remote->call('core.getMediaHistory', $params); 902*61d21e86Skuangfio $versions = json_decode(json_encode($versions), true); 903*61d21e86Skuangfio $this->assertEquals(0, count($versions)); 904*61d21e86Skuangfio } 905*61d21e86Skuangfio 906d1f06eb4SAndreas Gohr //core.saveMedia 907d1f06eb4SAndreas Gohr public function testSaveMedia() 908d1f06eb4SAndreas Gohr { 909d1f06eb4SAndreas Gohr $orig = mediaFN('wiki:dokuwiki-128.png'); 910d1f06eb4SAndreas Gohr $base64 = base64_encode(file_get_contents($orig)); 911d1f06eb4SAndreas Gohr 912d1f06eb4SAndreas Gohr $target = 'test:putimage.png'; 913d1f06eb4SAndreas Gohr $targetfile = mediaFN($target); 914d1f06eb4SAndreas Gohr 915d1f06eb4SAndreas Gohr $this->assertTrue($this->remote->call('core.saveMedia', ['media' => $target, 'base64' => $base64])); 916d1f06eb4SAndreas Gohr $this->assertFileExists($targetfile); 917d1f06eb4SAndreas Gohr $this->assertFileEquals($orig, $targetfile); 918d1f06eb4SAndreas Gohr } 919d1f06eb4SAndreas Gohr 920d1f06eb4SAndreas Gohr //core.deleteMedia 921d1f06eb4SAndreas Gohr public function testDeleteMedia() 922d1f06eb4SAndreas Gohr { 923d1f06eb4SAndreas Gohr global $conf; 924d1f06eb4SAndreas Gohr global $AUTH_ACL; 925d1f06eb4SAndreas Gohr global $USERINFO; 926d1f06eb4SAndreas Gohr 927d1f06eb4SAndreas Gohr $id = 'wiki:dokuwiki-128.png'; 928d1f06eb4SAndreas Gohr $file = mediaFN($id); 929d1f06eb4SAndreas Gohr 930d1f06eb4SAndreas Gohr // deletion should fail, we only have AUTH_UPLOAD 931d1f06eb4SAndreas Gohr $e = null; 932d1f06eb4SAndreas Gohr try { 933d1f06eb4SAndreas Gohr $this->remote->call('core.deleteMedia', ['media' => $id]); 934d1f06eb4SAndreas Gohr } catch (AccessDeniedException $e) { 935d1f06eb4SAndreas Gohr } 936d1f06eb4SAndreas Gohr $this->assertInstanceOf(AccessDeniedException::class, $e); 937d1f06eb4SAndreas Gohr $this->assertEquals(212, $e->getCode(), 'No permission to delete'); 938d1f06eb4SAndreas Gohr $this->assertFileExists($file); 939d1f06eb4SAndreas Gohr 940d1f06eb4SAndreas Gohr // setup new ACLs 941d1f06eb4SAndreas Gohr $conf['useacl'] = 1; 942d1f06eb4SAndreas Gohr $_SERVER['REMOTE_USER'] = 'john'; 943d1f06eb4SAndreas Gohr $USERINFO['grps'] = array('user'); 944d1f06eb4SAndreas Gohr $AUTH_ACL = array( 945d1f06eb4SAndreas Gohr '* @ALL 0', 946d1f06eb4SAndreas Gohr '* @user 16', 947d1f06eb4SAndreas Gohr ); 948d1f06eb4SAndreas Gohr 949d1f06eb4SAndreas Gohr // deletion should work now 950d1f06eb4SAndreas Gohr $this->assertTrue($this->remote->call('core.deleteMedia', ['media' => $id])); 9519ad2b913SAndreas Gohr $this->assertFileDoesNotExist($file); 952d1f06eb4SAndreas Gohr 953d1f06eb4SAndreas Gohr clearstatcache(false, $file); 954d1f06eb4SAndreas Gohr 955d1f06eb4SAndreas Gohr // deleting the file again should not work 956d1f06eb4SAndreas Gohr $e = null; 957d1f06eb4SAndreas Gohr try { 958d1f06eb4SAndreas Gohr $this->remote->call('core.deleteMedia', ['media' => $id]); 959d1f06eb4SAndreas Gohr } catch (RemoteException $e) { 960d1f06eb4SAndreas Gohr } 961d1f06eb4SAndreas Gohr $this->assertInstanceOf(RemoteException::class, $e); 962d1f06eb4SAndreas Gohr $this->assertEquals(221, $e->getCode(), 'Non existing media id given'); 963d1f06eb4SAndreas Gohr } 964d1f06eb4SAndreas Gohr // endregion 96553585189SAndreas Gohr} 966