xref: /dokuwiki/_test/tests/inc/common_saveWikiText.test.php (revision 920904359a7088e3cf3885a96c03c453aa9e4095)
1<?php
2
3class common_saveWikiText_test extends DokuWikiTest {
4
5    /**
6     * Execute a whole bunch of saves on the same page and check the results
7     */
8    function test_savesequence() {
9        global $REV;
10
11        $page = 'page';
12        $file = wikiFN($page);
13
14        // create the page
15        $this->assertFileNotExists($file);
16        saveWikiText($page, 'teststring', 'first save', false);
17        $this->assertFileExists($file);
18        $lastmod = filemtime($file);
19
20        $pagelog = new PageChangeLog($page);
21        $revisions = $pagelog->getRevisions(-1, 200);
22        $this->assertEquals(1, count($revisions));
23        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
24        $this->assertEquals('first save', $revinfo['sum']);
25        $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']);
26        $this->assertEquals(10, $revinfo['sizechange']);
27
28        sleep(1); // wait for new revision ID
29
30        // save with same content should be ignored
31        saveWikiText($page, 'teststring', 'second save', false);
32        clearstatcache(false, $file);
33        $this->assertEquals($lastmod, filemtime($file));
34
35        $pagelog = new PageChangeLog($page);
36        $revisions = $pagelog->getRevisions(-1, 200);
37        $this->assertEquals(1, count($revisions));
38
39        // update the page with new text
40        saveWikiText($page, 'teststring2long', 'third save', false);
41        clearstatcache(false, $file);
42        $newmod = filemtime($file);
43        $this->assertNotEquals($lastmod, $newmod);
44        $lastmod = $newmod;
45
46        $pagelog = new PageChangeLog($page);
47        $revisions = $pagelog->getRevisions(-1, 200);
48        $this->assertEquals(2, count($revisions));
49        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
50        $this->assertEquals('third save', $revinfo['sum']);
51        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
52        $this->assertEquals(5, $revinfo['sizechange']);
53
54        sleep(1); // wait for new revision ID
55
56        // add a minor edit (unauthenticated)
57        saveWikiText($page, 'teststring3long', 'fourth save', true);
58        clearstatcache(false, $file);
59        $newmod = filemtime($file);
60        $this->assertNotEquals($lastmod, $newmod);
61        $lastmod = $newmod;
62
63        $pagelog = new PageChangeLog($page);
64        $revisions = $pagelog->getRevisions(-1, 200);
65        $this->assertEquals(3, count($revisions));
66        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
67        $this->assertEquals('fourth save', $revinfo['sum']);
68        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
69        $this->assertEquals(0, $revinfo['sizechange']);
70
71        sleep(1); // wait for new revision ID
72
73        // add a minor edit (authenticated)
74        $_SERVER['REMOTE_USER'] = 'user';
75        saveWikiText($page, 'teststring4', 'fifth save', true);
76        clearstatcache(false, $file);
77        $newmod = filemtime($file);
78        $this->assertNotEquals($lastmod, $newmod);
79        $lastmod = $newmod;
80
81        $pagelog = new PageChangeLog($page);
82        $revisions = $pagelog->getRevisions(-1, 200);
83        $this->assertEquals(4, count($revisions));
84        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
85        $this->assertEquals('fifth save', $revinfo['sum']);
86        $this->assertEquals(DOKU_CHANGE_TYPE_MINOR_EDIT, $revinfo['type']);
87        $this->assertEquals(-4, $revinfo['sizechange']);
88
89        sleep(1); // wait for new revision ID
90
91        // delete
92        saveWikiText($page, '', 'sixth save', false);
93        clearstatcache(false, $file);
94        $this->assertFileNotExists($file);
95
96        $pagelog = new PageChangeLog($page);
97        $revisions = $pagelog->getRevisions(-1, 200);
98        $this->assertEquals(5, count($revisions));
99        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
100        $this->assertEquals('sixth save', $revinfo['sum']);
101        $this->assertEquals(DOKU_CHANGE_TYPE_DELETE, $revinfo['type']);
102        $this->assertEquals(-11, $revinfo['sizechange']);
103
104        sleep(1); // wait for new revision ID
105
106        // restore
107        $REV = $lastmod;
108        saveWikiText($page, 'teststring4', 'seventh save', true);
109        clearstatcache(false, $file);
110        $this->assertFileExists($file);
111        $newmod = filemtime($file);
112        $this->assertNotEquals($lastmod, $newmod);
113        $lastmod = $newmod;
114
115        $pagelog = new PageChangeLog($page);
116        $revisions = $pagelog->getRevisions(-1, 200);
117        $this->assertEquals(6, count($revisions));
118        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
119        $this->assertEquals('seventh save', $revinfo['sum']);
120        $this->assertEquals(DOKU_CHANGE_TYPE_REVERT, $revinfo['type']);
121        $this->assertEquals($REV, $revinfo['extra']);
122        $this->assertEquals(11, $revinfo['sizechange']);
123        $REV = '';
124
125        sleep(1); // wait for new revision ID
126
127        // create external edit
128        file_put_contents($file, 'teststring5');
129
130        sleep(1); // wait for new revision ID
131
132        // save on top of external edit
133        saveWikiText($page, 'teststring6', 'eigth save', false);
134        clearstatcache(false, $file);
135        $newmod = filemtime($file);
136        $this->assertNotEquals($lastmod, $newmod);
137        $lastmod = $newmod;
138
139        $pagelog = new PageChangeLog($page);
140        $revisions = $pagelog->getRevisions(-1, 200);
141        $this->assertEquals(8, count($revisions)); // two more revisions now!
142        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
143        $this->assertEquals('eigth save', $revinfo['sum']);
144        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
145        $this->assertEquals(0, $revinfo['sizechange']);
146
147        $revinfo = $pagelog->getRevisionInfo($revisions[1]);
148        $this->assertEquals('external edit', $revinfo['sum']);
149        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
150        $this->assertEquals(0, $revinfo['sizechange']);
151
152    }
153
154    /**
155     * Execute a whole bunch of saves on the same page and check the results
156     */
157    function test_savesequencedeleteexternalrevision() {
158        $page = 'page2';
159        $file = wikiFN($page);
160
161        // create the page
162        $this->assertFileNotExists($file);
163        saveWikiText($page, 'teststring', 'first save', false);
164        $this->assertFileExists($file);
165        $lastmod = filemtime($file);
166
167        $pagelog = new PageChangeLog($page);
168        $revisions = $pagelog->getRevisions(-1, 200);
169        $this->assertEquals(1, count($revisions));
170        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
171        $this->assertEquals('first save', $revinfo['sum']);
172        $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']);
173        $this->assertEquals(10, $revinfo['sizechange']);
174
175        sleep(1); // wait for new revision ID
176
177        // delete
178        saveWikiText($page, '', 'second save', false);
179        clearstatcache(false, $file);
180        $this->assertFileNotExists($file);
181
182        $pagelog = new PageChangeLog($page);
183        $revisions = $pagelog->getRevisions(-1, 200);
184        $this->assertEquals(2, count($revisions));
185        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
186        $this->assertEquals('second save', $revinfo['sum']);
187        $this->assertEquals(DOKU_CHANGE_TYPE_DELETE, $revinfo['type']);
188        $this->assertEquals(-10, $revinfo['sizechange']);
189
190        sleep(1); // wait for new revision ID
191
192        // create external edit
193        file_put_contents($file, 'teststring5');
194
195        sleep(1); // wait for new revision ID
196
197        // save on top of external edit
198        saveWikiText($page, 'teststring6', 'third save', false);
199        clearstatcache(false, $file);
200
201        $pagelog = new PageChangeLog($page);
202        $revisions = $pagelog->getRevisions(-1, 200);
203        $this->assertEquals(4, count($revisions)); // two more revisions now!
204        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
205        $this->assertEquals('third save', $revinfo['sum']);
206        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
207        $this->assertEquals(0, $revinfo['sizechange']);
208
209        $revinfo = $pagelog->getRevisionInfo($revisions[1]);
210        $this->assertEquals('external edit', $revinfo['sum']);
211        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
212        $this->assertEquals(11, $revinfo['sizechange']);
213
214    }
215
216    /**
217     * Execute a whole bunch of saves on the same page and check the results
218     */
219    function test_saveexternalasfirst() {
220        $page = 'page3';
221        $file = wikiFN($page);
222
223        // create the page
224        $this->assertFileNotExists($file);
225
226        // create external edit
227        file_put_contents($file, 'teststring');
228
229        sleep(1); // wait for new revision ID
230
231        // save on top of external edit
232        saveWikiText($page, 'teststring6', 'first save', false);
233        clearstatcache(false, $file);
234
235        $pagelog = new PageChangeLog($page);
236        $revisions = $pagelog->getRevisions(-1, 200);
237        $this->assertEquals(2, count($revisions)); // two more revisions now!
238        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
239        $this->assertEquals('first save', $revinfo['sum']);
240        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
241        $this->assertEquals(1, $revinfo['sizechange']);
242
243        $revinfo = $pagelog->getRevisionInfo($revisions[1]);
244        $this->assertEquals('external edit', $revinfo['sum']);
245        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
246        $this->assertEquals(10, $revinfo['sizechange']);
247
248    }
249
250    /**
251     * Execute a whole bunch of saves on the same page and check the results
252     */
253    function test_savesequenceexternaldeleteedit() {
254        $page = 'page4';
255        $file = wikiFN($page);
256
257        // create the page
258        $this->assertFileNotExists($file);
259        saveWikiText($page, 'teststring', 'first save', false);
260        $this->assertFileExists($file);
261        $lastmod = filemtime($file);
262
263        $pagelog = new PageChangeLog($page);
264        $revisions = $pagelog->getRevisions(-1, 200);
265        $this->assertEquals(1, count($revisions));
266        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
267        $this->assertEquals('first save', $revinfo['sum']);
268        $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']);
269        $this->assertEquals(10, $revinfo['sizechange']);
270
271        sleep(1); // wait for new revision ID
272
273
274        // create external delete
275        unlink($file);
276        clearstatcache(false, $file);
277
278        sleep(1); // wait for new revision ID
279
280        // save on top of external delete. save is seen as creation
281        saveWikiText($page, 'teststring6', 'second save', false);
282        clearstatcache(false, $file);
283
284        $pagelog = new PageChangeLog($page);
285        $revisions = $pagelog->getRevisions(-1, 200);
286        $this->assertEquals(2, count($revisions)); // one more revisions now!
287        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
288        $this->assertEquals('second save', $revinfo['sum']);
289        $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']);
290        $this->assertEquals(11, $revinfo['sizechange']);
291
292        $revinfo = $pagelog->getRevisionInfo($revisions[1]);
293        $this->assertEquals('first save', $revinfo['sum']);
294
295    }
296
297    /**
298     * Execute a whole bunch of saves on the same page and check the results
299     */
300    function test_savesequencerevert() {
301        global $REV;
302
303        $page = 'page5';
304        $file = wikiFN($page);
305
306        // create the page
307        $this->assertFileNotExists($file);
308        saveWikiText($page, 'teststring', 'first save', false);
309        $this->assertFileExists($file);
310        $lastmod = filemtime($file);
311
312        $pagelog = new PageChangeLog($page);
313        $revisions = $pagelog->getRevisions(-1, 200);
314        $this->assertEquals(1, count($revisions));
315        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
316        $this->assertEquals('first save', $revinfo['sum']);
317        $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']);
318        $this->assertEquals(10, $revinfo['sizechange']);
319
320        sleep(1); // wait for new revision ID
321
322        // save with same content should be ignored
323        saveWikiText($page, 'teststring', 'second save', false);
324        clearstatcache(false, $file);
325        $this->assertEquals($lastmod, filemtime($file));
326
327        $pagelog = new PageChangeLog($page);
328        $revisions = $pagelog->getRevisions(-1, 200);
329        $this->assertEquals(1, count($revisions));
330
331        // update the page with new text
332        saveWikiText($page, 'teststring2long', 'third save', false);
333        clearstatcache(false, $file);
334        $newmod = filemtime($file);
335        $this->assertNotEquals($lastmod, $newmod);
336        $lastmod = $newmod;
337        $revertrev = $newmod;
338
339        $pagelog = new PageChangeLog($page);
340        $revisions = $pagelog->getRevisions(-1, 200);
341        $this->assertEquals(2, count($revisions));
342        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
343        $this->assertEquals('third save', $revinfo['sum']);
344        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
345        $this->assertEquals(5, $revinfo['sizechange']);
346
347        sleep(1); // wait for new revision ID
348
349        // add a minor edit (unauthenticated)
350        saveWikiText($page, 'teststring3long', 'fourth save', true);
351        clearstatcache(false, $file);
352        $newmod = filemtime($file);
353        $this->assertNotEquals($lastmod, $newmod);
354        $lastmod = $newmod;
355
356        $pagelog = new PageChangeLog($page);
357        $revisions = $pagelog->getRevisions(-1, 200);
358        $this->assertEquals(3, count($revisions));
359        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
360        $this->assertEquals('fourth save', $revinfo['sum']);
361        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
362        $this->assertEquals(0, $revinfo['sizechange']);
363
364        sleep(1); // wait for new revision ID
365
366        // add a minor edit (authenticated)
367        $_SERVER['REMOTE_USER'] = 'user';
368        saveWikiText($page, 'teststring4', 'fifth save', true);
369        clearstatcache(false, $file);
370        $newmod = filemtime($file);
371        $this->assertNotEquals($lastmod, $newmod);
372        $lastmod = $newmod;
373
374        $pagelog = new PageChangeLog($page);
375        $revisions = $pagelog->getRevisions(-1, 200);
376        $this->assertEquals(4, count($revisions));
377        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
378        $this->assertEquals('fifth save', $revinfo['sum']);
379        $this->assertEquals(DOKU_CHANGE_TYPE_MINOR_EDIT, $revinfo['type']);
380        $this->assertEquals(-4, $revinfo['sizechange']);
381
382        sleep(1); // wait for new revision ID
383
384        // restore
385        $REV = $revertrev;
386        saveWikiText($page, 'teststring2long', 'sixth save', true);
387        clearstatcache(false, $file);
388        $this->assertFileExists($file);
389        $newmod = filemtime($file);
390        $this->assertNotEquals($lastmod, $newmod);
391
392        $pagelog = new PageChangeLog($page);
393        $revisions = $pagelog->getRevisions(-1, 200);
394        $this->assertEquals(5, count($revisions));
395        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
396        $this->assertEquals('sixth save', $revinfo['sum']);
397        $this->assertEquals(DOKU_CHANGE_TYPE_REVERT, $revinfo['type']);
398        $this->assertEquals($REV, $revinfo['extra']);
399        $this->assertEquals(4, $revinfo['sizechange']);
400        $REV = '';
401    }
402
403}
404