1023953f0SAndreas Gohr<?php 2023953f0SAndreas Gohr 30c3a5702SAndreas Gohruse dokuwiki\ChangeLog\PageChangeLog; 40c3a5702SAndreas Gohr 53d3f6056SSatoshi Sahara/** 63d3f6056SSatoshi Sahara * saveWikiText() stores files in pages/, attic/ and adds entries to changelog 73d3f6056SSatoshi Sahara */ 8023953f0SAndreas Gohrclass common_saveWikiText_test extends DokuWikiTest { 93d3f6056SSatoshi 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 /** 183c425c43SSatoshi Sahara * assertions against changelog entries and attic after saveWikiText() 193c425c43SSatoshi Sahara */ 203c425c43SSatoshi Sahara private function checkChangeLogAfterNormalSave( 213c425c43SSatoshi Sahara PageChangeLog $pagelog, 22*92fda7f4SSatoshi Sahara $expectedRevs, // @param int 23*92fda7f4SSatoshi Sahara &$expectedLastEntry // @param array, pass by reference 243c425c43SSatoshi Sahara ) { 253c425c43SSatoshi Sahara $revisions = $pagelog->getRevisions(-1, 200); 263c425c43SSatoshi Sahara $this->assertCount($expectedRevs, $revisions); 273c425c43SSatoshi Sahara $this->assertCount($expectedRevs, array_unique($revisions), 'date duplicated in changelog'); 283c425c43SSatoshi Sahara // last revision 293c425c43SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 303c425c43SSatoshi Sahara $expectedLastEntry += $lastRevInfo; 313c425c43SSatoshi Sahara $this->assertEquals($expectedLastEntry, $lastRevInfo); 323c425c43SSatoshi Sahara // current revision 333c425c43SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 343c425c43SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 353c425c43SSatoshi Sahara // attic 363c425c43SSatoshi Sahara $attic = wikiFN($lastRevInfo['id'], $lastRevInfo['date']); 373c425c43SSatoshi Sahara $this->assertFileExists($attic, 'file missing in attic'); 383c425c43SSatoshi Sahara $files = count(glob(dirname($attic).'/'.noNS($lastRevInfo['id']).'.*')); 393c425c43SSatoshi Sahara $this->assertLessThanOrEqual($expectedRevs, $files, 'detectExternalEdit() should not add too often old revs'); 403c425c43SSatoshi Sahara } 413c425c43SSatoshi Sahara 423c425c43SSatoshi Sahara /** 433c425c43SSatoshi Sahara * assertions against changelog entries and attic after external edit, create or deletion of page 443c425c43SSatoshi Sahara */ 453c425c43SSatoshi Sahara private function checkChangeLogAfterExternalEdit( 463c425c43SSatoshi Sahara PageChangeLog $pagelog, 47*92fda7f4SSatoshi Sahara $expectedRevs, // @param int 48*92fda7f4SSatoshi Sahara $expectedLastEntry, // @param array 49*92fda7f4SSatoshi Sahara &$expectedCurrentEntry // @param array, pass by reference 503c425c43SSatoshi Sahara ) { 513c425c43SSatoshi Sahara $revisions = $pagelog->getRevisions(-1, 200); 523c425c43SSatoshi Sahara $this->assertCount($expectedRevs, $revisions); 533c425c43SSatoshi Sahara $this->assertCount($expectedRevs, array_unique($revisions), 'date duplicated in changelog'); 543c425c43SSatoshi Sahara // last revision 553c425c43SSatoshi Sahara if ($expectedRevs > 0) { 563c425c43SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 573c425c43SSatoshi Sahara $expectedLastEntry += $lastRevInfo; 583c425c43SSatoshi Sahara $this->assertEquals($expectedLastEntry, $lastRevInfo); 593c425c43SSatoshi Sahara } else { 603c425c43SSatoshi Sahara $this->assertFalse($pagelog->lastRevision(), 'changelog file does not yet exist'); 613c425c43SSatoshi Sahara } 623c425c43SSatoshi Sahara // current revision 633c425c43SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 643c425c43SSatoshi Sahara $this->assertArrayHasKey('timestamp', $currentRevInfo, 'should be external revision'); 653c425c43SSatoshi Sahara $expectedCurrentEntry += $currentRevInfo; 663c425c43SSatoshi Sahara if ($expectedRevs > 0) { 673c425c43SSatoshi Sahara $this->assertEquals($expectedCurrentEntry, $currentRevInfo); 683c425c43SSatoshi Sahara 693c425c43SSatoshi Sahara } 703c425c43SSatoshi Sahara // attic 713c425c43SSatoshi Sahara $attic = wikiFN($currentRevInfo['id'], $currentRevInfo['date']); 723c425c43SSatoshi Sahara $this->assertFileNotExists($attic, 'page does not yet exist in attic'); 733c425c43SSatoshi Sahara } 743c425c43SSatoshi Sahara 753c425c43SSatoshi Sahara 763c425c43SSatoshi Sahara /** 77023953f0SAndreas Gohr * Execute a whole bunch of saves on the same page and check the results 783d3f6056SSatoshi Sahara * TEST 1 793d3f6056SSatoshi Sahara * 1.1 create a page 803d3f6056SSatoshi Sahara * 1.2 save with same content should be ignored 813d3f6056SSatoshi Sahara * 1.3 update the page with new text 823c425c43SSatoshi Sahara * 1.4 add a minor edit (unauthenticated, minor not allowable) 833d3f6056SSatoshi Sahara * 1.5 add a minor edit (authenticated) 843d3f6056SSatoshi Sahara * 1.6 delete 853d3f6056SSatoshi Sahara * 1.7 restore 863d3f6056SSatoshi Sahara * 1.8 external edit 873c425c43SSatoshi Sahara * 1.9 edit and save on top of external edit 88023953f0SAndreas Gohr */ 893d3f6056SSatoshi Sahara function test_savesequence1() { 90023953f0SAndreas Gohr global $REV; 91023953f0SAndreas Gohr 92023953f0SAndreas Gohr $page = 'page'; 93023953f0SAndreas Gohr $file = wikiFN($page); 943c425c43SSatoshi Sahara $this->assertFileNotExists($file); 95023953f0SAndreas Gohr 963d3f6056SSatoshi Sahara // 1.1 create a page 973d3f6056SSatoshi Sahara saveWikiText($page, 'teststring', '1st save', false); 98*92fda7f4SSatoshi Sahara clearstatcache(false, $file); 99023953f0SAndreas Gohr $this->assertFileExists($file); 100023953f0SAndreas Gohr $lastmod = filemtime($file); 1013c425c43SSatoshi Sahara $expectedRevs = 1; 1023d3f6056SSatoshi Sahara $expect = array( 1033d3f6056SSatoshi Sahara 'date' => $lastmod, 1043d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 1053d3f6056SSatoshi Sahara 'sum' => '1st save', 1063d3f6056SSatoshi Sahara 'sizechange' => 10, // = strlen('teststring') 1073d3f6056SSatoshi Sahara ); 108023953f0SAndreas Gohr 109023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 1103c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 111023953f0SAndreas Gohr 112aaf4f55eSAndreas Gohr $this->waitForTick(true); // wait for new revision ID 113023953f0SAndreas Gohr 1143d3f6056SSatoshi Sahara // 1.2 save with same content should be ignored 1153d3f6056SSatoshi Sahara saveWikiText($page, 'teststring', '2nd save', false); 116023953f0SAndreas Gohr clearstatcache(false, $file); 117023953f0SAndreas Gohr $this->assertEquals($lastmod, filemtime($file)); 118023953f0SAndreas Gohr 119023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 120023953f0SAndreas Gohr $revisions = $pagelog->getRevisions(-1, 200); 1217866d571SSatoshi Sahara $this->assertCount(1, $revisions); 122023953f0SAndreas Gohr 1233d3f6056SSatoshi Sahara // 1.3 update the page with new text 1243d3f6056SSatoshi Sahara saveWikiText($page, 'teststring2long', '3rd save', false); 125023953f0SAndreas Gohr clearstatcache(false, $file); 126023953f0SAndreas Gohr $newmod = filemtime($file); 127023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 128023953f0SAndreas Gohr $lastmod = $newmod; 1293c425c43SSatoshi Sahara $expectedRevs = 2; 1303d3f6056SSatoshi Sahara $expect = array( 1313d3f6056SSatoshi Sahara 'date' => $lastmod, 1323d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 1333d3f6056SSatoshi Sahara 'sum' => '3rd save', 1343d3f6056SSatoshi Sahara 'sizechange' => 5, 1353d3f6056SSatoshi Sahara ); 136023953f0SAndreas Gohr 137023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 1383c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 139023953f0SAndreas Gohr 140aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 141023953f0SAndreas Gohr 1423c425c43SSatoshi Sahara // 1.4 add a minor edit (unauthenticated, minor not allowable) 1433d3f6056SSatoshi Sahara saveWikiText($page, 'teststring3long', '4th save', true); 144023953f0SAndreas Gohr clearstatcache(false, $file); 145023953f0SAndreas Gohr $newmod = filemtime($file); 146023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 147023953f0SAndreas Gohr $lastmod = $newmod; 1483c425c43SSatoshi Sahara $expectedRevs = 3; 1493d3f6056SSatoshi Sahara $expect = array( 1503d3f6056SSatoshi Sahara 'date' => $lastmod, 1513d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 1523d3f6056SSatoshi Sahara 'sum' => '4th save', 1533d3f6056SSatoshi Sahara 'sizechange' => 0, 1543d3f6056SSatoshi Sahara ); 155023953f0SAndreas Gohr 156023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 1573c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 158023953f0SAndreas Gohr 159aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 160023953f0SAndreas Gohr 1613d3f6056SSatoshi Sahara // 1.5 add a minor edit (authenticated) 162023953f0SAndreas Gohr $_SERVER['REMOTE_USER'] = 'user'; 1633d3f6056SSatoshi Sahara saveWikiText($page, 'teststring4', '5th save', true); 164023953f0SAndreas Gohr clearstatcache(false, $file); 165023953f0SAndreas Gohr $newmod = filemtime($file); 166023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 167023953f0SAndreas Gohr $lastmod = $newmod; 1683c425c43SSatoshi Sahara $expectedRevs = 4; 1693d3f6056SSatoshi Sahara $expect = array( 1703d3f6056SSatoshi Sahara 'date' => $lastmod, 1713d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_MINOR_EDIT, 1723d3f6056SSatoshi Sahara 'sum' => '5th save', 1733d3f6056SSatoshi Sahara 'sizechange' => -4, 1743d3f6056SSatoshi Sahara ); 175023953f0SAndreas Gohr 176023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 1773c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 178023953f0SAndreas Gohr 179aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 180023953f0SAndreas Gohr 1813d3f6056SSatoshi Sahara // 1.6 delete 1823d3f6056SSatoshi Sahara saveWikiText($page, '', '6th save', false); 183023953f0SAndreas Gohr clearstatcache(false, $file); 184023953f0SAndreas Gohr $this->assertFileNotExists($file); 1853c425c43SSatoshi Sahara $expectedRevs = 5; 1863d3f6056SSatoshi Sahara $expect = array( 1873d3f6056SSatoshi Sahara //'date' => $lastmod, // ignore from lastRev assertion, but confirm attic file existence 1883d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_DELETE, 1893d3f6056SSatoshi Sahara 'sum' => '6th save', 1903d3f6056SSatoshi Sahara 'sizechange' => -11, 1913d3f6056SSatoshi Sahara ); 192023953f0SAndreas Gohr 193023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 1943c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 195023953f0SAndreas Gohr 196aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 197023953f0SAndreas Gohr 1983d3f6056SSatoshi Sahara // 1.7 restore 199023953f0SAndreas Gohr $REV = $lastmod; 2003d3f6056SSatoshi Sahara saveWikiText($page, 'teststring4', '7th save', true); 201023953f0SAndreas Gohr clearstatcache(false, $file); 202023953f0SAndreas Gohr $this->assertFileExists($file); 203023953f0SAndreas Gohr $newmod = filemtime($file); 204023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 205023953f0SAndreas Gohr $lastmod = $newmod; 2063c425c43SSatoshi Sahara $expectedRevs = 6; 2073d3f6056SSatoshi Sahara $expect = array( 2083d3f6056SSatoshi Sahara 'date' => $lastmod, 2093d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_REVERT, 2103d3f6056SSatoshi Sahara 'sum' => '7th save', 2113d3f6056SSatoshi Sahara 'sizechange' => 11, 2123d3f6056SSatoshi Sahara ); 213023953f0SAndreas Gohr 214023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 2153c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 216023953f0SAndreas Gohr $REV = ''; 217023953f0SAndreas Gohr 218aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 219023953f0SAndreas Gohr 2203d3f6056SSatoshi Sahara // 1.8 external edit 2213d3f6056SSatoshi Sahara file_put_contents($file, 'teststring5 external edit'); 222023953f0SAndreas Gohr clearstatcache(false, $file); 223023953f0SAndreas Gohr $newmod = filemtime($file); 224023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 225023953f0SAndreas Gohr $lastmod = $newmod; 2263c425c43SSatoshi Sahara $expectedRevs = 6; // external edit is not yet in changelog 2273d3f6056SSatoshi Sahara $expectExternal = array( 2283d3f6056SSatoshi Sahara 'date' => $lastmod, 2293d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 2303d3f6056SSatoshi Sahara 'sum' => 'external edit', 2313d3f6056SSatoshi Sahara 'sizechange' => 14, 2323d3f6056SSatoshi Sahara ); 2333d3f6056SSatoshi Sahara 2343d3f6056SSatoshi Sahara $pagelog = new PageChangeLog($page); 2353c425c43SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 2363d3f6056SSatoshi Sahara 2373d3f6056SSatoshi Sahara $this->waitForTick(); // wait for new revision ID 2383d3f6056SSatoshi Sahara 2393d3f6056SSatoshi Sahara // 1.9 save on top of external edit 2403d3f6056SSatoshi Sahara saveWikiText($page, 'teststring6', '8th save', false); 2413d3f6056SSatoshi Sahara clearstatcache(false, $file); 2423d3f6056SSatoshi Sahara $newmod = filemtime($file); 2433d3f6056SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 2443d3f6056SSatoshi Sahara $lastmod = $newmod; 2453c425c43SSatoshi Sahara $expectedRevs = 8; 2463d3f6056SSatoshi Sahara $expect = array( 2473d3f6056SSatoshi Sahara 'date' => $lastmod, 2483d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 2493d3f6056SSatoshi Sahara 'sum' => '8th save', 2503d3f6056SSatoshi Sahara 'sizechange' => -14, 2513d3f6056SSatoshi Sahara ); 252023953f0SAndreas Gohr 253023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 2543c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 255023953f0SAndreas Gohr } 2566072486dSGerrit Uitslag 2576072486dSGerrit Uitslag /** 2586072486dSGerrit Uitslag * Execute a whole bunch of saves on the same page and check the results 2593d3f6056SSatoshi Sahara * using $this->handle_write() in event IO_WIKIPAGE_WRITE 2603c425c43SSatoshi Sahara * TEST 2 - create a page externally in 2.3, while external edit in Test 1.8 2613d3f6056SSatoshi Sahara * 2.1 create a page 2623d3f6056SSatoshi Sahara * 2.2 delete 2633d3f6056SSatoshi Sahara * 2.3 externally create the page 2643c425c43SSatoshi Sahara * 2.4 edit and save on top of external edit 2653c425c43SSatoshi Sahara * 2.5 external edit 2663c425c43SSatoshi Sahara * 2.6 edit and save on top of external edit, again 2676072486dSGerrit Uitslag */ 2683d3f6056SSatoshi Sahara function test_savesequence2() { 269ea466a98SMichael Hamann // add an additional delay when saving files to make sure 270ea466a98SMichael Hamann // nobody relies on the saving happening in the same second 271e1d9dcc8SAndreas Gohr /** @var $EVENT_HANDLER \dokuwiki\Extension\EventHandler */ 272ea466a98SMichael Hamann global $EVENT_HANDLER; 273ea466a98SMichael Hamann $EVENT_HANDLER->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'handle_write'); 274ea466a98SMichael Hamann 2756072486dSGerrit Uitslag $page = 'page2'; 2766072486dSGerrit Uitslag $file = wikiFN($page); 2773c425c43SSatoshi Sahara $this->assertFileNotExists($file); 2786072486dSGerrit Uitslag 2793d3f6056SSatoshi Sahara // 2.1 create a page 2803d3f6056SSatoshi Sahara saveWikiText($page, 'teststring', 'Test 2, 1st save', false); 281*92fda7f4SSatoshi Sahara clearstatcache(false, $file); 2826072486dSGerrit Uitslag $this->assertFileExists($file); 2836072486dSGerrit Uitslag $lastmod = filemtime($file); 2843c425c43SSatoshi Sahara $expectedRevs = 1; 2853d3f6056SSatoshi Sahara $expect = array( 2863d3f6056SSatoshi Sahara 'date' => $lastmod, 2873d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 2883d3f6056SSatoshi Sahara 'sum' => 'Test 2, 1st save', 2893d3f6056SSatoshi Sahara 'sizechange' => 10, // = strlen('teststring') 2903d3f6056SSatoshi Sahara ); 2916072486dSGerrit Uitslag 2926072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 2933c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 2946072486dSGerrit Uitslag 295aaf4f55eSAndreas Gohr $this->waitForTick(true); // wait for new revision ID 2966072486dSGerrit Uitslag 2973d3f6056SSatoshi Sahara // 2.2 delete 2983d3f6056SSatoshi Sahara saveWikiText($page, '', 'Test 2, 2nd save', false); 2996072486dSGerrit Uitslag clearstatcache(false, $file); 3006072486dSGerrit Uitslag $this->assertFileNotExists($file); 3013c425c43SSatoshi Sahara $expectedRevs = 2; 3023d3f6056SSatoshi Sahara $expect = array( 3033d3f6056SSatoshi Sahara //'date' => $lastmod, // ignore from lastRev assertion, but confirm attic file existence 3043d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_DELETE, 3053d3f6056SSatoshi Sahara 'sum' => 'Test 2, 2nd save', 3063d3f6056SSatoshi Sahara 'sizechange' => -10, 3073d3f6056SSatoshi Sahara ); 3086072486dSGerrit Uitslag 3096072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 3103c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 3116072486dSGerrit Uitslag 312aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 3136072486dSGerrit Uitslag 3143d3f6056SSatoshi Sahara // 2.3 externally create the page 3156072486dSGerrit Uitslag file_put_contents($file, 'teststring5'); 3163d3f6056SSatoshi Sahara clearstatcache(false, $file); 3173d3f6056SSatoshi Sahara $lastmod = filemtime($file); 3183c425c43SSatoshi Sahara $expectedRevs = 2; // external edit is not yet in changelog 3193d3f6056SSatoshi Sahara $expectExternal = array( 3203d3f6056SSatoshi Sahara 'date' => $lastmod, 3213d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 3223d3f6056SSatoshi Sahara 'sum' => 'created - external edit', 3233d3f6056SSatoshi Sahara 'sizechange' => 11, 3243d3f6056SSatoshi Sahara ); 3253d3f6056SSatoshi Sahara 3263d3f6056SSatoshi Sahara $pagelog = new PageChangeLog($page); 3273c425c43SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 3286072486dSGerrit Uitslag 329aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 3306072486dSGerrit Uitslag 3313d3f6056SSatoshi Sahara // 2.4 save on top of external edit 3323d3f6056SSatoshi Sahara saveWikiText($page, 'teststring6', 'Test 2, 3rd save', false); 3336072486dSGerrit Uitslag clearstatcache(false, $file); 3343d3f6056SSatoshi Sahara $newmod = filemtime($file); 3353d3f6056SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 3363d3f6056SSatoshi Sahara $lastmod = $newmod; 3373c425c43SSatoshi Sahara $expectedRevs = 4; // two more revisions now! 3383d3f6056SSatoshi Sahara $expect = array( 3393d3f6056SSatoshi Sahara 'date' => $lastmod, 3403d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 3413d3f6056SSatoshi Sahara 'sum' => 'Test 2, 3rd save', 3423d3f6056SSatoshi Sahara 'sizechange' => 0, 3433d3f6056SSatoshi Sahara ); 3446072486dSGerrit Uitslag 3456072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 3463c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 3476072486dSGerrit Uitslag 3483c425c43SSatoshi Sahara $this->waitForTick(); // wait for new revision ID 3493c425c43SSatoshi Sahara 3503c425c43SSatoshi Sahara // 2.5 external edit 3513c425c43SSatoshi Sahara file_put_contents($file, 'teststring7 external edit2'); 3523c425c43SSatoshi Sahara clearstatcache(false, $file); 3533c425c43SSatoshi Sahara $newmod = filemtime($file); 3543c425c43SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 3553c425c43SSatoshi Sahara $lastmod = $newmod; 3563c425c43SSatoshi Sahara $expectedRevs = 4; // external edit is not yet in changelog 3573c425c43SSatoshi Sahara $expectExternal = array( 3583c425c43SSatoshi Sahara 'date' => $lastmod, 3593c425c43SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 3603c425c43SSatoshi Sahara 'sum' => 'external edit', 3613c425c43SSatoshi Sahara 'sizechange' => 15, 3623c425c43SSatoshi Sahara ); 3633c425c43SSatoshi Sahara 3643c425c43SSatoshi Sahara $pagelog = new PageChangeLog($page); 3653c425c43SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 3663c425c43SSatoshi Sahara 3673c425c43SSatoshi Sahara $this->waitForTick(); // wait for new revision ID 3683c425c43SSatoshi Sahara 3693c425c43SSatoshi Sahara // 2.6 save on top of external edit, again 3703c425c43SSatoshi Sahara saveWikiText($page, 'teststring8', 'Test 2, 4th save', false); 3713c425c43SSatoshi Sahara clearstatcache(false, $file); 3723c425c43SSatoshi Sahara $newmod = filemtime($file); 3733c425c43SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 3743c425c43SSatoshi Sahara $lastmod = $newmod; 3753c425c43SSatoshi Sahara $expectedRevs = 6; // two more revisions now! 3763c425c43SSatoshi Sahara $expect = array( 3773c425c43SSatoshi Sahara 'date' => $lastmod, 3783c425c43SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 3793c425c43SSatoshi Sahara 'sum' => 'Test 2, 4th save', 3803c425c43SSatoshi Sahara 'sizechange' => -15, 3813c425c43SSatoshi Sahara ); 3823c425c43SSatoshi Sahara 3833c425c43SSatoshi Sahara $pagelog = new PageChangeLog($page); 3843c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 3856072486dSGerrit Uitslag } 3866072486dSGerrit Uitslag 3876072486dSGerrit Uitslag /** 3886072486dSGerrit Uitslag * Execute a whole bunch of saves on the same page and check the results 3893c425c43SSatoshi Sahara * TEST 3 - typical page life of bundled page such as wiki:syntax 3903d3f6056SSatoshi Sahara * 3.1 externally create a page 3913d3f6056SSatoshi Sahara * 3.2 external edit 3923c425c43SSatoshi Sahara * 3.3 edit and save on top of external edit 3933d3f6056SSatoshi Sahara * 3.4 externally delete the page 3946072486dSGerrit Uitslag */ 3953d3f6056SSatoshi Sahara function test_savesequence3() { 3966072486dSGerrit Uitslag $page = 'page3'; 3976072486dSGerrit Uitslag $file = wikiFN($page); 3986072486dSGerrit Uitslag 3993d3f6056SSatoshi Sahara // 3.1 externally create a page 4006072486dSGerrit Uitslag $this->assertFileNotExists($file); 4016072486dSGerrit Uitslag file_put_contents($file, 'teststring'); 4023d3f6056SSatoshi Sahara clearstatcache(false, $file); 4033d3f6056SSatoshi Sahara $lastmod = filemtime($file); 4043c425c43SSatoshi Sahara $expectedRevs = 0; // external edit is not yet in changelog 4053c425c43SSatoshi Sahara $expect = false; 4063d3f6056SSatoshi Sahara $expectExternal = array( 4073d3f6056SSatoshi Sahara 'date' => $lastmod, 4083d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 4093d3f6056SSatoshi Sahara 'sum' => 'created - external edit', 4103d3f6056SSatoshi Sahara 'sizechange' => 10, 4113d3f6056SSatoshi Sahara ); 4123d3f6056SSatoshi Sahara 4133d3f6056SSatoshi Sahara $pagelog = new PageChangeLog($page); 4143c425c43SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 4156072486dSGerrit Uitslag 416aaf4f55eSAndreas Gohr $this->waitForTick(true); // wait for new revision ID 4176072486dSGerrit Uitslag 4183c425c43SSatoshi Sahara // 3.2 external edit (repeated, still no changelog exists) 4193d3f6056SSatoshi Sahara file_put_contents($file, 'teststring external edit'); 4206072486dSGerrit Uitslag clearstatcache(false, $file); 4213d3f6056SSatoshi Sahara $newmod = filemtime($file); 4223d3f6056SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 4233d3f6056SSatoshi Sahara $lastmod = $newmod; 4243c425c43SSatoshi Sahara $expectedRevs = 0; // external edit is not yet in changelog 4253d3f6056SSatoshi Sahara $expectExternal = array( 4263d3f6056SSatoshi Sahara 'date' => $lastmod, 4273c425c43SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, // not DOKU_CHANGE_TYPE_EDIT 4283d3f6056SSatoshi Sahara 'sum' => 'created - external edit', 4293d3f6056SSatoshi Sahara 'sizechange' => 24, 4303d3f6056SSatoshi Sahara ); 4313d3f6056SSatoshi Sahara 4323d3f6056SSatoshi Sahara $pagelog = new PageChangeLog($page); 4333c425c43SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 4343d3f6056SSatoshi Sahara 4353d3f6056SSatoshi Sahara $this->waitForTick(true); // wait for new revision ID 4363d3f6056SSatoshi Sahara 4373d3f6056SSatoshi Sahara // 3.3 save on top of external edit 4383d3f6056SSatoshi Sahara saveWikiText($page, 'teststring1', 'Test 3, first save', false); 4393d3f6056SSatoshi Sahara clearstatcache(false, $file); 4403d3f6056SSatoshi Sahara $newmod = filemtime($file); 4413d3f6056SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 4423d3f6056SSatoshi Sahara $lastmod = $newmod; 4433c425c43SSatoshi Sahara $expectedRevs = 2; // two more revisions now! 4443d3f6056SSatoshi Sahara $expect = array( 4453d3f6056SSatoshi Sahara 'date' => $lastmod, 4463d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 4473d3f6056SSatoshi Sahara 'sum' => 'Test 3, first save', 4483d3f6056SSatoshi Sahara 'sizechange' => -13, 4493d3f6056SSatoshi Sahara ); 4506072486dSGerrit Uitslag 4516072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 4523c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 4533c425c43SSatoshi Sahara 4546072486dSGerrit Uitslag 455aaf4f55eSAndreas Gohr $this->waitForTick(true); // wait for new revision ID 4566072486dSGerrit Uitslag 4573d3f6056SSatoshi Sahara // 3.4 externally delete the page 4586072486dSGerrit Uitslag unlink($file); 4596072486dSGerrit Uitslag clearstatcache(false, $file); 4603c425c43SSatoshi Sahara $expectedRevs = 2; 4613d3f6056SSatoshi Sahara $expectExternal = array( 4623d3f6056SSatoshi Sahara //'date' => $lastmod, 4633d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_DELETE, 4643d3f6056SSatoshi Sahara 'sum' => 'removed - external edit (Unknown date)', 4653d3f6056SSatoshi Sahara 'sizechange' => -11, 4663d3f6056SSatoshi Sahara ); 4676072486dSGerrit Uitslag 4686072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 4693c425c43SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 4706072486dSGerrit Uitslag } 4716072486dSGerrit Uitslag 472*92fda7f4SSatoshi Sahara /** 473*92fda7f4SSatoshi Sahara * Execute a whole bunch of saves on the same page and check the results 474*92fda7f4SSatoshi Sahara * TEST 4 - typical page life of bundled page such as wiki:syntax 475*92fda7f4SSatoshi Sahara * 4.1 externally create a page 476*92fda7f4SSatoshi Sahara * 4.2 edit and save 477*92fda7f4SSatoshi Sahara * 4.3 externally edit as a result of a file which has older timestamp than last revision 478*92fda7f4SSatoshi Sahara */ 479*92fda7f4SSatoshi Sahara function test_savesequence4() { 480*92fda7f4SSatoshi Sahara $page = 'page4'; 481*92fda7f4SSatoshi Sahara $file = wikiFN($page); 482*92fda7f4SSatoshi Sahara 483*92fda7f4SSatoshi Sahara // 4.1 externally create a page 484*92fda7f4SSatoshi Sahara $this->assertFileNotExists($file); 485*92fda7f4SSatoshi Sahara file_put_contents($file, 'teststring'); 486*92fda7f4SSatoshi Sahara clearstatcache(false, $file); 487*92fda7f4SSatoshi Sahara $lastmod = filemtime($file); 488*92fda7f4SSatoshi Sahara $expectedRevs = 0; // external edit is not yet in changelog 489*92fda7f4SSatoshi Sahara $expect = false; 490*92fda7f4SSatoshi Sahara $expectExternal = array( 491*92fda7f4SSatoshi Sahara 'date' => $lastmod, 492*92fda7f4SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 493*92fda7f4SSatoshi Sahara 'sum' => 'created - external edit', 494*92fda7f4SSatoshi Sahara 'sizechange' => 10, 495*92fda7f4SSatoshi Sahara ); 496*92fda7f4SSatoshi Sahara 497*92fda7f4SSatoshi Sahara $pagelog = new PageChangeLog($page); 498*92fda7f4SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 499*92fda7f4SSatoshi Sahara 500*92fda7f4SSatoshi Sahara $this->waitForTick(true); // wait for new revision ID 501*92fda7f4SSatoshi Sahara 502*92fda7f4SSatoshi Sahara // 4.2 edit and save 503*92fda7f4SSatoshi Sahara saveWikiText($page, 'teststring1', 'Test 4, first save', false); 504*92fda7f4SSatoshi Sahara clearstatcache(false, $file); 505*92fda7f4SSatoshi Sahara $newmod = filemtime($file); 506*92fda7f4SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 507*92fda7f4SSatoshi Sahara $lastmod = $newmod; 508*92fda7f4SSatoshi Sahara $expectedRevs = 2; // two more revisions now! 509*92fda7f4SSatoshi Sahara $expect = array( 510*92fda7f4SSatoshi Sahara 'date' => $lastmod, 511*92fda7f4SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 512*92fda7f4SSatoshi Sahara 'sum' => 'Test 4, first save', 513*92fda7f4SSatoshi Sahara 'sizechange' => 1, 514*92fda7f4SSatoshi Sahara ); 515*92fda7f4SSatoshi Sahara 516*92fda7f4SSatoshi Sahara $pagelog = new PageChangeLog($page); 517*92fda7f4SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 518*92fda7f4SSatoshi Sahara 519*92fda7f4SSatoshi Sahara $this->waitForTick(true); // wait for new revision ID 520*92fda7f4SSatoshi Sahara 521*92fda7f4SSatoshi Sahara // 4.3 externally edit as a result of a file which has older timestamp than last revision 522*92fda7f4SSatoshi Sahara unlink($file); 523*92fda7f4SSatoshi Sahara file_put_contents($file, 'teststring fake 1 hout past'); 524*92fda7f4SSatoshi Sahara touch($file, filemtime($file) -3600); // change file modification time to 1 hour past 525*92fda7f4SSatoshi Sahara clearstatcache(); 526*92fda7f4SSatoshi Sahara $newmod = filemtime($file); 527*92fda7f4SSatoshi Sahara $this->assertLessThan($lastmod, $newmod); // file must be older than previous for this test 528*92fda7f4SSatoshi Sahara $expectedRevs = 2; // external edit is not yet in changelog 529*92fda7f4SSatoshi Sahara $expectExternal = array( 530*92fda7f4SSatoshi Sahara 'date' => $lastmod + 1, 531*92fda7f4SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 532*92fda7f4SSatoshi Sahara 'sum' => 'external edit (Unknown date)', 533*92fda7f4SSatoshi Sahara 'sizechange' => 16, 534*92fda7f4SSatoshi Sahara ); 535*92fda7f4SSatoshi Sahara 536*92fda7f4SSatoshi Sahara $pagelog = new PageChangeLog($page); 537*92fda7f4SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 538*92fda7f4SSatoshi Sahara } 539*92fda7f4SSatoshi Sahara 540023953f0SAndreas Gohr} 541