xref: /dokuwiki/_test/tests/inc/common_saveWikiText.test.php (revision 01e8d739c8b53aeb1d0a653331d65eb1f8394002)
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,
2292fda7f4SSatoshi Sahara        $expectedRevs,               // @param int
23b7b9a99dSSatoshi Sahara        &$expectedLastEntry,         // @param array, pass by reference
245e23cdb8SSatoshi Sahara        $expected2ndLastEntry = null // @param array (optional)
253c425c43SSatoshi Sahara    ) {
263c425c43SSatoshi Sahara        $revisions = $pagelog->getRevisions(-1, 200);
273c425c43SSatoshi Sahara        $this->assertCount($expectedRevs, $revisions);
283c425c43SSatoshi Sahara        $this->assertCount($expectedRevs, array_unique($revisions), 'date duplicated in changelog');
293c425c43SSatoshi Sahara        // last revision
303c425c43SSatoshi Sahara        $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]);
313c425c43SSatoshi Sahara        $expectedLastEntry += $lastRevInfo;
323c425c43SSatoshi Sahara        $this->assertEquals($expectedLastEntry, $lastRevInfo);
333c425c43SSatoshi Sahara        // current revision
343c425c43SSatoshi Sahara        $currentRevInfo = $pagelog->getCurrentRevisionInfo();
353c425c43SSatoshi Sahara        $this->assertEquals($currentRevInfo, $lastRevInfo, 'current & last revs should be identical');
363c425c43SSatoshi Sahara        // attic
373c425c43SSatoshi Sahara        $attic = wikiFN($lastRevInfo['id'], $lastRevInfo['date']);
383c425c43SSatoshi Sahara        $this->assertFileExists($attic, 'file missing in attic');
393c425c43SSatoshi Sahara        $files = count(glob(dirname($attic).'/'.noNS($lastRevInfo['id']).'.*'));
403c425c43SSatoshi Sahara        $this->assertLessThanOrEqual($expectedRevs, $files, 'detectExternalEdit() should not add too often old revs');
41b7b9a99dSSatoshi Sahara
425e23cdb8SSatoshi Sahara        // second to last revision (optional), intended to check logline of previous external edits
435e23cdb8SSatoshi Sahara        if ($expected2ndLastEntry && count($revisions) > 1) {
44b7b9a99dSSatoshi Sahara            $prevRevInfo = $pagelog->getRevisionInfo($revisions[1]);
45b7b9a99dSSatoshi Sahara            $this->assertEquals($expected2ndLastEntry, $prevRevInfo);
46b7b9a99dSSatoshi Sahara        }
473c425c43SSatoshi Sahara    }
483c425c43SSatoshi Sahara
493c425c43SSatoshi Sahara    /**
503c425c43SSatoshi Sahara     * assertions against changelog entries and attic after external edit, create or deletion of page
513c425c43SSatoshi Sahara     */
523c425c43SSatoshi Sahara    private function checkChangeLogAfterExternalEdit(
533c425c43SSatoshi Sahara        PageChangeLog $pagelog,
5492fda7f4SSatoshi Sahara        $expectedRevs,          // @param int
5592fda7f4SSatoshi Sahara        $expectedLastEntry,     // @param array
5692fda7f4SSatoshi Sahara        &$expectedCurrentEntry  // @param array, pass by reference
573c425c43SSatoshi Sahara    ) {
583c425c43SSatoshi Sahara        $revisions = $pagelog->getRevisions(-1, 200);
593c425c43SSatoshi Sahara        $this->assertCount($expectedRevs, $revisions);
603c425c43SSatoshi Sahara        $this->assertCount($expectedRevs, array_unique($revisions), 'date duplicated in changelog');
613c425c43SSatoshi Sahara        // last revision
623c425c43SSatoshi Sahara        if ($expectedRevs > 0) {
633c425c43SSatoshi Sahara            $lastRevInfo = $pagelog->getRevisionInfo($revisions[0]);
643c425c43SSatoshi Sahara            $expectedLastEntry += $lastRevInfo;
653c425c43SSatoshi Sahara            $this->assertEquals($expectedLastEntry, $lastRevInfo);
663c425c43SSatoshi Sahara        } else {
673c425c43SSatoshi Sahara            $this->assertFalse($pagelog->lastRevision(), 'changelog file does not yet exist');
683c425c43SSatoshi Sahara        }
693c425c43SSatoshi Sahara        // current revision
703c425c43SSatoshi Sahara        $currentRevInfo = $pagelog->getCurrentRevisionInfo();
713c425c43SSatoshi Sahara        $this->assertArrayHasKey('timestamp', $currentRevInfo, 'should be external revision');
723c425c43SSatoshi Sahara        $expectedCurrentEntry += $currentRevInfo;
733c425c43SSatoshi Sahara        if ($expectedRevs > 0) {
743c425c43SSatoshi Sahara            $this->assertEquals($expectedCurrentEntry, $currentRevInfo);
753c425c43SSatoshi Sahara
763c425c43SSatoshi Sahara        }
77*01e8d739SAndreas Gohr        // attic — external edits/creates are now copied at first detection;
78*01e8d739SAndreas Gohr        // deletes have no file to attic
793c425c43SSatoshi Sahara        $attic = wikiFN($currentRevInfo['id'], $currentRevInfo['date']);
80*01e8d739SAndreas Gohr        if ($currentRevInfo['type'] === DOKU_CHANGE_TYPE_DELETE) {
81*01e8d739SAndreas Gohr            $this->assertFileDoesNotExist($attic, 'no attic for external delete');
82*01e8d739SAndreas Gohr        } else {
83*01e8d739SAndreas Gohr            $this->assertFileExists($attic, 'persisted external edit should have attic');
84*01e8d739SAndreas Gohr        }
853c425c43SSatoshi Sahara    }
863c425c43SSatoshi Sahara
873c425c43SSatoshi Sahara
883c425c43SSatoshi Sahara    /**
89023953f0SAndreas Gohr     * Execute a whole bunch of saves on the same page and check the results
903d3f6056SSatoshi Sahara     * TEST 1
913d3f6056SSatoshi Sahara     *  1.1 create a page
923d3f6056SSatoshi Sahara     *  1.2 save with same content should be ignored
933d3f6056SSatoshi Sahara     *  1.3 update the page with new text
943c425c43SSatoshi Sahara     *  1.4 add a minor edit (unauthenticated, minor not allowable)
953d3f6056SSatoshi Sahara     *  1.5 add a minor edit (authenticated)
963d3f6056SSatoshi Sahara     *  1.6 delete
973d3f6056SSatoshi Sahara     *  1.7 restore
983d3f6056SSatoshi Sahara     *  1.8 external edit
993c425c43SSatoshi Sahara     *  1.9 edit and save on top of external edit
100023953f0SAndreas Gohr     */
1013d3f6056SSatoshi Sahara    function test_savesequence1() {
102023953f0SAndreas Gohr        global $REV;
103023953f0SAndreas Gohr
104023953f0SAndreas Gohr        $page = 'page';
105023953f0SAndreas Gohr        $file = wikiFN($page);
1069ad2b913SAndreas Gohr        $this->assertFileDoesNotExist($file);
107023953f0SAndreas Gohr
1083d3f6056SSatoshi Sahara        // 1.1 create a page
1093d3f6056SSatoshi Sahara        saveWikiText($page, 'teststring', '1st save', false);
11092fda7f4SSatoshi Sahara        clearstatcache(false, $file);
111023953f0SAndreas Gohr        $this->assertFileExists($file);
112023953f0SAndreas Gohr        $lastmod = filemtime($file);
1133c425c43SSatoshi Sahara        $expectedRevs = 1;
1143d3f6056SSatoshi Sahara        $expect = array(
1153d3f6056SSatoshi Sahara            'date' => $lastmod,
1163d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_CREATE,
1173d3f6056SSatoshi Sahara            'sum'  => '1st save',
1183d3f6056SSatoshi Sahara            'sizechange' => 10, // = strlen('teststring')
1193d3f6056SSatoshi Sahara        );
120023953f0SAndreas Gohr
121023953f0SAndreas Gohr        $pagelog = new PageChangeLog($page);
1223c425c43SSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect);
123023953f0SAndreas Gohr
124aaf4f55eSAndreas Gohr        $this->waitForTick(true); // wait for new revision ID
125023953f0SAndreas Gohr
1263d3f6056SSatoshi Sahara        // 1.2 save with same content should be ignored
1273d3f6056SSatoshi Sahara        saveWikiText($page, 'teststring', '2nd save', false);
128023953f0SAndreas Gohr        clearstatcache(false, $file);
129023953f0SAndreas Gohr        $this->assertEquals($lastmod, filemtime($file));
130023953f0SAndreas Gohr
131023953f0SAndreas Gohr        $pagelog = new PageChangeLog($page);
132023953f0SAndreas Gohr        $revisions = $pagelog->getRevisions(-1, 200);
1337866d571SSatoshi Sahara        $this->assertCount(1, $revisions);
134023953f0SAndreas Gohr
1353d3f6056SSatoshi Sahara        // 1.3 update the page with new text
1363d3f6056SSatoshi Sahara        saveWikiText($page, 'teststring2long', '3rd save', false);
137023953f0SAndreas Gohr        clearstatcache(false, $file);
138023953f0SAndreas Gohr        $newmod = filemtime($file);
139023953f0SAndreas Gohr        $this->assertNotEquals($lastmod, $newmod);
140023953f0SAndreas Gohr        $lastmod = $newmod;
1413c425c43SSatoshi Sahara        $expectedRevs = 2;
1425e23cdb8SSatoshi Sahara        $expectPrev = $expect;
1433d3f6056SSatoshi Sahara        $expect = array(
1443d3f6056SSatoshi Sahara            'date' => $lastmod,
1453d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_EDIT,
1463d3f6056SSatoshi Sahara            'sum'  => '3rd save',
1473d3f6056SSatoshi Sahara            'sizechange' => 5,
1483d3f6056SSatoshi Sahara        );
149023953f0SAndreas Gohr
150023953f0SAndreas Gohr        $pagelog = new PageChangeLog($page);
1515e23cdb8SSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect, $expectPrev);
152023953f0SAndreas Gohr
153aaf4f55eSAndreas Gohr        $this->waitForTick(); // wait for new revision ID
154023953f0SAndreas Gohr
1553c425c43SSatoshi Sahara        // 1.4 add a minor edit (unauthenticated, minor not allowable)
1563d3f6056SSatoshi Sahara        saveWikiText($page, 'teststring3long', '4th save', true);
157023953f0SAndreas Gohr        clearstatcache(false, $file);
158023953f0SAndreas Gohr        $newmod = filemtime($file);
159023953f0SAndreas Gohr        $this->assertNotEquals($lastmod, $newmod);
160023953f0SAndreas Gohr        $lastmod = $newmod;
1613c425c43SSatoshi Sahara        $expectedRevs = 3;
1623d3f6056SSatoshi Sahara        $expect = array(
1633d3f6056SSatoshi Sahara            'date' => $lastmod,
1643d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_EDIT,
1653d3f6056SSatoshi Sahara            'sum'  => '4th save',
1663d3f6056SSatoshi Sahara            'sizechange' => 0,
1673d3f6056SSatoshi Sahara        );
168023953f0SAndreas Gohr
169023953f0SAndreas Gohr        $pagelog = new PageChangeLog($page);
1703c425c43SSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect);
171023953f0SAndreas Gohr
172aaf4f55eSAndreas Gohr        $this->waitForTick(); // wait for new revision ID
173023953f0SAndreas Gohr
1743d3f6056SSatoshi Sahara        // 1.5 add a minor edit (authenticated)
175023953f0SAndreas Gohr        $_SERVER['REMOTE_USER'] = 'user';
1763d3f6056SSatoshi Sahara        saveWikiText($page, 'teststring4', '5th save', true);
177023953f0SAndreas Gohr        clearstatcache(false, $file);
178023953f0SAndreas Gohr        $newmod = filemtime($file);
179023953f0SAndreas Gohr        $this->assertNotEquals($lastmod, $newmod);
180023953f0SAndreas Gohr        $lastmod = $newmod;
1813c425c43SSatoshi Sahara        $expectedRevs = 4;
1823d3f6056SSatoshi Sahara        $expect = array(
1833d3f6056SSatoshi Sahara            'date' => $lastmod,
1843d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_MINOR_EDIT,
1853d3f6056SSatoshi Sahara            'sum'  => '5th save',
1863d3f6056SSatoshi Sahara            'sizechange' => -4,
1873d3f6056SSatoshi Sahara        );
188023953f0SAndreas Gohr
189023953f0SAndreas Gohr        $pagelog = new PageChangeLog($page);
1903c425c43SSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect);
191023953f0SAndreas Gohr
192aaf4f55eSAndreas Gohr        $this->waitForTick(); // wait for new revision ID
193023953f0SAndreas Gohr
1943d3f6056SSatoshi Sahara        // 1.6 delete
1953d3f6056SSatoshi Sahara        saveWikiText($page, '', '6th save', false);
196023953f0SAndreas Gohr        clearstatcache(false, $file);
1979ad2b913SAndreas Gohr        $this->assertFileDoesNotExist($file);
1983c425c43SSatoshi Sahara        $expectedRevs = 5;
1993d3f6056SSatoshi Sahara        $expect = array(
2003d3f6056SSatoshi Sahara          //'date' => $lastmod, // ignore from lastRev assertion, but confirm attic file existence
2013d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_DELETE,
2023d3f6056SSatoshi Sahara            'sum'  => '6th save',
2033d3f6056SSatoshi Sahara            'sizechange' => -11,
2043d3f6056SSatoshi Sahara        );
205023953f0SAndreas Gohr
206023953f0SAndreas Gohr        $pagelog = new PageChangeLog($page);
2073c425c43SSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect);
208023953f0SAndreas Gohr
209aaf4f55eSAndreas Gohr        $this->waitForTick(); // wait for new revision ID
210023953f0SAndreas Gohr
2113d3f6056SSatoshi Sahara        // 1.7 restore
212023953f0SAndreas Gohr        $REV = $lastmod;
2133d3f6056SSatoshi Sahara        saveWikiText($page, 'teststring4', '7th save', true);
214023953f0SAndreas Gohr        clearstatcache(false, $file);
215023953f0SAndreas Gohr        $this->assertFileExists($file);
216023953f0SAndreas Gohr        $newmod = filemtime($file);
217023953f0SAndreas Gohr        $this->assertNotEquals($lastmod, $newmod);
218023953f0SAndreas Gohr        $lastmod = $newmod;
2193c425c43SSatoshi Sahara        $expectedRevs = 6;
2203d3f6056SSatoshi Sahara        $expect = array(
2213d3f6056SSatoshi Sahara            'date' => $lastmod,
2223d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_REVERT,
2233d3f6056SSatoshi Sahara            'sum'  => '7th save',
2243d3f6056SSatoshi Sahara            'sizechange' => 11,
2253d3f6056SSatoshi Sahara        );
226023953f0SAndreas Gohr
227023953f0SAndreas Gohr        $pagelog = new PageChangeLog($page);
2283c425c43SSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect);
229023953f0SAndreas Gohr        $REV = '';
230023953f0SAndreas Gohr
231aaf4f55eSAndreas Gohr        $this->waitForTick(); // wait for new revision ID
232023953f0SAndreas Gohr
2333d3f6056SSatoshi Sahara        // 1.8 external edit
2343d3f6056SSatoshi Sahara        file_put_contents($file, 'teststring5 external edit');
235023953f0SAndreas Gohr        clearstatcache(false, $file);
236023953f0SAndreas Gohr        $newmod = filemtime($file);
237023953f0SAndreas Gohr        $this->assertNotEquals($lastmod, $newmod);
238023953f0SAndreas Gohr        $lastmod = $newmod;
2393c425c43SSatoshi Sahara        $expectedRevs = 6; // external edit is not yet in changelog
2403d3f6056SSatoshi Sahara        $expectExternal = array(
2413d3f6056SSatoshi Sahara            'date' => $lastmod,
2423d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_EDIT,
2433d3f6056SSatoshi Sahara            'sum'  => 'external edit',
2443d3f6056SSatoshi Sahara            'sizechange' => 14,
2453d3f6056SSatoshi Sahara        );
2463d3f6056SSatoshi Sahara
2473d3f6056SSatoshi Sahara        $pagelog = new PageChangeLog($page);
2483c425c43SSatoshi Sahara        $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal);
2493d3f6056SSatoshi Sahara
2503d3f6056SSatoshi Sahara        $this->waitForTick(); // wait for new revision ID
2513d3f6056SSatoshi Sahara
2523d3f6056SSatoshi Sahara        // 1.9 save on top of external edit
2533d3f6056SSatoshi Sahara        saveWikiText($page, 'teststring6', '8th save', false);
2543d3f6056SSatoshi Sahara        clearstatcache(false, $file);
2553d3f6056SSatoshi Sahara        $newmod = filemtime($file);
2563d3f6056SSatoshi Sahara        $this->assertNotEquals($lastmod, $newmod);
2573d3f6056SSatoshi Sahara        $lastmod = $newmod;
2583c425c43SSatoshi Sahara        $expectedRevs = 8;
2593d3f6056SSatoshi Sahara        $expect = array(
2603d3f6056SSatoshi Sahara            'date' => $lastmod,
2613d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_EDIT,
2623d3f6056SSatoshi Sahara            'sum'  => '8th save',
2633d3f6056SSatoshi Sahara            'sizechange' => -14,
2643d3f6056SSatoshi Sahara        );
265023953f0SAndreas Gohr
266023953f0SAndreas Gohr        $pagelog = new PageChangeLog($page);
267b7b9a99dSSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect, $expectExternal);
268023953f0SAndreas Gohr    }
2696072486dSGerrit Uitslag
2706072486dSGerrit Uitslag    /**
2716072486dSGerrit Uitslag     * Execute a whole bunch of saves on the same page and check the results
2723d3f6056SSatoshi Sahara     * using $this->handle_write() in event IO_WIKIPAGE_WRITE
2733c425c43SSatoshi Sahara     * TEST 2 - create a page externally in 2.3, while external edit in Test 1.8
2743d3f6056SSatoshi Sahara     *  2.1 create a page
2753d3f6056SSatoshi Sahara     *  2.2 delete
2763d3f6056SSatoshi Sahara     *  2.3 externally create the page
2773c425c43SSatoshi Sahara     *  2.4 edit and save on top of external edit
2783c425c43SSatoshi Sahara     *  2.5 external edit
2793c425c43SSatoshi Sahara     *  2.6 edit and save on top of external edit, again
2806072486dSGerrit Uitslag     */
2813d3f6056SSatoshi Sahara    function test_savesequence2() {
282ea466a98SMichael Hamann        // add an additional delay when saving files to make sure
283ea466a98SMichael Hamann        // nobody relies on the saving happening in the same second
284e1d9dcc8SAndreas Gohr        /** @var $EVENT_HANDLER \dokuwiki\Extension\EventHandler */
285ea466a98SMichael Hamann        global $EVENT_HANDLER;
286ea466a98SMichael Hamann        $EVENT_HANDLER->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'handle_write');
287ea466a98SMichael Hamann
2886072486dSGerrit Uitslag        $page = 'page2';
2896072486dSGerrit Uitslag        $file = wikiFN($page);
2909ad2b913SAndreas Gohr        $this->assertFileDoesNotExist($file);
2916072486dSGerrit Uitslag
2923d3f6056SSatoshi Sahara        // 2.1 create a page
2933d3f6056SSatoshi Sahara        saveWikiText($page, 'teststring', 'Test 2, 1st save', false);
29492fda7f4SSatoshi Sahara        clearstatcache(false, $file);
2956072486dSGerrit Uitslag        $this->assertFileExists($file);
2966072486dSGerrit Uitslag        $lastmod = filemtime($file);
2973c425c43SSatoshi Sahara        $expectedRevs = 1;
2983d3f6056SSatoshi Sahara        $expect = array(
2993d3f6056SSatoshi Sahara            'date' => $lastmod,
3003d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_CREATE,
3013d3f6056SSatoshi Sahara            'sum'  => 'Test 2, 1st save',
3023d3f6056SSatoshi Sahara            'sizechange' => 10, // = strlen('teststring')
3033d3f6056SSatoshi Sahara        );
3046072486dSGerrit Uitslag
3056072486dSGerrit Uitslag        $pagelog = new PageChangeLog($page);
3063c425c43SSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect);
3076072486dSGerrit Uitslag
308aaf4f55eSAndreas Gohr        $this->waitForTick(true); // wait for new revision ID
3096072486dSGerrit Uitslag
3103d3f6056SSatoshi Sahara        // 2.2 delete
3113d3f6056SSatoshi Sahara        saveWikiText($page, '', 'Test 2, 2nd save', false);
3126072486dSGerrit Uitslag        clearstatcache(false, $file);
3139ad2b913SAndreas Gohr        $this->assertFileDoesNotExist($file);
3143c425c43SSatoshi Sahara        $expectedRevs = 2;
3153d3f6056SSatoshi Sahara        $expect = array(
3163d3f6056SSatoshi Sahara          //'date' => $lastmod, // ignore from lastRev assertion, but confirm attic file existence
3173d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_DELETE,
3183d3f6056SSatoshi Sahara            'sum'  => 'Test 2, 2nd save',
3193d3f6056SSatoshi Sahara            'sizechange' => -10,
3203d3f6056SSatoshi Sahara        );
3216072486dSGerrit Uitslag
3226072486dSGerrit Uitslag        $pagelog = new PageChangeLog($page);
3233c425c43SSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect);
3246072486dSGerrit Uitslag
325aaf4f55eSAndreas Gohr        $this->waitForTick(); // wait for new revision ID
3266072486dSGerrit Uitslag
3273d3f6056SSatoshi Sahara        // 2.3 externally create the page
3286072486dSGerrit Uitslag        file_put_contents($file, 'teststring5');
3293d3f6056SSatoshi Sahara        clearstatcache(false, $file);
3303d3f6056SSatoshi Sahara        $lastmod = filemtime($file);
3313c425c43SSatoshi Sahara        $expectedRevs = 2; // external edit is not yet in changelog
3323d3f6056SSatoshi Sahara        $expectExternal = array(
3333d3f6056SSatoshi Sahara            'date' => $lastmod,
3343d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_CREATE,
3353d3f6056SSatoshi Sahara            'sum'  => 'created - external edit',
3363d3f6056SSatoshi Sahara            'sizechange' => 11,
3373d3f6056SSatoshi Sahara        );
3383d3f6056SSatoshi Sahara
3393d3f6056SSatoshi Sahara        $pagelog = new PageChangeLog($page);
3403c425c43SSatoshi Sahara        $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal);
3416072486dSGerrit Uitslag
342aaf4f55eSAndreas Gohr        $this->waitForTick(); // wait for new revision ID
3436072486dSGerrit Uitslag
3443d3f6056SSatoshi Sahara        // 2.4 save on top of external edit
3453d3f6056SSatoshi Sahara        saveWikiText($page, 'teststring6', 'Test 2, 3rd save', false);
3466072486dSGerrit Uitslag        clearstatcache(false, $file);
3473d3f6056SSatoshi Sahara        $newmod = filemtime($file);
3483d3f6056SSatoshi Sahara        $this->assertNotEquals($lastmod, $newmod);
3493d3f6056SSatoshi Sahara        $lastmod = $newmod;
3503c425c43SSatoshi Sahara        $expectedRevs = 4; // two more revisions now!
3513d3f6056SSatoshi Sahara        $expect = array(
3523d3f6056SSatoshi Sahara            'date' => $lastmod,
3533d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_EDIT,
3543d3f6056SSatoshi Sahara            'sum'  => 'Test 2, 3rd save',
3553d3f6056SSatoshi Sahara            'sizechange' => 0,
3563d3f6056SSatoshi Sahara        );
3576072486dSGerrit Uitslag
3586072486dSGerrit Uitslag        $pagelog = new PageChangeLog($page);
359b7b9a99dSSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect, $expectExternal);
3606072486dSGerrit Uitslag
3613c425c43SSatoshi Sahara        $this->waitForTick(); // wait for new revision ID
3623c425c43SSatoshi Sahara
3633c425c43SSatoshi Sahara         // 2.5 external edit
3643c425c43SSatoshi Sahara        file_put_contents($file, 'teststring7 external edit2');
3653c425c43SSatoshi Sahara        clearstatcache(false, $file);
3663c425c43SSatoshi Sahara        $newmod = filemtime($file);
3673c425c43SSatoshi Sahara        $this->assertNotEquals($lastmod, $newmod);
3683c425c43SSatoshi Sahara        $lastmod = $newmod;
3693c425c43SSatoshi Sahara        $expectedRevs = 4; // external edit is not yet in changelog
3703c425c43SSatoshi Sahara        $expectExternal = array(
3713c425c43SSatoshi Sahara            'date' => $lastmod,
3723c425c43SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_EDIT,
3733c425c43SSatoshi Sahara            'sum'  => 'external edit',
3743c425c43SSatoshi Sahara            'sizechange' => 15,
3753c425c43SSatoshi Sahara        );
3763c425c43SSatoshi Sahara
3773c425c43SSatoshi Sahara        $pagelog = new PageChangeLog($page);
3783c425c43SSatoshi Sahara        $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal);
3793c425c43SSatoshi Sahara
3803c425c43SSatoshi Sahara        $this->waitForTick(); // wait for new revision ID
3813c425c43SSatoshi Sahara
3823c425c43SSatoshi Sahara        // 2.6 save on top of external edit, again
3833c425c43SSatoshi Sahara        saveWikiText($page, 'teststring8', 'Test 2, 4th save', false);
3843c425c43SSatoshi Sahara        clearstatcache(false, $file);
3853c425c43SSatoshi Sahara        $newmod = filemtime($file);
3863c425c43SSatoshi Sahara        $this->assertNotEquals($lastmod, $newmod);
3873c425c43SSatoshi Sahara        $lastmod = $newmod;
3883c425c43SSatoshi Sahara        $expectedRevs = 6; // two more revisions now!
3893c425c43SSatoshi Sahara        $expect = array(
3903c425c43SSatoshi Sahara            'date' => $lastmod,
3913c425c43SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_EDIT,
3923c425c43SSatoshi Sahara            'sum'  => 'Test 2, 4th save',
3933c425c43SSatoshi Sahara            'sizechange' => -15,
3943c425c43SSatoshi Sahara        );
3953c425c43SSatoshi Sahara
3963c425c43SSatoshi Sahara        $pagelog = new PageChangeLog($page);
397b7b9a99dSSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect, $expectExternal);
3986072486dSGerrit Uitslag    }
3996072486dSGerrit Uitslag
4006072486dSGerrit Uitslag    /**
4016072486dSGerrit Uitslag     * Execute a whole bunch of saves on the same page and check the results
4023c425c43SSatoshi Sahara     * TEST 3 - typical page life of bundled page such as wiki:syntax
4033d3f6056SSatoshi Sahara     *  3.1 externally create a page
4043d3f6056SSatoshi Sahara     *  3.2 external edit
4053c425c43SSatoshi Sahara     *  3.3 edit and save on top of external edit
4063d3f6056SSatoshi Sahara     *  3.4 externally delete the page
4076072486dSGerrit Uitslag     */
4083d3f6056SSatoshi Sahara    function test_savesequence3() {
4096072486dSGerrit Uitslag        $page = 'page3';
4106072486dSGerrit Uitslag        $file = wikiFN($page);
4116072486dSGerrit Uitslag
4123d3f6056SSatoshi Sahara        // 3.1 externally create a page
4139ad2b913SAndreas Gohr        $this->assertFileDoesNotExist($file);
4146072486dSGerrit Uitslag        file_put_contents($file, 'teststring');
4153d3f6056SSatoshi Sahara        clearstatcache(false, $file);
4163d3f6056SSatoshi Sahara        $lastmod = filemtime($file);
4173c425c43SSatoshi Sahara        $expectedRevs = 0; // external edit is not yet in changelog
4183c425c43SSatoshi Sahara        $expect = false;
4193d3f6056SSatoshi Sahara        $expectExternal = array(
4203d3f6056SSatoshi Sahara            'date' => $lastmod,
4213d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_CREATE,
4223d3f6056SSatoshi Sahara            'sum'  => 'created - external edit',
4233d3f6056SSatoshi Sahara            'sizechange' => 10,
4243d3f6056SSatoshi Sahara        );
4253d3f6056SSatoshi Sahara
4263d3f6056SSatoshi Sahara        $pagelog = new PageChangeLog($page);
4273c425c43SSatoshi Sahara        $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal);
4286072486dSGerrit Uitslag
429aaf4f55eSAndreas Gohr        $this->waitForTick(true); // wait for new revision ID
4306072486dSGerrit Uitslag
431*01e8d739SAndreas Gohr        // 3.2 external edit (3.1 was already persisted on first detection,
432*01e8d739SAndreas Gohr        // so this is now an EDIT on top of the prior external CREATE)
433*01e8d739SAndreas Gohr        $expect = $expectExternal; // last revision is the 3.1 persisted entry
4343d3f6056SSatoshi Sahara        file_put_contents($file, 'teststring external edit');
4356072486dSGerrit Uitslag        clearstatcache(false, $file);
4363d3f6056SSatoshi Sahara        $newmod = filemtime($file);
4373d3f6056SSatoshi Sahara        $this->assertNotEquals($lastmod, $newmod);
4383d3f6056SSatoshi Sahara        $lastmod = $newmod;
439*01e8d739SAndreas Gohr        $expectedRevs = 1;
4403d3f6056SSatoshi Sahara        $expectExternal = array(
4413d3f6056SSatoshi Sahara            'date' => $lastmod,
442*01e8d739SAndreas Gohr            'type' => DOKU_CHANGE_TYPE_EDIT,
443*01e8d739SAndreas Gohr            'sum'  => 'external edit',
444*01e8d739SAndreas Gohr            'sizechange' => 14,
4453d3f6056SSatoshi Sahara        );
4463d3f6056SSatoshi Sahara
4473d3f6056SSatoshi Sahara        $pagelog = new PageChangeLog($page);
4483c425c43SSatoshi Sahara        $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal);
4493d3f6056SSatoshi Sahara
4503d3f6056SSatoshi Sahara        $this->waitForTick(true); // wait for new revision ID
4513d3f6056SSatoshi Sahara
4523d3f6056SSatoshi Sahara        // 3.3 save on top of external edit
4533d3f6056SSatoshi Sahara        saveWikiText($page, 'teststring1', 'Test 3, first save', false);
4543d3f6056SSatoshi Sahara        clearstatcache(false, $file);
4553d3f6056SSatoshi Sahara        $newmod = filemtime($file);
4563d3f6056SSatoshi Sahara        $this->assertNotEquals($lastmod, $newmod);
4573d3f6056SSatoshi Sahara        $lastmod = $newmod;
458*01e8d739SAndreas Gohr        $expectedRevs = 3;
4593d3f6056SSatoshi Sahara        $expect = array(
4603d3f6056SSatoshi Sahara            'date' => $lastmod,
4613d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_EDIT,
4623d3f6056SSatoshi Sahara            'sum'  => 'Test 3, first save',
4633d3f6056SSatoshi Sahara            'sizechange' => -13,
4643d3f6056SSatoshi Sahara        );
4656072486dSGerrit Uitslag
4666072486dSGerrit Uitslag        $pagelog = new PageChangeLog($page);
467b7b9a99dSSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect, $expectExternal);
4686072486dSGerrit Uitslag
469aaf4f55eSAndreas Gohr        $this->waitForTick(true); // wait for new revision ID
4706072486dSGerrit Uitslag
4713d3f6056SSatoshi Sahara        // 3.4 externally delete the page
4726072486dSGerrit Uitslag        unlink($file);
473*01e8d739SAndreas Gohr        $expectedRevs = 3;
4743d3f6056SSatoshi Sahara        $expectExternal = array(
4753d3f6056SSatoshi Sahara          //'date' => $lastmod,
4763d3f6056SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_DELETE,
4773d3f6056SSatoshi Sahara            'sum'  => 'removed - external edit (Unknown date)',
4783d3f6056SSatoshi Sahara            'sizechange' => -11,
4793d3f6056SSatoshi Sahara        );
4806072486dSGerrit Uitslag
4816072486dSGerrit Uitslag        $pagelog = new PageChangeLog($page);
4823c425c43SSatoshi Sahara        $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal);
4836072486dSGerrit Uitslag    }
4846072486dSGerrit Uitslag
48592fda7f4SSatoshi Sahara    /**
48692fda7f4SSatoshi Sahara     * Execute a whole bunch of saves on the same page and check the results
48792fda7f4SSatoshi Sahara     * TEST 4 - typical page life of bundled page such as wiki:syntax
48892fda7f4SSatoshi Sahara     *  4.1 externally create a page
48992fda7f4SSatoshi Sahara     *  4.2 edit and save
49092fda7f4SSatoshi Sahara     *  4.3 externally edit as a result of a file which has older timestamp than last revision
49192fda7f4SSatoshi Sahara     */
49292fda7f4SSatoshi Sahara    function test_savesequence4() {
49392fda7f4SSatoshi Sahara        $page = 'page4';
49492fda7f4SSatoshi Sahara        $file = wikiFN($page);
49592fda7f4SSatoshi Sahara
49692fda7f4SSatoshi Sahara        // 4.1 externally create a page
4979ad2b913SAndreas Gohr        $this->assertFileDoesNotExist($file);
49892fda7f4SSatoshi Sahara        file_put_contents($file, 'teststring');
49992fda7f4SSatoshi Sahara        clearstatcache(false, $file);
50092fda7f4SSatoshi Sahara        $lastmod = filemtime($file);
50192fda7f4SSatoshi Sahara        $expectedRevs = 0; // external edit is not yet in changelog
50292fda7f4SSatoshi Sahara        $expect = false;
50392fda7f4SSatoshi Sahara        $expectExternal = array(
50492fda7f4SSatoshi Sahara            'date' => $lastmod,
50592fda7f4SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_CREATE,
50692fda7f4SSatoshi Sahara            'sum'  => 'created - external edit',
50792fda7f4SSatoshi Sahara            'sizechange' => 10,
50892fda7f4SSatoshi Sahara        );
50992fda7f4SSatoshi Sahara
51092fda7f4SSatoshi Sahara        $pagelog = new PageChangeLog($page);
51192fda7f4SSatoshi Sahara        $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal);
51292fda7f4SSatoshi Sahara
51392fda7f4SSatoshi Sahara        $this->waitForTick(true); // wait for new revision ID
51492fda7f4SSatoshi Sahara
51592fda7f4SSatoshi Sahara        // 4.2 edit and save
51692fda7f4SSatoshi Sahara        saveWikiText($page, 'teststring1', 'Test 4, first save', false);
51792fda7f4SSatoshi Sahara        clearstatcache(false, $file);
51892fda7f4SSatoshi Sahara        $newmod = filemtime($file);
51992fda7f4SSatoshi Sahara        $this->assertNotEquals($lastmod, $newmod);
52092fda7f4SSatoshi Sahara        $lastmod = $newmod;
52192fda7f4SSatoshi Sahara        $expectedRevs = 2; // two more revisions now!
52292fda7f4SSatoshi Sahara        $expect = array(
52392fda7f4SSatoshi Sahara            'date' => $lastmod,
52492fda7f4SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_EDIT,
52592fda7f4SSatoshi Sahara            'sum'  => 'Test 4, first save',
52692fda7f4SSatoshi Sahara            'sizechange' => 1,
52792fda7f4SSatoshi Sahara        );
52892fda7f4SSatoshi Sahara
52992fda7f4SSatoshi Sahara        $pagelog = new PageChangeLog($page);
530b7b9a99dSSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect, $expectExternal);
53192fda7f4SSatoshi Sahara
53292fda7f4SSatoshi Sahara        $this->waitForTick(true); // wait for new revision ID
53392fda7f4SSatoshi Sahara
53492fda7f4SSatoshi Sahara        // 4.3 externally edit as a result of a file which has older timestamp than last revision
53592fda7f4SSatoshi Sahara        unlink($file);
53636784b8fSAndreas Gohr        file_put_contents($file, 'teststring fake 1 hour past');
53792fda7f4SSatoshi Sahara        touch($file, filemtime($file) -3600); // change file modification time to 1 hour past
53892fda7f4SSatoshi Sahara        clearstatcache();
53992fda7f4SSatoshi Sahara        $newmod = filemtime($file);
54092fda7f4SSatoshi Sahara        $this->assertLessThan($lastmod, $newmod); // file must be older than previous for this test
54192fda7f4SSatoshi Sahara        $expectedRevs = 2; // external edit is not yet in changelog
54292fda7f4SSatoshi Sahara        $expectExternal = array(
54392fda7f4SSatoshi Sahara            'date' => $lastmod + 1,
54492fda7f4SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_EDIT,
54592fda7f4SSatoshi Sahara            'sum'  => 'external edit (Unknown date)',
54692fda7f4SSatoshi Sahara            'sizechange' => 16,
54792fda7f4SSatoshi Sahara        );
54892fda7f4SSatoshi Sahara
54936784b8fSAndreas Gohr        $this->expectLogMessage('current file modification time is older than last');
55092fda7f4SSatoshi Sahara        $pagelog = new PageChangeLog($page);
55192fda7f4SSatoshi Sahara        $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal);
55292fda7f4SSatoshi Sahara    }
55392fda7f4SSatoshi Sahara
5548fb3ff96SSatoshi Sahara    /**
5558fb3ff96SSatoshi Sahara     * Execute a whole bunch of saves on the same page and check the results
5568fb3ff96SSatoshi Sahara     * TEST 5 - page creation and deletion
5578fb3ff96SSatoshi Sahara     *  5.1 create a page
5588fb3ff96SSatoshi Sahara     *  5.2 external edit
5598fb3ff96SSatoshi Sahara     *  5.3 edit and save on top of external edit
5608fb3ff96SSatoshi Sahara     *  5.4 delete
5618fb3ff96SSatoshi Sahara     *  5.5 create a page, second time
5628fb3ff96SSatoshi Sahara     *  5.6 externally delete
5638fb3ff96SSatoshi Sahara     *  5.7 create a page, third time
5648fb3ff96SSatoshi Sahara     */
5658fb3ff96SSatoshi Sahara    function test_savesequence5() {
5668fb3ff96SSatoshi Sahara        $page = 'page5';
5678fb3ff96SSatoshi Sahara        $file = wikiFN($page);
5689ad2b913SAndreas Gohr        $this->assertFileDoesNotExist($file);
5698fb3ff96SSatoshi Sahara
5708fb3ff96SSatoshi Sahara        // 5.1 create a page
5718fb3ff96SSatoshi Sahara        saveWikiText($page, 'teststring', 'Test 5, 1st save', false);
5728fb3ff96SSatoshi Sahara        $this->assertFileExists($file);
5738fb3ff96SSatoshi Sahara        $lastmod = filemtime($file);
5748fb3ff96SSatoshi Sahara        $expectedRevs = 1;
5758fb3ff96SSatoshi Sahara        $expect = array(
5768fb3ff96SSatoshi Sahara            'date' => $lastmod,
5778fb3ff96SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_CREATE,
5788fb3ff96SSatoshi Sahara            'sum'  => 'Test 5, 1st save',
5798fb3ff96SSatoshi Sahara            'sizechange' => 10, // = strlen('teststring')
5808fb3ff96SSatoshi Sahara        );
5818fb3ff96SSatoshi Sahara
5828fb3ff96SSatoshi Sahara        $pagelog = new PageChangeLog($page);
5838fb3ff96SSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect);
5848fb3ff96SSatoshi Sahara
5858fb3ff96SSatoshi Sahara        $this->waitForTick(true); // wait for new revision ID
5868fb3ff96SSatoshi Sahara
5878fb3ff96SSatoshi Sahara        // 5.2 external edit
5888fb3ff96SSatoshi Sahara        file_put_contents($file, 'teststring external edit');
5898fb3ff96SSatoshi Sahara        clearstatcache(false, $file);
5908fb3ff96SSatoshi Sahara        $newmod = filemtime($file);
5918fb3ff96SSatoshi Sahara        $this->assertNotEquals($lastmod, $newmod);
5928fb3ff96SSatoshi Sahara        $lastmod = $newmod;
5938fb3ff96SSatoshi Sahara        $expectedRevs = 1; // external edit is not yet in changelog
5948fb3ff96SSatoshi Sahara        $expectExternal = array(
5958fb3ff96SSatoshi Sahara            'date' => $lastmod,
5968fb3ff96SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_EDIT,
5978fb3ff96SSatoshi Sahara            'sum'  => 'external edit',
5988fb3ff96SSatoshi Sahara            'sizechange' => 14,
5998fb3ff96SSatoshi Sahara        );
6008fb3ff96SSatoshi Sahara
6018fb3ff96SSatoshi Sahara        $pagelog = new PageChangeLog($page);
6028fb3ff96SSatoshi Sahara        $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal);
6038fb3ff96SSatoshi Sahara
6048fb3ff96SSatoshi Sahara        $this->waitForTick(); // wait for new revision ID
6058fb3ff96SSatoshi Sahara
6068fb3ff96SSatoshi Sahara        // 5.3 edit and save on top of external edit
6078fb3ff96SSatoshi Sahara        saveWikiText($page, 'teststring normal edit', 'Test 5, 2nd save', false);
6088fb3ff96SSatoshi Sahara        clearstatcache(false, $file);
6098fb3ff96SSatoshi Sahara        $newmod = filemtime($file);
6108fb3ff96SSatoshi Sahara        $this->assertNotEquals($lastmod, $newmod);
6118fb3ff96SSatoshi Sahara        $lastmod = $newmod;
6128fb3ff96SSatoshi Sahara        $expectedRevs = 3; // two more revisions now!
6138fb3ff96SSatoshi Sahara        $expect = array(
6148fb3ff96SSatoshi Sahara            'date' => $lastmod,
6158fb3ff96SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_EDIT,
6168fb3ff96SSatoshi Sahara            'sum'  => 'Test 5, 2nd save',
6178fb3ff96SSatoshi Sahara            'sizechange' => -2,
6188fb3ff96SSatoshi Sahara        );
6198fb3ff96SSatoshi Sahara
6208fb3ff96SSatoshi Sahara        $pagelog = new PageChangeLog($page);
621b7b9a99dSSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect, $expectExternal);
6228fb3ff96SSatoshi Sahara
6238fb3ff96SSatoshi Sahara        $this->waitForTick(); // wait for new revision ID
6248fb3ff96SSatoshi Sahara
6258fb3ff96SSatoshi Sahara        // 5.4 delete
6268fb3ff96SSatoshi Sahara        saveWikiText($page, '', 'Test 5 3rd save', false);
6278fb3ff96SSatoshi Sahara        clearstatcache(false, $file);
6289ad2b913SAndreas Gohr        $this->assertFileDoesNotExist($file);
6298fb3ff96SSatoshi Sahara        $expectedRevs = 4;
6308fb3ff96SSatoshi Sahara        $expect = array(
6318fb3ff96SSatoshi Sahara          //'date' => $lastmod, // ignore from lastRev assertion, but confirm attic file existence
6328fb3ff96SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_DELETE,
6338fb3ff96SSatoshi Sahara            'sum'  => 'Test 5 3rd save',
6348fb3ff96SSatoshi Sahara            'sizechange' => -22,
6358fb3ff96SSatoshi Sahara        );
6368fb3ff96SSatoshi Sahara
6378fb3ff96SSatoshi Sahara        $pagelog = new PageChangeLog($page);
6388fb3ff96SSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect);
6398fb3ff96SSatoshi Sahara
6408fb3ff96SSatoshi Sahara        $this->waitForTick(); // wait for new revision ID
6418fb3ff96SSatoshi Sahara
6428fb3ff96SSatoshi Sahara        // 5.5 create a page, second time
6439ad2b913SAndreas Gohr        $this->assertFileDoesNotExist($file);
6448fb3ff96SSatoshi Sahara        saveWikiText($page, 'teststring revived', 'Test 5, 4th save', false);
6458fb3ff96SSatoshi Sahara        $this->assertFileExists($file);
6468fb3ff96SSatoshi Sahara        $lastmod = filemtime($file);
6478fb3ff96SSatoshi Sahara        $expectedRevs = 5;
6488fb3ff96SSatoshi Sahara        $expect = array(
6498fb3ff96SSatoshi Sahara            'date' => $lastmod,
6508fb3ff96SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_CREATE,
6518fb3ff96SSatoshi Sahara            'sum'  => 'Test 5, 4th save',
6528fb3ff96SSatoshi Sahara            'sizechange' => 18, // = strlen('teststring revived')
6538fb3ff96SSatoshi Sahara        );
6548fb3ff96SSatoshi Sahara
6558fb3ff96SSatoshi Sahara        $pagelog = new PageChangeLog($page);
6568fb3ff96SSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect);
6578fb3ff96SSatoshi Sahara
6588fb3ff96SSatoshi Sahara        $this->waitForTick(true); // wait for new revision ID
6598fb3ff96SSatoshi Sahara
6608fb3ff96SSatoshi Sahara        // 5.6 externally delete
6618fb3ff96SSatoshi Sahara        unlink($file);
6629ad2b913SAndreas Gohr        $this->assertFileDoesNotExist($file);
6638fb3ff96SSatoshi Sahara        $expectedRevs = 5;
6648fb3ff96SSatoshi Sahara        $expectExternal = array(
6658fb3ff96SSatoshi Sahara          //'date' => $lastmod,
6668fb3ff96SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_DELETE,
6678fb3ff96SSatoshi Sahara            'sum'  => 'removed - external edit (Unknown date)',
6688fb3ff96SSatoshi Sahara            'sizechange' => -18,
6698fb3ff96SSatoshi Sahara        );
6708fb3ff96SSatoshi Sahara
6718fb3ff96SSatoshi Sahara        $pagelog = new PageChangeLog($page);
6728fb3ff96SSatoshi Sahara        $this->checkChangeLogAfterExternalEdit($pagelog, $expectedRevs, $expect, $expectExternal);
6738fb3ff96SSatoshi Sahara
6748fb3ff96SSatoshi Sahara        $this->waitForTick(true); // wait for new revision ID
6758fb3ff96SSatoshi Sahara
6768fb3ff96SSatoshi Sahara        // 5.7 create a page, third time
6779ad2b913SAndreas Gohr        $this->assertFileDoesNotExist($file);
6788fb3ff96SSatoshi Sahara        saveWikiText($page, 'teststring revived 2', 'Test 5, 5th save', false);
6798fb3ff96SSatoshi Sahara        clearstatcache(false, $file);
6808fb3ff96SSatoshi Sahara        $this->assertFileExists($file);
6818fb3ff96SSatoshi Sahara        $lastmod = filemtime($file);
6828fb3ff96SSatoshi Sahara        $expectedRevs = 7;
6838fb3ff96SSatoshi Sahara        $expect = array(
6848fb3ff96SSatoshi Sahara            'date' => $lastmod,
6858fb3ff96SSatoshi Sahara            'type' => DOKU_CHANGE_TYPE_CREATE,
6868fb3ff96SSatoshi Sahara            'sum'  => 'Test 5, 5th save',
6878fb3ff96SSatoshi Sahara            'sizechange' => 20, // = strlen('teststring revived 2')
6888fb3ff96SSatoshi Sahara        );
6898fb3ff96SSatoshi Sahara
6908fb3ff96SSatoshi Sahara        $pagelog = new PageChangeLog($page);
691b7b9a99dSSatoshi Sahara        $this->checkChangeLogAfterNormalSave($pagelog, $expectedRevs, $expect, $expectExternal);
6928fb3ff96SSatoshi Sahara    }
6938fb3ff96SSatoshi Sahara
694023953f0SAndreas Gohr}
695