1023953f0SAndreas Gohr<?php 2023953f0SAndreas Gohr 30c3a5702SAndreas Gohruse dokuwiki\ChangeLog\PageChangeLog; 40c3a5702SAndreas Gohr 5*3d3f6056SSatoshi Sahara/** 6*3d3f6056SSatoshi Sahara * saveWikiText() stores files in pages/, attic/ and adds entries to changelog 7*3d3f6056SSatoshi Sahara */ 8023953f0SAndreas Gohrclass common_saveWikiText_test extends DokuWikiTest { 9*3d3f6056SSatoshi Sahara 10ea466a98SMichael Hamann /** Delay writes of old revisions by a second. */ 11ea466a98SMichael Hamann public function handle_write(Doku_Event $event, $param) { 12ea466a98SMichael Hamann if ($event->data[3] !== false) { 13ea466a98SMichael Hamann $this->waitForTick(); 14ea466a98SMichael Hamann } 15ea466a98SMichael Hamann } 16023953f0SAndreas Gohr 17023953f0SAndreas Gohr /** 18023953f0SAndreas Gohr * Execute a whole bunch of saves on the same page and check the results 19*3d3f6056SSatoshi Sahara * TEST 1 20*3d3f6056SSatoshi Sahara * 1.1 create a page 21*3d3f6056SSatoshi Sahara * 1.2 save with same content should be ignored 22*3d3f6056SSatoshi Sahara * 1.3 update the page with new text 23*3d3f6056SSatoshi Sahara * 1.4 add a minor edit (unauthenticated) 24*3d3f6056SSatoshi Sahara * 1.5 add a minor edit (authenticated) 25*3d3f6056SSatoshi Sahara * 1.6 delete 26*3d3f6056SSatoshi Sahara * 1.7 restore 27*3d3f6056SSatoshi Sahara * 1.8 external edit 28*3d3f6056SSatoshi Sahara * 1.9 save on top of external edit 29023953f0SAndreas Gohr */ 30*3d3f6056SSatoshi Sahara function test_savesequence1() { 31023953f0SAndreas Gohr global $REV; 32023953f0SAndreas Gohr 33023953f0SAndreas Gohr $page = 'page'; 34023953f0SAndreas Gohr $file = wikiFN($page); 35023953f0SAndreas Gohr 36*3d3f6056SSatoshi Sahara // 1.1 create a page 37023953f0SAndreas Gohr $this->assertFileNotExists($file); 38*3d3f6056SSatoshi Sahara saveWikiText($page, 'teststring', '1st save', false); 39023953f0SAndreas Gohr $this->assertFileExists($file); 40023953f0SAndreas Gohr $lastmod = filemtime($file); 41*3d3f6056SSatoshi Sahara $expect = array( 42*3d3f6056SSatoshi Sahara 'date' => $lastmod, 43*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 44*3d3f6056SSatoshi Sahara 'sum' => '1st save', 45*3d3f6056SSatoshi Sahara 'sizechange' => 10, // = strlen('teststring') 46*3d3f6056SSatoshi Sahara ); 47023953f0SAndreas Gohr 48023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 49023953f0SAndreas Gohr $revisions = $pagelog->getRevisions(-1, 200); 507866d571SSatoshi Sahara $this->assertCount(1, $revisions); 51*3d3f6056SSatoshi Sahara // last revision 52*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 53*3d3f6056SSatoshi Sahara $expect += $lastRevInfo; 54*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 55*3d3f6056SSatoshi Sahara // current revision 56*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 57*3d3f6056SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 58*3d3f6056SSatoshi Sahara // attic 59*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date'], 'file missing in attic')); 60023953f0SAndreas Gohr 61aaf4f55eSAndreas Gohr $this->waitForTick(true); // wait for new revision ID 62023953f0SAndreas Gohr 63*3d3f6056SSatoshi Sahara // 1.2 save with same content should be ignored 64*3d3f6056SSatoshi Sahara saveWikiText($page, 'teststring', '2nd save', false); 65023953f0SAndreas Gohr clearstatcache(false, $file); 66023953f0SAndreas Gohr $this->assertEquals($lastmod, filemtime($file)); 67023953f0SAndreas Gohr 68023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 69023953f0SAndreas Gohr $revisions = $pagelog->getRevisions(-1, 200); 707866d571SSatoshi Sahara $this->assertCount(1, $revisions); 71023953f0SAndreas Gohr 72*3d3f6056SSatoshi Sahara // 1.3 update the page with new text 73*3d3f6056SSatoshi Sahara saveWikiText($page, 'teststring2long', '3rd save', false); 74023953f0SAndreas Gohr clearstatcache(false, $file); 75023953f0SAndreas Gohr $newmod = filemtime($file); 76023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 77023953f0SAndreas Gohr $lastmod = $newmod; 78*3d3f6056SSatoshi Sahara $expect = array( 79*3d3f6056SSatoshi Sahara 'date' => $lastmod, 80*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 81*3d3f6056SSatoshi Sahara 'sum' => '3rd save', 82*3d3f6056SSatoshi Sahara 'sizechange' => 5, 83*3d3f6056SSatoshi Sahara ); 84023953f0SAndreas Gohr 85023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 86023953f0SAndreas Gohr $revisions = $pagelog->getRevisions(-1, 200); 877866d571SSatoshi Sahara $this->assertCount(2, $revisions); 88*3d3f6056SSatoshi Sahara // last revision 89*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 90*3d3f6056SSatoshi Sahara $expect += $lastRevInfo; 91*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 92*3d3f6056SSatoshi Sahara // current revision 93*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 94*3d3f6056SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 95*3d3f6056SSatoshi Sahara // attic 96*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date'], 'file missing in attic')); 97023953f0SAndreas Gohr 98aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 99023953f0SAndreas Gohr 100*3d3f6056SSatoshi Sahara // 1.4 add a minor edit (unauthenticated) 101*3d3f6056SSatoshi Sahara saveWikiText($page, 'teststring3long', '4th save', true); 102023953f0SAndreas Gohr clearstatcache(false, $file); 103023953f0SAndreas Gohr $newmod = filemtime($file); 104023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 105023953f0SAndreas Gohr $lastmod = $newmod; 106*3d3f6056SSatoshi Sahara $expect = array( 107*3d3f6056SSatoshi Sahara 'date' => $lastmod, 108*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 109*3d3f6056SSatoshi Sahara 'sum' => '4th save', 110*3d3f6056SSatoshi Sahara 'sizechange' => 0, 111*3d3f6056SSatoshi Sahara ); 112023953f0SAndreas Gohr 113023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 114023953f0SAndreas Gohr $revisions = $pagelog->getRevisions(-1, 200); 1157866d571SSatoshi Sahara $this->assertCount(3, $revisions); 116*3d3f6056SSatoshi Sahara // last revision 117*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 118*3d3f6056SSatoshi Sahara $expect += $lastRevInfo; 119*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 120*3d3f6056SSatoshi Sahara // current revision 121*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 122*3d3f6056SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 123*3d3f6056SSatoshi Sahara // attic 124*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date'], 'file missing in attic')); 125023953f0SAndreas Gohr 126aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 127023953f0SAndreas Gohr 128*3d3f6056SSatoshi Sahara // 1.5 add a minor edit (authenticated) 129023953f0SAndreas Gohr $_SERVER['REMOTE_USER'] = 'user'; 130*3d3f6056SSatoshi Sahara saveWikiText($page, 'teststring4', '5th save', true); 131023953f0SAndreas Gohr clearstatcache(false, $file); 132023953f0SAndreas Gohr $newmod = filemtime($file); 133023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 134023953f0SAndreas Gohr $lastmod = $newmod; 135*3d3f6056SSatoshi Sahara $expect = array( 136*3d3f6056SSatoshi Sahara 'date' => $lastmod, 137*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_MINOR_EDIT, 138*3d3f6056SSatoshi Sahara 'sum' => '5th save', 139*3d3f6056SSatoshi Sahara 'sizechange' => -4, 140*3d3f6056SSatoshi Sahara ); 141023953f0SAndreas Gohr 142023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 143023953f0SAndreas Gohr $revisions = $pagelog->getRevisions(-1, 200); 1447866d571SSatoshi Sahara $this->assertCount(4, $revisions); 145*3d3f6056SSatoshi Sahara // last revision 146*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 147*3d3f6056SSatoshi Sahara $expect += $lastRevInfo; 148*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 149*3d3f6056SSatoshi Sahara // current revision 150*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 151*3d3f6056SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 152*3d3f6056SSatoshi Sahara // attic 153*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date'], 'file missing in attic')); 154023953f0SAndreas Gohr 155aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 156023953f0SAndreas Gohr 157*3d3f6056SSatoshi Sahara // 1.6 delete 158*3d3f6056SSatoshi Sahara saveWikiText($page, '', '6th save', false); 159023953f0SAndreas Gohr clearstatcache(false, $file); 160023953f0SAndreas Gohr $this->assertFileNotExists($file); 161*3d3f6056SSatoshi Sahara $expect = array( 162*3d3f6056SSatoshi Sahara //'date' => $lastmod, // ignore from lastRev assertion, but confirm attic file existence 163*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_DELETE, 164*3d3f6056SSatoshi Sahara 'sum' => '6th save', 165*3d3f6056SSatoshi Sahara 'sizechange' => -11, 166*3d3f6056SSatoshi Sahara ); 167023953f0SAndreas Gohr 168023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 169023953f0SAndreas Gohr $revisions = $pagelog->getRevisions(-1, 200); 1707866d571SSatoshi Sahara $this->assertCount(5, $revisions); 171*3d3f6056SSatoshi Sahara // last revision 172*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 173*3d3f6056SSatoshi Sahara $expect += $lastRevInfo; 174*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 175*3d3f6056SSatoshi Sahara // current revision 176*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 177*3d3f6056SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 178*3d3f6056SSatoshi Sahara // attic 179*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date'], 'file missing in attic')); 180023953f0SAndreas Gohr 181aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 182023953f0SAndreas Gohr 183*3d3f6056SSatoshi Sahara // 1.7 restore 184023953f0SAndreas Gohr $REV = $lastmod; 185*3d3f6056SSatoshi Sahara saveWikiText($page, 'teststring4', '7th save', true); 186023953f0SAndreas Gohr clearstatcache(false, $file); 187023953f0SAndreas Gohr $this->assertFileExists($file); 188023953f0SAndreas Gohr $newmod = filemtime($file); 189023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 190023953f0SAndreas Gohr $lastmod = $newmod; 191*3d3f6056SSatoshi Sahara $expect = array( 192*3d3f6056SSatoshi Sahara 'date' => $lastmod, 193*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_REVERT, 194*3d3f6056SSatoshi Sahara 'sum' => '7th save', 195*3d3f6056SSatoshi Sahara 'sizechange' => 11, 196*3d3f6056SSatoshi Sahara ); 197023953f0SAndreas Gohr 198023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 199023953f0SAndreas Gohr $revisions = $pagelog->getRevisions(-1, 200); 2007866d571SSatoshi Sahara $this->assertCount(6, $revisions); 201*3d3f6056SSatoshi Sahara // last revision 202*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 203*3d3f6056SSatoshi Sahara $expect += $lastRevInfo; 204*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 205*3d3f6056SSatoshi Sahara // current revision 206*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 207*3d3f6056SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 208*3d3f6056SSatoshi Sahara // attic 209*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date']), 'file missing in attic'); 210*3d3f6056SSatoshi Sahara $files = glob(dirname(wikiFN($page, $lastRevInfo['date'])).'/'.$page.'.*'); 211*3d3f6056SSatoshi Sahara $this->assertCount(6, $files, 'detectExternalEdit() should not add too often old revs'); 212023953f0SAndreas Gohr $REV = ''; 213023953f0SAndreas Gohr 214aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 215023953f0SAndreas Gohr 216*3d3f6056SSatoshi Sahara // 1.8 external edit 217*3d3f6056SSatoshi Sahara file_put_contents($file, 'teststring5 external edit'); 218023953f0SAndreas Gohr clearstatcache(false, $file); 219023953f0SAndreas Gohr $newmod = filemtime($file); 220023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 221023953f0SAndreas Gohr $lastmod = $newmod; 222*3d3f6056SSatoshi Sahara $expectExternal = array( 223*3d3f6056SSatoshi Sahara 'date' => $lastmod, 224*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 225*3d3f6056SSatoshi Sahara 'sum' => 'external edit', 226*3d3f6056SSatoshi Sahara 'sizechange' => 14, 227*3d3f6056SSatoshi Sahara ); 228*3d3f6056SSatoshi Sahara 229*3d3f6056SSatoshi Sahara $pagelog = new PageChangeLog($page); 230*3d3f6056SSatoshi Sahara $revisions = $pagelog->getRevisions(-1, 200); 231*3d3f6056SSatoshi Sahara $this->assertCount(6, $revisions); // external edit is not yet in changelog 232*3d3f6056SSatoshi Sahara // last revision 233*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 234*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 235*3d3f6056SSatoshi Sahara // current revision 236*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 237*3d3f6056SSatoshi Sahara $this->assertArrayHasKey('timestamp', $currentRevInfo, 'should be external revision'); 238*3d3f6056SSatoshi Sahara $expectExternal += $currentRevInfo; 239*3d3f6056SSatoshi Sahara $this->assertEquals($expectExternal, $currentRevInfo); 240*3d3f6056SSatoshi Sahara // attic 241*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date']), 'file missing in attic'); 242*3d3f6056SSatoshi Sahara $this->assertFileNotExists(wikiFN($page, $currentRevInfo['date']),'page does not yet exist in attic'); 243*3d3f6056SSatoshi Sahara 244*3d3f6056SSatoshi Sahara $this->waitForTick(); // wait for new revision ID 245*3d3f6056SSatoshi Sahara 246*3d3f6056SSatoshi Sahara // 1.9 save on top of external edit 247*3d3f6056SSatoshi Sahara saveWikiText($page, 'teststring6', '8th save', false); 248*3d3f6056SSatoshi Sahara clearstatcache(false, $file); 249*3d3f6056SSatoshi Sahara $newmod = filemtime($file); 250*3d3f6056SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 251*3d3f6056SSatoshi Sahara $lastmod = $newmod; 252*3d3f6056SSatoshi Sahara $expect = array( 253*3d3f6056SSatoshi Sahara 'date' => $lastmod, 254*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 255*3d3f6056SSatoshi Sahara 'sum' => '8th save', 256*3d3f6056SSatoshi Sahara 'sizechange' => -14, 257*3d3f6056SSatoshi Sahara ); 258023953f0SAndreas Gohr 259023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 260023953f0SAndreas Gohr $revisions = $pagelog->getRevisions(-1, 200); 2617866d571SSatoshi Sahara $this->assertCount(8, $revisions); // two more revisions now! 262*3d3f6056SSatoshi Sahara // last revision 263*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 264*3d3f6056SSatoshi Sahara $expect += $lastRevInfo; 265*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 266*3d3f6056SSatoshi Sahara // current revision 267*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 268*3d3f6056SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 269*3d3f6056SSatoshi Sahara // attic 270*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date'], 'file missing in attic')); 271*3d3f6056SSatoshi Sahara $files = glob(dirname(wikiFN($page, $lastRevInfo['date'])).'/'.$page.'.*'); 272*3d3f6056SSatoshi Sahara $this->assertCount(8, $files, 'detectExternalEdit() should not add too often old revs'); 273023953f0SAndreas Gohr 274023953f0SAndreas Gohr } 2756072486dSGerrit Uitslag 2766072486dSGerrit Uitslag /** 2776072486dSGerrit Uitslag * Execute a whole bunch of saves on the same page and check the results 278*3d3f6056SSatoshi Sahara * using $this->handle_write() in event IO_WIKIPAGE_WRITE 279*3d3f6056SSatoshi Sahara * TEST 2 - create a page externally, while external edit in Test 1 280*3d3f6056SSatoshi Sahara * 2.1 create a page 281*3d3f6056SSatoshi Sahara * 2.2 delete 282*3d3f6056SSatoshi Sahara * 2.3 externally create the page 283*3d3f6056SSatoshi Sahara * 2.4 save on top of external edit 2846072486dSGerrit Uitslag */ 285*3d3f6056SSatoshi Sahara function test_savesequence2() { 286ea466a98SMichael Hamann // add an additional delay when saving files to make sure 287ea466a98SMichael Hamann // nobody relies on the saving happening in the same second 288e1d9dcc8SAndreas Gohr /** @var $EVENT_HANDLER \dokuwiki\Extension\EventHandler */ 289ea466a98SMichael Hamann global $EVENT_HANDLER; 290ea466a98SMichael Hamann $EVENT_HANDLER->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'handle_write'); 291ea466a98SMichael Hamann 2926072486dSGerrit Uitslag $page = 'page2'; 2936072486dSGerrit Uitslag $file = wikiFN($page); 2946072486dSGerrit Uitslag 295*3d3f6056SSatoshi Sahara // 2.1 create a page 2966072486dSGerrit Uitslag $this->assertFileNotExists($file); 297*3d3f6056SSatoshi Sahara saveWikiText($page, 'teststring', 'Test 2, 1st save', false); 2986072486dSGerrit Uitslag $this->assertFileExists($file); 2996072486dSGerrit Uitslag $lastmod = filemtime($file); 300*3d3f6056SSatoshi Sahara $expect = array( 301*3d3f6056SSatoshi Sahara 'date' => $lastmod, 302*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 303*3d3f6056SSatoshi Sahara 'sum' => 'Test 2, 1st save', 304*3d3f6056SSatoshi Sahara 'sizechange' => 10, // = strlen('teststring') 305*3d3f6056SSatoshi Sahara ); 3066072486dSGerrit Uitslag 3076072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 3086072486dSGerrit Uitslag $revisions = $pagelog->getRevisions(-1, 200); 3097866d571SSatoshi Sahara $this->assertCount(1, $revisions); 310*3d3f6056SSatoshi Sahara // last revision 311*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 312*3d3f6056SSatoshi Sahara $expect += $lastRevInfo; 313*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 314*3d3f6056SSatoshi Sahara // current revision 315*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 316*3d3f6056SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 317*3d3f6056SSatoshi Sahara // attic 318*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date'], 'file missing in attic')); 3196072486dSGerrit Uitslag 320aaf4f55eSAndreas Gohr $this->waitForTick(true); // wait for new revision ID 3216072486dSGerrit Uitslag 322*3d3f6056SSatoshi Sahara // 2.2 delete 323*3d3f6056SSatoshi Sahara saveWikiText($page, '', 'Test 2, 2nd save', false); 3246072486dSGerrit Uitslag clearstatcache(false, $file); 3256072486dSGerrit Uitslag $this->assertFileNotExists($file); 326*3d3f6056SSatoshi Sahara $expect = array( 327*3d3f6056SSatoshi Sahara //'date' => $lastmod, // ignore from lastRev assertion, but confirm attic file existence 328*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_DELETE, 329*3d3f6056SSatoshi Sahara 'sum' => 'Test 2, 2nd save', 330*3d3f6056SSatoshi Sahara 'sizechange' => -10, 331*3d3f6056SSatoshi Sahara ); 3326072486dSGerrit Uitslag 3336072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 3346072486dSGerrit Uitslag $revisions = $pagelog->getRevisions(-1, 200); 3357866d571SSatoshi Sahara $this->assertCount(2, $revisions); 336*3d3f6056SSatoshi Sahara // last revision 337*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 338*3d3f6056SSatoshi Sahara $expect += $lastRevInfo; 339*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 340*3d3f6056SSatoshi Sahara // current revision 341*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 342*3d3f6056SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 343*3d3f6056SSatoshi Sahara // attic 344*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date'], 'file missing in attic')); 3456072486dSGerrit Uitslag 346aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 3476072486dSGerrit Uitslag 348*3d3f6056SSatoshi Sahara // 2.3 externally create the page 3496072486dSGerrit Uitslag file_put_contents($file, 'teststring5'); 350*3d3f6056SSatoshi Sahara clearstatcache(false, $file); 351*3d3f6056SSatoshi Sahara $lastmod = filemtime($file); 352*3d3f6056SSatoshi Sahara $expectExternal = array( 353*3d3f6056SSatoshi Sahara 'date' => $lastmod, 354*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 355*3d3f6056SSatoshi Sahara 'sum' => 'created - external edit', 356*3d3f6056SSatoshi Sahara 'sizechange' => 11, 357*3d3f6056SSatoshi Sahara ); 358*3d3f6056SSatoshi Sahara 359*3d3f6056SSatoshi Sahara $pagelog = new PageChangeLog($page); 360*3d3f6056SSatoshi Sahara $revisions = $pagelog->getRevisions(-1, 200); 361*3d3f6056SSatoshi Sahara $this->assertCount(2, $revisions); // external edit is not yet in changelog 362*3d3f6056SSatoshi Sahara // last revision 363*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 364*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 365*3d3f6056SSatoshi Sahara // current revision 366*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 367*3d3f6056SSatoshi Sahara $this->assertArrayHasKey('timestamp', $currentRevInfo, 'should be external revision'); 368*3d3f6056SSatoshi Sahara $expectExternal += $currentRevInfo; 369*3d3f6056SSatoshi Sahara $this->assertEquals($expectExternal, $currentRevInfo); 370*3d3f6056SSatoshi Sahara // attic 371*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date']), 'file missing in attic'); 372*3d3f6056SSatoshi Sahara $this->assertFileNotExists(wikiFN($page, $currentRevInfo['date']),'page does not yet exist in attic'); 3736072486dSGerrit Uitslag 374aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 3756072486dSGerrit Uitslag 376*3d3f6056SSatoshi Sahara // 2.4 save on top of external edit 377*3d3f6056SSatoshi Sahara saveWikiText($page, 'teststring6', 'Test 2, 3rd save', false); 3786072486dSGerrit Uitslag clearstatcache(false, $file); 379*3d3f6056SSatoshi Sahara $newmod = filemtime($file); 380*3d3f6056SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 381*3d3f6056SSatoshi Sahara $lastmod = $newmod; 382*3d3f6056SSatoshi Sahara $expect = array( 383*3d3f6056SSatoshi Sahara 'date' => $lastmod, 384*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 385*3d3f6056SSatoshi Sahara 'sum' => 'Test 2, 3rd save', 386*3d3f6056SSatoshi Sahara 'sizechange' => 0, 387*3d3f6056SSatoshi Sahara ); 3886072486dSGerrit Uitslag 3896072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 3906072486dSGerrit Uitslag $revisions = $pagelog->getRevisions(-1, 200); 3917866d571SSatoshi Sahara $this->assertCount(4, $revisions); // two more revisions now! 392*3d3f6056SSatoshi Sahara // last revision 393*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 394*3d3f6056SSatoshi Sahara $expect += $lastRevInfo; 395*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 396*3d3f6056SSatoshi Sahara // current revision 397*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 398*3d3f6056SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 399*3d3f6056SSatoshi Sahara // attic 400*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date'], 'file missing in attic')); 401*3d3f6056SSatoshi Sahara $files = glob(dirname(wikiFN($page, $lastRevInfo['date'])).'/'.$page.'.*'); 402*3d3f6056SSatoshi Sahara $this->assertCount(4, $files, 'detectExternalEdit() should not add too often old revs'); 4036072486dSGerrit Uitslag 4046072486dSGerrit Uitslag } 4056072486dSGerrit Uitslag 4066072486dSGerrit Uitslag /** 4076072486dSGerrit Uitslag * Execute a whole bunch of saves on the same page and check the results 408*3d3f6056SSatoshi Sahara * TEST 3 - typical page life of bundled page such as wiki/syntax 409*3d3f6056SSatoshi Sahara * 3.1 externally create a page 410*3d3f6056SSatoshi Sahara * 3.2 external edit 411*3d3f6056SSatoshi Sahara * 3.3 save on top of external edit 412*3d3f6056SSatoshi Sahara * 3.4 externally delete the page 4136072486dSGerrit Uitslag */ 414*3d3f6056SSatoshi Sahara function test_savesequence3() { 4156072486dSGerrit Uitslag $page = 'page3'; 4166072486dSGerrit Uitslag $file = wikiFN($page); 4176072486dSGerrit Uitslag 418*3d3f6056SSatoshi Sahara // 3.1 externally create a page 4196072486dSGerrit Uitslag $this->assertFileNotExists($file); 4206072486dSGerrit Uitslag file_put_contents($file, 'teststring'); 421*3d3f6056SSatoshi Sahara clearstatcache(false, $file); 422*3d3f6056SSatoshi Sahara $lastmod = filemtime($file); 423*3d3f6056SSatoshi Sahara $expectExternal = array( 424*3d3f6056SSatoshi Sahara 'date' => $lastmod, 425*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 426*3d3f6056SSatoshi Sahara 'sum' => 'created - external edit', 427*3d3f6056SSatoshi Sahara 'sizechange' => 10, 428*3d3f6056SSatoshi Sahara ); 429*3d3f6056SSatoshi Sahara 430*3d3f6056SSatoshi Sahara $pagelog = new PageChangeLog($page); 431*3d3f6056SSatoshi Sahara $revisions = $pagelog->getRevisions(-1, 200); 432*3d3f6056SSatoshi Sahara $this->assertCount(0, $revisions); // external edit is not yet in changelog 433*3d3f6056SSatoshi Sahara // last revision 434*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 435*3d3f6056SSatoshi Sahara $this->assertFalse($lastRevInfo); 436*3d3f6056SSatoshi Sahara // current revision 437*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 438*3d3f6056SSatoshi Sahara $this->assertArrayHasKey('timestamp', $currentRevInfo, 'should be external revision'); 439*3d3f6056SSatoshi Sahara $expectExternal += $currentRevInfo; 440*3d3f6056SSatoshi Sahara $this->assertEquals($expectExternal, $currentRevInfo); 441*3d3f6056SSatoshi Sahara // attic 442*3d3f6056SSatoshi Sahara $this->assertFileNotExists(wikiFN($page, $currentRevInfo['date']),'page does not yet exist in attic'); 4436072486dSGerrit Uitslag 444aaf4f55eSAndreas Gohr $this->waitForTick(true); // wait for new revision ID 4456072486dSGerrit Uitslag 446*3d3f6056SSatoshi Sahara // 3.2 external edit 447*3d3f6056SSatoshi Sahara file_put_contents($file, 'teststring external edit'); 4486072486dSGerrit Uitslag clearstatcache(false, $file); 449*3d3f6056SSatoshi Sahara $newmod = filemtime($file); 450*3d3f6056SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 451*3d3f6056SSatoshi Sahara $lastmod = $newmod; 452*3d3f6056SSatoshi Sahara $expectExternal = array( 453*3d3f6056SSatoshi Sahara 'date' => $lastmod, 454*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 455*3d3f6056SSatoshi Sahara 'sum' => 'created - external edit', 456*3d3f6056SSatoshi Sahara 'sizechange' => 24, 457*3d3f6056SSatoshi Sahara ); 458*3d3f6056SSatoshi Sahara 459*3d3f6056SSatoshi Sahara $pagelog = new PageChangeLog($page); 460*3d3f6056SSatoshi Sahara $revisions = $pagelog->getRevisions(-1, 200); 461*3d3f6056SSatoshi Sahara $this->assertCount(0, $revisions); // external edit is not yet in changelog 462*3d3f6056SSatoshi Sahara // last revision 463*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 464*3d3f6056SSatoshi Sahara $this->assertFalse($lastRevInfo); 465*3d3f6056SSatoshi Sahara // current revision 466*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 467*3d3f6056SSatoshi Sahara $this->assertArrayHasKey('timestamp', $currentRevInfo, 'should be external revision'); 468*3d3f6056SSatoshi Sahara $expectExternal += $currentRevInfo; 469*3d3f6056SSatoshi Sahara $this->assertEquals($expectExternal, $currentRevInfo); 470*3d3f6056SSatoshi Sahara // attic 471*3d3f6056SSatoshi Sahara $this->assertFileNotExists(wikiFN($page, $currentRevInfo['date']),'page does not yet exist in attic'); 472*3d3f6056SSatoshi Sahara 473*3d3f6056SSatoshi Sahara $this->waitForTick(true); // wait for new revision ID 474*3d3f6056SSatoshi Sahara 475*3d3f6056SSatoshi Sahara // 3.3 save on top of external edit 476*3d3f6056SSatoshi Sahara saveWikiText($page, 'teststring1', 'Test 3, first save', false); 477*3d3f6056SSatoshi Sahara clearstatcache(false, $file); 478*3d3f6056SSatoshi Sahara $newmod = filemtime($file); 479*3d3f6056SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 480*3d3f6056SSatoshi Sahara $lastmod = $newmod; 481*3d3f6056SSatoshi Sahara $expect = array( 482*3d3f6056SSatoshi Sahara 'date' => $lastmod, 483*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 484*3d3f6056SSatoshi Sahara 'sum' => 'Test 3, first save', 485*3d3f6056SSatoshi Sahara 'sizechange' => -13, 486*3d3f6056SSatoshi Sahara ); 4876072486dSGerrit Uitslag 4886072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 4896072486dSGerrit Uitslag $revisions = $pagelog->getRevisions(-1, 200); 4907866d571SSatoshi Sahara $this->assertCount(2, $revisions); // two more revisions now! 491*3d3f6056SSatoshi Sahara // last revision 492*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 493*3d3f6056SSatoshi Sahara $expect += $lastRevInfo; 494*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 495*3d3f6056SSatoshi Sahara // current revision 496*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 497*3d3f6056SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 498*3d3f6056SSatoshi Sahara // attic 499*3d3f6056SSatoshi Sahara $this->assertFileExists(wikiFN($page, $lastRevInfo['date'], 'file missing in attic')); 500*3d3f6056SSatoshi Sahara $files = glob(dirname(wikiFN($page, $lastRevInfo['date'])).'/'.$page.'.*'); 501*3d3f6056SSatoshi Sahara $this->assertCount(2, $files, 'detectExternalEdit() should not add too often old revs'); 5026072486dSGerrit Uitslag 503aaf4f55eSAndreas Gohr $this->waitForTick(true); // wait for new revision ID 5046072486dSGerrit Uitslag 505*3d3f6056SSatoshi Sahara // 3.4 externally delete the page 5066072486dSGerrit Uitslag unlink($file); 5076072486dSGerrit Uitslag clearstatcache(false, $file); 508*3d3f6056SSatoshi Sahara $expectExternal = array( 509*3d3f6056SSatoshi Sahara //'date' => $lastmod, 510*3d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_DELETE, 511*3d3f6056SSatoshi Sahara 'sum' => 'removed - external edit (Unknown date)', 512*3d3f6056SSatoshi Sahara 'sizechange' => -11, 513*3d3f6056SSatoshi Sahara ); 5146072486dSGerrit Uitslag 5156072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 5166072486dSGerrit Uitslag $revisions = $pagelog->getRevisions(-1, 200); 517*3d3f6056SSatoshi Sahara $this->assertCount(2, $revisions); // two more revisions now! 518*3d3f6056SSatoshi Sahara // last revision 519*3d3f6056SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 520*3d3f6056SSatoshi Sahara $this->assertEquals($expect, $lastRevInfo); 521*3d3f6056SSatoshi Sahara // current revision 522*3d3f6056SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 523*3d3f6056SSatoshi Sahara $this->assertArrayHasKey('timestamp', $currentRevInfo, 'should be external revision'); 524*3d3f6056SSatoshi Sahara $expectExternal += $currentRevInfo; 525*3d3f6056SSatoshi Sahara $this->assertEquals($expectExternal, $currentRevInfo); 526*3d3f6056SSatoshi Sahara // attic 527*3d3f6056SSatoshi Sahara $this->assertFileNotExists(wikiFN($page, $currentRevInfo['date']),'page does not yet exist in attic'); 5286072486dSGerrit Uitslag 5296072486dSGerrit Uitslag } 5306072486dSGerrit Uitslag 531023953f0SAndreas Gohr} 532