xref: /dokuwiki/_test/tests/inc/common_saveWikiText.test.php (revision 3c425c4333b71a561c0eb88f425fa762e66e3387)
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