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 /** 18*3c425c43SSatoshi Sahara * assertions against changelog entries and attic after saveWikiText() 19*3c425c43SSatoshi Sahara */ 20*3c425c43SSatoshi Sahara private function checkChangeLogAfterNormalSave( 21*3c425c43SSatoshi Sahara PageChangeLog $pagelog, 22*3c425c43SSatoshi Sahara $expectedRevs, 23*3c425c43SSatoshi Sahara &$expectedLastEntry 24*3c425c43SSatoshi Sahara ) { 25*3c425c43SSatoshi Sahara $revisions = $pagelog->getRevisions(-1, 200); 26*3c425c43SSatoshi Sahara $this->assertCount($expectedRevs, $revisions); 27*3c425c43SSatoshi Sahara $this->assertCount($expectedRevs, array_unique($revisions), 'date duplicated in changelog'); 28*3c425c43SSatoshi Sahara // last revision 29*3c425c43SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 30*3c425c43SSatoshi Sahara $expectedLastEntry += $lastRevInfo; 31*3c425c43SSatoshi Sahara $this->assertEquals($expectedLastEntry, $lastRevInfo); 32*3c425c43SSatoshi Sahara // current revision 33*3c425c43SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 34*3c425c43SSatoshi Sahara $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical'); 35*3c425c43SSatoshi Sahara // attic 36*3c425c43SSatoshi Sahara $attic = wikiFN($lastRevInfo['id'], $lastRevInfo['date']); 37*3c425c43SSatoshi Sahara $this->assertFileExists($attic, 'file missing in attic'); 38*3c425c43SSatoshi Sahara $files = count(glob(dirname($attic).'/'.noNS($lastRevInfo['id']).'.*')); 39*3c425c43SSatoshi Sahara $this->assertLessThanOrEqual($expectedRevs, $files, 'detectExternalEdit() should not add too often old revs'); 40*3c425c43SSatoshi Sahara } 41*3c425c43SSatoshi Sahara 42*3c425c43SSatoshi Sahara /** 43*3c425c43SSatoshi Sahara * assertions against changelog entries and attic after external edit, create or deletion of page 44*3c425c43SSatoshi Sahara */ 45*3c425c43SSatoshi Sahara private function checkChangeLogAfterExternalEdit( 46*3c425c43SSatoshi Sahara PageChangeLog $pagelog, 47*3c425c43SSatoshi Sahara $expectedRevs, 48*3c425c43SSatoshi Sahara $expectedLastEntry, 49*3c425c43SSatoshi Sahara $expectedCurrentEntry 50*3c425c43SSatoshi Sahara ) { 51*3c425c43SSatoshi Sahara $revisions = $pagelog->getRevisions(-1, 200); 52*3c425c43SSatoshi Sahara $this->assertCount($expectedRevs, $revisions); 53*3c425c43SSatoshi Sahara $this->assertCount($expectedRevs, array_unique($revisions), 'date duplicated in changelog'); 54*3c425c43SSatoshi Sahara // last revision 55*3c425c43SSatoshi Sahara if ($expectedRevs > 0) { 56*3c425c43SSatoshi Sahara $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]); 57*3c425c43SSatoshi Sahara $expectedLastEntry += $lastRevInfo; 58*3c425c43SSatoshi Sahara $this->assertEquals($expectedLastEntry, $lastRevInfo); 59*3c425c43SSatoshi Sahara } else { 60*3c425c43SSatoshi Sahara $this->assertFalse($pagelog->lastRevision(), 'changelog file does not yet exist'); 61*3c425c43SSatoshi Sahara } 62*3c425c43SSatoshi Sahara // current revision 63*3c425c43SSatoshi Sahara $currentRevInfo = $pagelog->getCurrentRevisionInfo(); 64*3c425c43SSatoshi Sahara $this->assertArrayHasKey('timestamp', $currentRevInfo, 'should be external revision'); 65*3c425c43SSatoshi Sahara $expectedCurrentEntry += $currentRevInfo; 66*3c425c43SSatoshi Sahara if ($expectedRevs > 0) { 67*3c425c43SSatoshi Sahara $this->assertEquals($expectedCurrentEntry, $currentRevInfo); 68*3c425c43SSatoshi Sahara 69*3c425c43SSatoshi Sahara } 70*3c425c43SSatoshi Sahara // attic 71*3c425c43SSatoshi Sahara $attic = wikiFN($currentRevInfo['id'], $currentRevInfo['date']); 72*3c425c43SSatoshi Sahara $this->assertFileNotExists($attic, 'page does not yet exist in attic'); 73*3c425c43SSatoshi Sahara } 74*3c425c43SSatoshi Sahara 75*3c425c43SSatoshi Sahara 76*3c425c43SSatoshi 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 82*3c425c43SSatoshi 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 87*3c425c43SSatoshi 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); 94*3c425c43SSatoshi Sahara $this->assertFileNotExists($file); 95023953f0SAndreas Gohr 963d3f6056SSatoshi Sahara // 1.1 create a page 973d3f6056SSatoshi Sahara saveWikiText($page, 'teststring', '1st save', false); 98023953f0SAndreas Gohr $this->assertFileExists($file); 99023953f0SAndreas Gohr $lastmod = filemtime($file); 100*3c425c43SSatoshi Sahara $expectedRevs = 1; 1013d3f6056SSatoshi Sahara $expect = array( 1023d3f6056SSatoshi Sahara 'date' => $lastmod, 1033d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 1043d3f6056SSatoshi Sahara 'sum' => '1st save', 1053d3f6056SSatoshi Sahara 'sizechange' => 10, // = strlen('teststring') 1063d3f6056SSatoshi Sahara ); 107023953f0SAndreas Gohr 108023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 109*3c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 110023953f0SAndreas Gohr 111aaf4f55eSAndreas Gohr $this->waitForTick(true); // wait for new revision ID 112023953f0SAndreas Gohr 1133d3f6056SSatoshi Sahara // 1.2 save with same content should be ignored 1143d3f6056SSatoshi Sahara saveWikiText($page, 'teststring', '2nd save', false); 115023953f0SAndreas Gohr clearstatcache(false, $file); 116023953f0SAndreas Gohr $this->assertEquals($lastmod, filemtime($file)); 117023953f0SAndreas Gohr 118023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 119023953f0SAndreas Gohr $revisions = $pagelog->getRevisions(-1, 200); 1207866d571SSatoshi Sahara $this->assertCount(1, $revisions); 121023953f0SAndreas Gohr 1223d3f6056SSatoshi Sahara // 1.3 update the page with new text 1233d3f6056SSatoshi Sahara saveWikiText($page, 'teststring2long', '3rd save', false); 124023953f0SAndreas Gohr clearstatcache(false, $file); 125023953f0SAndreas Gohr $newmod = filemtime($file); 126023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 127023953f0SAndreas Gohr $lastmod = $newmod; 128*3c425c43SSatoshi Sahara $expectedRevs = 2; 1293d3f6056SSatoshi Sahara $expect = array( 1303d3f6056SSatoshi Sahara 'date' => $lastmod, 1313d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 1323d3f6056SSatoshi Sahara 'sum' => '3rd save', 1333d3f6056SSatoshi Sahara 'sizechange' => 5, 1343d3f6056SSatoshi Sahara ); 135023953f0SAndreas Gohr 136023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 137*3c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 138023953f0SAndreas Gohr 139aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 140023953f0SAndreas Gohr 141*3c425c43SSatoshi Sahara // 1.4 add a minor edit (unauthenticated, minor not allowable) 1423d3f6056SSatoshi Sahara saveWikiText($page, 'teststring3long', '4th save', true); 143023953f0SAndreas Gohr clearstatcache(false, $file); 144023953f0SAndreas Gohr $newmod = filemtime($file); 145023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 146023953f0SAndreas Gohr $lastmod = $newmod; 147*3c425c43SSatoshi Sahara $expectedRevs = 3; 1483d3f6056SSatoshi Sahara $expect = array( 1493d3f6056SSatoshi Sahara 'date' => $lastmod, 1503d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 1513d3f6056SSatoshi Sahara 'sum' => '4th save', 1523d3f6056SSatoshi Sahara 'sizechange' => 0, 1533d3f6056SSatoshi Sahara ); 154023953f0SAndreas Gohr 155023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 156*3c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 157023953f0SAndreas Gohr 158aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 159023953f0SAndreas Gohr 1603d3f6056SSatoshi Sahara // 1.5 add a minor edit (authenticated) 161023953f0SAndreas Gohr $_SERVER['REMOTE_USER'] = 'user'; 1623d3f6056SSatoshi Sahara saveWikiText($page, 'teststring4', '5th save', true); 163023953f0SAndreas Gohr clearstatcache(false, $file); 164023953f0SAndreas Gohr $newmod = filemtime($file); 165023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 166023953f0SAndreas Gohr $lastmod = $newmod; 167*3c425c43SSatoshi Sahara $expectedRevs = 4; 1683d3f6056SSatoshi Sahara $expect = array( 1693d3f6056SSatoshi Sahara 'date' => $lastmod, 1703d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_MINOR_EDIT, 1713d3f6056SSatoshi Sahara 'sum' => '5th save', 1723d3f6056SSatoshi Sahara 'sizechange' => -4, 1733d3f6056SSatoshi Sahara ); 174023953f0SAndreas Gohr 175023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 176*3c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 177023953f0SAndreas Gohr 178aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 179023953f0SAndreas Gohr 1803d3f6056SSatoshi Sahara // 1.6 delete 1813d3f6056SSatoshi Sahara saveWikiText($page, '', '6th save', false); 182023953f0SAndreas Gohr clearstatcache(false, $file); 183023953f0SAndreas Gohr $this->assertFileNotExists($file); 184*3c425c43SSatoshi Sahara $expectedRevs = 5; 1853d3f6056SSatoshi Sahara $expect = array( 1863d3f6056SSatoshi Sahara //'date' => $lastmod, // ignore from lastRev assertion, but confirm attic file existence 1873d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_DELETE, 1883d3f6056SSatoshi Sahara 'sum' => '6th save', 1893d3f6056SSatoshi Sahara 'sizechange' => -11, 1903d3f6056SSatoshi Sahara ); 191023953f0SAndreas Gohr 192023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 193*3c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 194023953f0SAndreas Gohr 195aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 196023953f0SAndreas Gohr 1973d3f6056SSatoshi Sahara // 1.7 restore 198023953f0SAndreas Gohr $REV = $lastmod; 1993d3f6056SSatoshi Sahara saveWikiText($page, 'teststring4', '7th save', true); 200023953f0SAndreas Gohr clearstatcache(false, $file); 201023953f0SAndreas Gohr $this->assertFileExists($file); 202023953f0SAndreas Gohr $newmod = filemtime($file); 203023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 204023953f0SAndreas Gohr $lastmod = $newmod; 205*3c425c43SSatoshi Sahara $expectedRevs = 6; 2063d3f6056SSatoshi Sahara $expect = array( 2073d3f6056SSatoshi Sahara 'date' => $lastmod, 2083d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_REVERT, 2093d3f6056SSatoshi Sahara 'sum' => '7th save', 2103d3f6056SSatoshi Sahara 'sizechange' => 11, 2113d3f6056SSatoshi Sahara ); 212023953f0SAndreas Gohr 213023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 214*3c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 215023953f0SAndreas Gohr $REV = ''; 216023953f0SAndreas Gohr 217aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 218023953f0SAndreas Gohr 2193d3f6056SSatoshi Sahara // 1.8 external edit 2203d3f6056SSatoshi Sahara file_put_contents($file, 'teststring5 external edit'); 221023953f0SAndreas Gohr clearstatcache(false, $file); 222023953f0SAndreas Gohr $newmod = filemtime($file); 223023953f0SAndreas Gohr $this->assertNotEquals($lastmod, $newmod); 224023953f0SAndreas Gohr $lastmod = $newmod; 225*3c425c43SSatoshi Sahara $expectedRevs = 6; // external edit is not yet in changelog 2263d3f6056SSatoshi Sahara $expectExternal = array( 2273d3f6056SSatoshi Sahara 'date' => $lastmod, 2283d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 2293d3f6056SSatoshi Sahara 'sum' => 'external edit', 2303d3f6056SSatoshi Sahara 'sizechange' => 14, 2313d3f6056SSatoshi Sahara ); 2323d3f6056SSatoshi Sahara 2333d3f6056SSatoshi Sahara $pagelog = new PageChangeLog($page); 234*3c425c43SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 2353d3f6056SSatoshi Sahara 2363d3f6056SSatoshi Sahara $this->waitForTick(); // wait for new revision ID 2373d3f6056SSatoshi Sahara 2383d3f6056SSatoshi Sahara // 1.9 save on top of external edit 2393d3f6056SSatoshi Sahara saveWikiText($page, 'teststring6', '8th save', false); 2403d3f6056SSatoshi Sahara clearstatcache(false, $file); 2413d3f6056SSatoshi Sahara $newmod = filemtime($file); 2423d3f6056SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 2433d3f6056SSatoshi Sahara $lastmod = $newmod; 244*3c425c43SSatoshi Sahara $expectedRevs = 8; 2453d3f6056SSatoshi Sahara $expect = array( 2463d3f6056SSatoshi Sahara 'date' => $lastmod, 2473d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 2483d3f6056SSatoshi Sahara 'sum' => '8th save', 2493d3f6056SSatoshi Sahara 'sizechange' => -14, 2503d3f6056SSatoshi Sahara ); 251023953f0SAndreas Gohr 252023953f0SAndreas Gohr $pagelog = new PageChangeLog($page); 253*3c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 254023953f0SAndreas Gohr } 2556072486dSGerrit Uitslag 2566072486dSGerrit Uitslag /** 2576072486dSGerrit Uitslag * Execute a whole bunch of saves on the same page and check the results 2583d3f6056SSatoshi Sahara * using $this->handle_write() in event IO_WIKIPAGE_WRITE 259*3c425c43SSatoshi Sahara * TEST 2 - create a page externally in 2.3, while external edit in Test 1.8 2603d3f6056SSatoshi Sahara * 2.1 create a page 2613d3f6056SSatoshi Sahara * 2.2 delete 2623d3f6056SSatoshi Sahara * 2.3 externally create the page 263*3c425c43SSatoshi Sahara * 2.4 edit and save on top of external edit 264*3c425c43SSatoshi Sahara * 2.5 external edit 265*3c425c43SSatoshi Sahara * 2.6 edit and save on top of external edit, again 2666072486dSGerrit Uitslag */ 2673d3f6056SSatoshi Sahara function test_savesequence2() { 268ea466a98SMichael Hamann // add an additional delay when saving files to make sure 269ea466a98SMichael Hamann // nobody relies on the saving happening in the same second 270e1d9dcc8SAndreas Gohr /** @var $EVENT_HANDLER \dokuwiki\Extension\EventHandler */ 271ea466a98SMichael Hamann global $EVENT_HANDLER; 272ea466a98SMichael Hamann $EVENT_HANDLER->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'handle_write'); 273ea466a98SMichael Hamann 2746072486dSGerrit Uitslag $page = 'page2'; 2756072486dSGerrit Uitslag $file = wikiFN($page); 276*3c425c43SSatoshi Sahara $this->assertFileNotExists($file); 2776072486dSGerrit Uitslag 2783d3f6056SSatoshi Sahara // 2.1 create a page 2793d3f6056SSatoshi Sahara saveWikiText($page, 'teststring', 'Test 2, 1st save', false); 2806072486dSGerrit Uitslag $this->assertFileExists($file); 2816072486dSGerrit Uitslag $lastmod = filemtime($file); 282*3c425c43SSatoshi Sahara $expectedRevs = 1; 2833d3f6056SSatoshi Sahara $expect = array( 2843d3f6056SSatoshi Sahara 'date' => $lastmod, 2853d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 2863d3f6056SSatoshi Sahara 'sum' => 'Test 2, 1st save', 2873d3f6056SSatoshi Sahara 'sizechange' => 10, // = strlen('teststring') 2883d3f6056SSatoshi Sahara ); 2896072486dSGerrit Uitslag 2906072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 291*3c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 2926072486dSGerrit Uitslag 293aaf4f55eSAndreas Gohr $this->waitForTick(true); // wait for new revision ID 2946072486dSGerrit Uitslag 2953d3f6056SSatoshi Sahara // 2.2 delete 2963d3f6056SSatoshi Sahara saveWikiText($page, '', 'Test 2, 2nd save', false); 2976072486dSGerrit Uitslag clearstatcache(false, $file); 2986072486dSGerrit Uitslag $this->assertFileNotExists($file); 299*3c425c43SSatoshi Sahara $expectedRevs = 2; 3003d3f6056SSatoshi Sahara $expect = array( 3013d3f6056SSatoshi Sahara //'date' => $lastmod, // ignore from lastRev assertion, but confirm attic file existence 3023d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_DELETE, 3033d3f6056SSatoshi Sahara 'sum' => 'Test 2, 2nd save', 3043d3f6056SSatoshi Sahara 'sizechange' => -10, 3053d3f6056SSatoshi Sahara ); 3066072486dSGerrit Uitslag 3076072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 308*3c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 3096072486dSGerrit Uitslag 310aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 3116072486dSGerrit Uitslag 3123d3f6056SSatoshi Sahara // 2.3 externally create the page 3136072486dSGerrit Uitslag file_put_contents($file, 'teststring5'); 3143d3f6056SSatoshi Sahara clearstatcache(false, $file); 3153d3f6056SSatoshi Sahara $lastmod = filemtime($file); 316*3c425c43SSatoshi Sahara $expectedRevs = 2; // external edit is not yet in changelog 3173d3f6056SSatoshi Sahara $expectExternal = array( 3183d3f6056SSatoshi Sahara 'date' => $lastmod, 3193d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 3203d3f6056SSatoshi Sahara 'sum' => 'created - external edit', 3213d3f6056SSatoshi Sahara 'sizechange' => 11, 3223d3f6056SSatoshi Sahara ); 3233d3f6056SSatoshi Sahara 3243d3f6056SSatoshi Sahara $pagelog = new PageChangeLog($page); 325*3c425c43SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 3266072486dSGerrit Uitslag 327aaf4f55eSAndreas Gohr $this->waitForTick(); // wait for new revision ID 3286072486dSGerrit Uitslag 3293d3f6056SSatoshi Sahara // 2.4 save on top of external edit 3303d3f6056SSatoshi Sahara saveWikiText($page, 'teststring6', 'Test 2, 3rd save', false); 3316072486dSGerrit Uitslag clearstatcache(false, $file); 3323d3f6056SSatoshi Sahara $newmod = filemtime($file); 3333d3f6056SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 3343d3f6056SSatoshi Sahara $lastmod = $newmod; 335*3c425c43SSatoshi Sahara $expectedRevs = 4; // two more revisions now! 3363d3f6056SSatoshi Sahara $expect = array( 3373d3f6056SSatoshi Sahara 'date' => $lastmod, 3383d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 3393d3f6056SSatoshi Sahara 'sum' => 'Test 2, 3rd save', 3403d3f6056SSatoshi Sahara 'sizechange' => 0, 3413d3f6056SSatoshi Sahara ); 3426072486dSGerrit Uitslag 3436072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 344*3c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 3456072486dSGerrit Uitslag 346*3c425c43SSatoshi Sahara $this->waitForTick(); // wait for new revision ID 347*3c425c43SSatoshi Sahara 348*3c425c43SSatoshi Sahara // 2.5 external edit 349*3c425c43SSatoshi Sahara file_put_contents($file, 'teststring7 external edit2'); 350*3c425c43SSatoshi Sahara clearstatcache(false, $file); 351*3c425c43SSatoshi Sahara $newmod = filemtime($file); 352*3c425c43SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 353*3c425c43SSatoshi Sahara $lastmod = $newmod; 354*3c425c43SSatoshi Sahara $expectedRevs = 4; // external edit is not yet in changelog 355*3c425c43SSatoshi Sahara $expectExternal = array( 356*3c425c43SSatoshi Sahara 'date' => $lastmod, 357*3c425c43SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 358*3c425c43SSatoshi Sahara 'sum' => 'external edit', 359*3c425c43SSatoshi Sahara 'sizechange' => 15, 360*3c425c43SSatoshi Sahara ); 361*3c425c43SSatoshi Sahara 362*3c425c43SSatoshi Sahara $pagelog = new PageChangeLog($page); 363*3c425c43SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 364*3c425c43SSatoshi Sahara 365*3c425c43SSatoshi Sahara $this->waitForTick(); // wait for new revision ID 366*3c425c43SSatoshi Sahara 367*3c425c43SSatoshi Sahara // 2.6 save on top of external edit, again 368*3c425c43SSatoshi Sahara saveWikiText($page, 'teststring8', 'Test 2, 4th save', false); 369*3c425c43SSatoshi Sahara clearstatcache(false, $file); 370*3c425c43SSatoshi Sahara $newmod = filemtime($file); 371*3c425c43SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 372*3c425c43SSatoshi Sahara $lastmod = $newmod; 373*3c425c43SSatoshi Sahara $expectedRevs = 6; // two more revisions now! 374*3c425c43SSatoshi Sahara $expect = array( 375*3c425c43SSatoshi Sahara 'date' => $lastmod, 376*3c425c43SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 377*3c425c43SSatoshi Sahara 'sum' => 'Test 2, 4th save', 378*3c425c43SSatoshi Sahara 'sizechange' => -15, 379*3c425c43SSatoshi Sahara ); 380*3c425c43SSatoshi Sahara 381*3c425c43SSatoshi Sahara $pagelog = new PageChangeLog($page); 382*3c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 3836072486dSGerrit Uitslag } 3846072486dSGerrit Uitslag 3856072486dSGerrit Uitslag /** 3866072486dSGerrit Uitslag * Execute a whole bunch of saves on the same page and check the results 387*3c425c43SSatoshi Sahara * TEST 3 - typical page life of bundled page such as wiki:syntax 3883d3f6056SSatoshi Sahara * 3.1 externally create a page 3893d3f6056SSatoshi Sahara * 3.2 external edit 390*3c425c43SSatoshi Sahara * 3.3 edit and save on top of external edit 3913d3f6056SSatoshi Sahara * 3.4 externally delete the page 3926072486dSGerrit Uitslag */ 3933d3f6056SSatoshi Sahara function test_savesequence3() { 3946072486dSGerrit Uitslag $page = 'page3'; 3956072486dSGerrit Uitslag $file = wikiFN($page); 3966072486dSGerrit Uitslag 3973d3f6056SSatoshi Sahara // 3.1 externally create a page 3986072486dSGerrit Uitslag $this->assertFileNotExists($file); 3996072486dSGerrit Uitslag file_put_contents($file, 'teststring'); 4003d3f6056SSatoshi Sahara clearstatcache(false, $file); 4013d3f6056SSatoshi Sahara $lastmod = filemtime($file); 402*3c425c43SSatoshi Sahara $expectedRevs = 0; // external edit is not yet in changelog 403*3c425c43SSatoshi Sahara $expect = false; 4043d3f6056SSatoshi Sahara $expectExternal = array( 4053d3f6056SSatoshi Sahara 'date' => $lastmod, 4063d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, 4073d3f6056SSatoshi Sahara 'sum' => 'created - external edit', 4083d3f6056SSatoshi Sahara 'sizechange' => 10, 4093d3f6056SSatoshi Sahara ); 4103d3f6056SSatoshi Sahara 4113d3f6056SSatoshi Sahara $pagelog = new PageChangeLog($page); 412*3c425c43SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 4136072486dSGerrit Uitslag 414aaf4f55eSAndreas Gohr $this->waitForTick(true); // wait for new revision ID 4156072486dSGerrit Uitslag 416*3c425c43SSatoshi Sahara // 3.2 external edit (repeated, still no changelog exists) 4173d3f6056SSatoshi Sahara file_put_contents($file, 'teststring external edit'); 4186072486dSGerrit Uitslag clearstatcache(false, $file); 4193d3f6056SSatoshi Sahara $newmod = filemtime($file); 4203d3f6056SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 4213d3f6056SSatoshi Sahara $lastmod = $newmod; 422*3c425c43SSatoshi Sahara $expectedRevs = 0; // external edit is not yet in changelog 4233d3f6056SSatoshi Sahara $expectExternal = array( 4243d3f6056SSatoshi Sahara 'date' => $lastmod, 425*3c425c43SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_CREATE, // not DOKU_CHANGE_TYPE_EDIT 4263d3f6056SSatoshi Sahara 'sum' => 'created - external edit', 4273d3f6056SSatoshi Sahara 'sizechange' => 24, 4283d3f6056SSatoshi Sahara ); 4293d3f6056SSatoshi Sahara 4303d3f6056SSatoshi Sahara $pagelog = new PageChangeLog($page); 431*3c425c43SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 4323d3f6056SSatoshi Sahara 4333d3f6056SSatoshi Sahara $this->waitForTick(true); // wait for new revision ID 4343d3f6056SSatoshi Sahara 4353d3f6056SSatoshi Sahara // 3.3 save on top of external edit 4363d3f6056SSatoshi Sahara saveWikiText($page, 'teststring1', 'Test 3, first save', false); 4373d3f6056SSatoshi Sahara clearstatcache(false, $file); 4383d3f6056SSatoshi Sahara $newmod = filemtime($file); 4393d3f6056SSatoshi Sahara $this->assertNotEquals($lastmod, $newmod); 4403d3f6056SSatoshi Sahara $lastmod = $newmod; 441*3c425c43SSatoshi Sahara $expectedRevs = 2; // two more revisions now! 4423d3f6056SSatoshi Sahara $expect = array( 4433d3f6056SSatoshi Sahara 'date' => $lastmod, 4443d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_EDIT, 4453d3f6056SSatoshi Sahara 'sum' => 'Test 3, first save', 4463d3f6056SSatoshi Sahara 'sizechange' => -13, 4473d3f6056SSatoshi Sahara ); 4486072486dSGerrit Uitslag 4496072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 450*3c425c43SSatoshi Sahara $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect); 451*3c425c43SSatoshi Sahara 4526072486dSGerrit Uitslag 453aaf4f55eSAndreas Gohr $this->waitForTick(true); // wait for new revision ID 4546072486dSGerrit Uitslag 4553d3f6056SSatoshi Sahara // 3.4 externally delete the page 4566072486dSGerrit Uitslag unlink($file); 4576072486dSGerrit Uitslag clearstatcache(false, $file); 458*3c425c43SSatoshi Sahara $expectedRevs = 2; 4593d3f6056SSatoshi Sahara $expectExternal = array( 4603d3f6056SSatoshi Sahara //'date' => $lastmod, 4613d3f6056SSatoshi Sahara 'type' => DOKU_CHANGE_TYPE_DELETE, 4623d3f6056SSatoshi Sahara 'sum' => 'removed - external edit (Unknown date)', 4633d3f6056SSatoshi Sahara 'sizechange' => -11, 4643d3f6056SSatoshi Sahara ); 4656072486dSGerrit Uitslag 4666072486dSGerrit Uitslag $pagelog = new PageChangeLog($page); 467*3c425c43SSatoshi Sahara $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal); 4686072486dSGerrit Uitslag } 4696072486dSGerrit Uitslag 470023953f0SAndreas Gohr} 471