1<?php 2 3// must be run within Dokuwiki 4if (!defined('DOKU_INC')) die(); 5 6/** 7 * Test cases for namespace move functionality of the move plugin 8 * 9 * @group plugin_move 10 * @group plugins 11 */ 12class plugin_move_namespace_move_test extends DokuWikiTest { 13 14 public function setUp(): void { 15 $this->pluginsEnabled[] = 'move'; 16 parent::setUp(); 17 } 18 19 /** 20 * @coversNothing 21 */ 22 public function tearDown(): void { 23 /** @var helper_plugin_move_plan $plan */ 24 $plan = plugin_load('helper', 'move_plan'); 25 $plan->abort(); 26 27 io_rmdir(DOKU_TMP_DATA."pages/newns",true); 28 io_rmdir(DOKU_TMP_DATA."media/newns",true); 29 io_rmdir(DOKU_TMP_DATA."meta/newns",true); 30 31 parent::tearDown(); 32 } 33 34 /** 35 * This is an integration test, which checks the correct working of an entire namespace move. 36 * Hence it is not an unittest, hence it @coversNothing 37 * 38 * @group slow 39 */ 40 public function test_move_wiki_namespace() { 41 global $AUTH_ACL; 42 43 $AUTH_ACL[] = "wiki:*\t@ALL\t16"; 44 45 idx_addPage('wiki:dokuwiki'); 46 idx_addPage('wiki:syntax'); 47 48 /** @var helper_plugin_move_plan $plan */ 49 $plan = plugin_load('helper', 'move_plan'); 50 51 $this->assertFalse($plan->inProgress()); 52 53 $plan->addPageNamespaceMove('wiki', 'foo'); 54 $plan->addMediaNamespaceMove('wiki', 'foo'); 55 56 $plan->commit(); 57 58 $this->assertSame(1, $plan->nextStep(),'pages'); 59 $this->assertSame(1, $plan->nextStep(),'media'); 60 $this->assertSame(1, $plan->nextStep(),'missing'); 61 $this->assertSame(1, $plan->nextStep(),'namespace'); 62 $this->assertSame(1, $plan->nextStep(),'autorewrite'); 63 $this->assertSame(0, $plan->nextStep(),'done'); 64 65 $this->assertFileExists(wikiFN('foo:dokuwiki')); 66 $this->assertFileNotExists(wikiFN('wiki:syntax')); 67 $this->assertFileExists(mediaFN('foo:dokuwiki-128.png')); 68 } 69 70 /** 71 * This is an integration test, which checks the correct working of an entire namespace move. 72 * Hence it is not an unittest, hence it @coversNothing 73 * 74 * @group slow 75 */ 76 public function test_move_missing() { 77 saveWikiText('oldspace:page', '[[missing]]', 'setup'); 78 idx_addPage('oldspace:page'); 79 80 /** @var helper_plugin_move_plan $plan */ 81 $plan = plugin_load('helper', 'move_plan'); 82 83 $this->assertFalse($plan->inProgress()); 84 85 $plan->addPageNamespaceMove('oldspace', 'newspace'); 86 87 $plan->commit(); 88 89 $this->assertSame(1, $plan->nextStep(),'page'); 90 $this->assertSame(1, $plan->nextStep(),'missing'); 91 $this->assertSame(1, $plan->nextStep(),'namespace'); 92 $this->assertSame(1, $plan->nextStep(),'autorewrite'); 93 $this->assertSame(0, $plan->nextStep(),'done'); 94 95 $this->assertFileExists(wikiFN('newspace:page')); 96 $this->assertFileNotExists(wikiFN('oldspace:page')); 97 98 $this->assertEquals('[[missing]]', rawWiki('newspace:page')); 99 } 100 101 /** 102 * @covers helper_plugin_move_plan::findAffectedPages 103 * @uses Doku_Indexer 104 */ 105 public function test_move_affected() { 106 saveWikiText('oldaffectedspace:page', '[[missing]]', 'setup'); 107 idx_addPage('oldaffectedspace:page'); 108 /** @var helper_plugin_move_plan $plan */ 109 $plan = plugin_load('helper', 'move_plan'); 110 111 $this->assertFalse($plan->inProgress()); 112 113 $plan->addPageNamespaceMove('oldaffectedspace', 'newaffectedspace'); 114 115 $plan->commit(); 116 117 $affected_file = file(TMP_DIR . '/data/meta/__move_affected'); 118 $this->assertSame('newaffectedspace:page',trim($affected_file[0])); 119 } 120 121 /** 122 * This is an integration test, which checks the correct working of an entire namespace move. 123 * Hence it is not an unittest, hence it @coversNothing 124 * 125 * @group slow 126 */ 127 function test_move_large_ns(){ 128 129 $this->markTestSkipped( 130 'This test randomly fails with the page "testns:start" being moved, but "start" not being rewritten in the request.' 131 ); 132 133 global $conf; 134 135 $test = '[[testns:start]] [[testns:test_page17]]'; 136 $summary = 'testsetup'; 137 138 139 saveWikiText(':start', $test, $summary); 140 idx_addPage(':start'); 141 saveWikiText('testns:start', $test, $summary); 142 idx_addPage('testns:start'); 143 saveWikiText('testns:test_page1', $test, $summary); 144 idx_addPage('testns:test_page1'); 145 saveWikiText('testns:test_page2', $test, $summary); 146 idx_addPage('testns:test_page2'); 147 saveWikiText('testns:test_page3', $test, $summary); 148 idx_addPage('testns:test_page3'); 149 saveWikiText('testns:test_page4', $test, $summary); 150 idx_addPage('testns:test_page4'); 151 saveWikiText('testns:test_page5', $test, $summary); 152 idx_addPage('testns:test_page5'); 153 saveWikiText('testns:test_page6', $test, $summary); 154 idx_addPage('testns:test_page6'); 155 saveWikiText('testns:test_page7', $test, $summary); 156 idx_addPage('testns:test_page7'); 157 saveWikiText('testns:test_page8', $test, $summary); 158 idx_addPage('testns:test_page8'); 159 saveWikiText('testns:test_page9', $test, $summary); 160 idx_addPage('testns:test_page9'); 161 saveWikiText('testns:test_page10', $test, $summary); 162 idx_addPage('testns:test_page10'); 163 saveWikiText('testns:test_page11', $test, $summary); 164 idx_addPage('testns:test_page11'); 165 saveWikiText('testns:test_page12', $test, $summary); 166 idx_addPage('testns:test_page12'); 167 saveWikiText('testns:test_page13', $test, $summary); 168 idx_addPage('testns:test_page13'); 169 saveWikiText('testns:test_page14', $test, $summary); 170 idx_addPage('testns:test_page14'); 171 saveWikiText('testns:test_page15', $test, $summary); 172 idx_addPage('testns:test_page15'); 173 saveWikiText('testns:test_page16', $test, $summary); 174 idx_addPage('testns:test_page16'); 175 saveWikiText('testns:test_page17', $test, $summary); 176 idx_addPage('testns:test_page17'); 177 saveWikiText('testns:test_page18', $test, $summary); 178 idx_addPage('testns:test_page18'); 179 saveWikiText('testns:test_page19', $test, $summary); 180 idx_addPage('testns:test_page19'); 181 182 $conf['plugin']['move']['autorewrite'] = 0; 183 184 /** @var helper_plugin_move_plan $plan */ 185 $plan = plugin_load('helper', 'move_plan'); 186 187 $this->assertFalse($plan->inProgress()); 188 189 $plan->addPageNamespaceMove('testns', 'foo:testns'); 190 191 $plan->commit(); 192 global $conf; 193 $lockfile = $conf['lockdir'] . 'move.lock'; 194 195 $this->assertSame(10, $plan->nextStep(),"After processing first chunk of pages, 10 steps should be left"); 196 197 $request = new TestRequest(); 198 $response = $request->get(); 199 $actual_response = $response->getContent(); 200 //clean away clutter 201 $actual_response = substr($actual_response,strpos($actual_response,"<!-- wikipage start -->") + 23); 202 $actual_response = substr($actual_response,strpos($actual_response, 'doku.php')); 203 $actual_response = substr($actual_response,0,strpos($actual_response,"<!-- wikipage stop -->")); 204 $actual_response = trim($actual_response); 205 $actual_response = rtrim($actual_response,"</p>"); 206 $actual_response = trim($actual_response); 207 208 $expected_response = 'doku.php?id=foo:testns:start" class="wikilink1" title="foo:testns:start">testns</a> <a href="/./doku.php?id=testns:test_page17" class="wikilink1" title="testns:test_page17">test_page17</a>'; 209 $this->assertSame($expected_response,$actual_response); // todo: this assert fails occaisionally, but not reproduciably. It then has the following oputput: <a href="/./doku.php?id=testns:start" class="wikilink2" title="testns:start" rel="nofollow">testns</a> <a href="/./doku.php?id=testns:test_page17" class="wikilink1" title="testns:test_page17">test_page17</a> 210 211 $expected_file_contents = '[[testns:start]] [[testns:test_page17]]'; 212 $start_file = file(TMP_DIR . '/data/pages/start.txt'); 213 $actual_file_contents = $start_file[0]; 214 $this->assertSame($expected_file_contents,$actual_file_contents); 215 216 /** @var helper_plugin_move_rewrite $rewrite */ 217 $rewrite = plugin_load('helper', 'move_rewrite'); 218 $expected_move_meta = array('origin'=> 'testns:start', 'pages' => array(array('testns:start','foo:testns:start')),'media' => array()); 219 $actual_move_media = $rewrite->getMoveMeta('foo:testns:start'); 220 $this->assertSame($expected_move_meta,$actual_move_media); 221 $this->assertFileExists($lockfile); 222 223 } 224 225 /** 226 * This is an integration test, which checks the correct working of an entire namespace move. 227 * Hence it is not an unittest, hence it @coversNothing 228 * 229 * @group slow 230 */ 231 public function test_move_small_namespace_pages() { 232 global $AUTH_ACL; 233 234 $AUTH_ACL[] = "oldns:*\t@ALL\t16"; 235 $AUTH_ACL[] = "newns:*\t@ALL\t16"; 236 237 saveWikiText('start', '[[oldns:start]] [[oldns:page]] [[oldns:missing]]', 'setup'); 238 idx_addPage('start'); 239 saveWikiText('oldns:start', '[[oldns:start]] [[oldns:page]] [[oldns:missing]] [[missing]] [[page]]', 'setup'); 240 idx_addPage('oldns:start'); 241 saveWikiText('oldns:page', '[[oldns:start]] [[oldns:page]] [[oldns:missing]] [[missing]] [[start]]', 'setup'); 242 idx_addPage('oldns:page'); 243 244 245 /** @var helper_plugin_move_plan $plan */ 246 $plan = plugin_load('helper', 'move_plan'); 247 248 $this->assertFalse($plan->inProgress()); 249 250 $plan->addPageNamespaceMove('oldns', 'newns'); 251 252 $plan->commit(); 253 254 $this->assertSame(1, $plan->nextStep(), 'pages'); 255 $this->assertSame(1, $plan->nextStep(), 'missing'); 256 $this->assertSame(1, $plan->nextStep(), 'namespace'); 257 $this->assertSame(1, $plan->nextStep(), 'autorewrite'); 258 $this->assertSame(0, $plan->nextStep(), 'done'); 259 260 $this->assertFileExists(wikiFN('newns:start')); 261 $this->assertFileExists(wikiFN('newns:page')); 262 $this->assertFileNotExists(wikiFN('oldns:start')); 263 $this->assertFileNotExists(wikiFN('oldns:page')); 264 265 $this->assertSame('[[newns:start]] [[newns:page]] [[newns:missing]] [[missing]] [[page]]',rawWiki('newns:start')); 266 $this->assertSame('[[newns:start]] [[newns:page]] [[newns:missing]] [[missing]] [[start]]',rawWiki('newns:page')); 267 $this->assertSame('[[newns:start]] [[newns:page]] [[newns:missing]]',rawWiki('start')); 268 } 269 270 /** 271 * This is an integration test, which checks the correct working of an entire namespace move. 272 * Hence it is not an unittest, hence it @coversNothing 273 * 274 * @group slow 275 */ 276 public function test_move_small_namespace_media() { 277 global $AUTH_ACL; 278 279 $AUTH_ACL[] = "oldns:*\t@ALL\t16"; 280 $AUTH_ACL[] = "newns:*\t@ALL\t16"; 281 282 $filepath = DOKU_TMP_DATA.'media/oldns/oldnsimage.png'; 283 io_makeFileDir($filepath); 284 io_saveFile($filepath,''); 285 saveWikiText('start', '{{oldns:oldnsimage.png}} {{oldns:oldnsimage_missing.png}} {{image_missing.png}}', 'setup'); 286 idx_addPage('start'); 287 288 /** @var helper_plugin_move_plan $plan */ 289 $plan = plugin_load('helper', 'move_plan'); 290 291 $this->assertFalse($plan->inProgress()); 292 293 $plan->addMediaNamespaceMove('oldns', 'newns'); 294 295 $plan->commit(); 296 297 $this->assertSame(1, $plan->nextStep(), 'media'); 298 $this->assertSame(1, $plan->nextStep(), 'missing_media'); 299 $this->assertSame(1, $plan->nextStep(), 'autorewrite'); 300 $this->assertSame(0, $plan->nextStep(), 'done'); 301 302 $this->assertFileExists(mediaFN('newns:oldnsimage.png')); 303 $this->assertFileNotExists(mediaFN('oldns:oldnsimage.png')); 304 305 $this->assertSame('{{newns:oldnsimage.png}} {{newns:oldnsimage_missing.png}} {{image_missing.png}}',rawWiki('start')); 306 } 307 308 /** 309 * This is an integration test, which checks the correct working of an entire namespace move. 310 * Hence it is not an unittest, hence it @coversNothing 311 * 312 * @group slow 313 */ 314 public function test_move_small_namespace_media_affected() { 315 global $AUTH_ACL; 316 317 $AUTH_ACL[] = "oldns:*\t@ALL\t16"; 318 $AUTH_ACL[] = "newns:*\t@ALL\t16"; 319 320 $filepath = DOKU_TMP_DATA.'media/oldns/oldnsimage.png'; 321 io_makeFileDir($filepath); 322 io_saveFile($filepath,''); 323 saveWikiText('oldns:start', '{{:oldns:oldnsimage.png}} {{oldns:oldnsimage_missing.png}} {{oldnsimage_missing.png}} {{oldnsimage.png}}', 'setup'); 324 idx_addPage('oldns:start'); 325 326 /** @var helper_plugin_move_plan $plan */ 327 $plan = plugin_load('helper', 'move_plan'); 328 329 $this->assertFalse($plan->inProgress()); 330 331 $plan->addMediaNamespaceMove('oldns', 'newns'); 332 333 $plan->commit(); 334 335 $this->assertSame(1, $plan->nextStep(), 'media'); 336 $this->assertSame(1, $plan->nextStep(), 'missing_media'); 337 $this->assertSame(1, $plan->nextStep(), 'autorewrite'); 338 $this->assertSame(0, $plan->nextStep(), 'done'); 339 340 $this->assertFileExists(mediaFN('newns:oldnsimage.png')); 341 $this->assertFileNotExists(mediaFN('oldns:oldnsimage.png')); 342 343 $this->assertSame('{{newns:oldnsimage.png}} {{newns:oldnsimage_missing.png}} {{newns:oldnsimage_missing.png}} {{newns:oldnsimage.png}}',rawWiki('oldns:start')); 344 } 345 346 /** 347 * This is an integration test, which checks the correct working of an entire namespace move. 348 * Hence it is not an unittest, hence it @coversNothing 349 * 350 * @group slow 351 */ 352 public function test_move_small_namespace_combi() { 353 global $AUTH_ACL; 354 355 $AUTH_ACL[] = "oldns:*\t@ALL\t16"; 356 $AUTH_ACL[] = "newns:*\t@ALL\t16"; 357 358 $filepath = DOKU_TMP_DATA.'media/oldns/oldnsimage.png'; 359 io_makeFileDir($filepath); 360 io_saveFile($filepath,''); 361 saveWikiText('start', "[[oldns:start]] [[oldns:page]] [[oldns:missing]]\n{{oldns:oldnsimage.png}} {{oldns:oldnsimage_missing.png}} {{oldnsimage_missing.png}}", 'setup'); 362 idx_addPage('start'); 363 saveWikiText('oldns:start', '[[oldns:start]] [[oldns:page]] [[oldns:missing]] [[missing]] [[page]]', 'setup'); 364 idx_addPage('oldns:start'); 365 saveWikiText('oldns:page', '[[oldns:start]] [[oldns:page]] [[oldns:missing]] [[missing]] [[start]]', 'setup'); 366 idx_addPage('oldns:page'); 367 368 /** @var helper_plugin_move_plan $plan */ 369 $plan = plugin_load('helper', 'move_plan'); 370 371 $this->assertFalse($plan->inProgress()); 372 373 $plan->addMediaNamespaceMove('oldns', 'newns'); 374 $plan->addPageNamespaceMove('oldns', 'newns'); 375 376 $plan->commit(); 377 378 $this->assertSame(1, $plan->nextStep(), 'pages'); 379 $this->assertSame(1, $plan->nextStep(), 'media'); 380 $this->assertSame(1, $plan->nextStep(), 'missing'); 381 $this->assertSame(1, $plan->nextStep(), 'missing_media'); 382 $this->assertSame(1, $plan->nextStep(), 'namespaces'); 383 $this->assertSame(1, $plan->nextStep(), 'autorewrite'); 384 $this->assertSame(0, $plan->nextStep(), 'done'); 385 386 $this->assertFileExists(mediaFN('newns:oldnsimage.png')); 387 $this->assertFileNotExists(mediaFN('oldns:oldnsimage.png')); 388 389 $this->assertSame("[[newns:start]] [[newns:page]] [[newns:missing]]\n{{newns:oldnsimage.png}} {{newns:oldnsimage_missing.png}} {{oldnsimage_missing.png}}",rawWiki('start')); 390 } 391 392 /** 393 * This is an integration test, which checks the correct working of an entire namespace move. 394 * Hence it is not an unittest, hence it @coversNothing 395 * 396 * @group slow 397 */ 398 public function test_move_small_namespace_subscription_ns() { 399 global $AUTH_ACL; 400 401 $AUTH_ACL[] = "subns:*\t@ALL\t16"; 402 $AUTH_ACL[] = "newns:*\t@ALL\t16"; 403 404 saveWikiText('subns:start', 'Lorem Ipsum', 'setup'); 405 idx_addPage('subns:start'); 406 407 $oldfilepath = DOKU_TMP_DATA.'meta/subns/.mlist'; 408 $subscription = 'doe every 1427984341'; 409 io_makeFileDir($oldfilepath); 410 io_saveFile($oldfilepath,$subscription); 411 $newfilepath = DOKU_TMP_DATA.'meta/newns/.mlist'; 412 413 /** @var helper_plugin_move_plan $plan */ 414 $plan = plugin_load('helper', 'move_plan'); 415 416 $this->assertFalse($plan->inProgress()); 417 418 $plan->addPageNamespaceMove('subns', 'newns'); 419 420 $plan->commit(); 421 422 $this->assertSame(1, $plan->nextStep(), 'pages'); 423 $this->assertSame(1, $plan->nextStep(), 'namespace'); 424 $this->assertSame(0, $plan->nextStep(), 'done'); 425 426 $this->assertFileExists(wikiFN('newns:start')); 427 $this->assertFileExists($newfilepath); 428 $this->assertFileNotExists(wikiFN('subns:start')); 429 $this->assertFileNotExists($oldfilepath); 430 431 $this->assertSame($subscription,file_get_contents($newfilepath)); 432 433 } 434 435 /** 436 * This is an integration test, which checks the correct working of an entire namespace move. 437 * Hence it is not an unittest, hence it @coversNothing 438 * 439 * @group slow 440 */ 441 public function test_move_small_namespace_subscription_page() { 442 global $AUTH_ACL; 443 444 $AUTH_ACL[] = "subns:*\t@ALL\t16"; 445 $AUTH_ACL[] = "newns:*\t@ALL\t16"; 446 447 saveWikiText('subns:start', 'Lorem Ipsum', 'setup'); 448 idx_addPage('subns:start'); 449 450 $oldfilepath = DOKU_TMP_DATA.'meta/subns/start.mlist'; 451 $subscription = 'doe every 1427984341'; 452 io_makeFileDir($oldfilepath); 453 io_saveFile($oldfilepath,$subscription); 454 $newfilepath = DOKU_TMP_DATA.'meta/newns/start.mlist'; 455 456 /** @var helper_plugin_move_plan $plan */ 457 $plan = plugin_load('helper', 'move_plan'); 458 459 $this->assertFalse($plan->inProgress()); 460 461 $plan->addPageNamespaceMove('subns', 'newns'); 462 463 $plan->commit(); 464 465 $this->assertSame(1, $plan->nextStep(), 'pages'); 466 $this->assertSame(1, $plan->nextStep(), 'namespace'); 467 $this->assertSame(0, $plan->nextStep(), 'done'); 468 469 $this->assertFileExists(wikiFN('newns:start')); 470 $this->assertFileExists($newfilepath); 471 $this->assertFileNotExists(wikiFN('subns:start')); 472 $this->assertFileNotExists($oldfilepath); 473 474 $this->assertSame($subscription,file_get_contents($newfilepath)); 475 476 } 477 478} 479