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