xref: /dokuwiki/_test/tests/inc/common_saveWikiText.test.php (revision 924cc11c61f9b6b0b947b36046ae4deb179dcb33)
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
27        sleep(1); // wait for new revision ID
28
29        // save with same content should be ignored
30        saveWikiText($page, 'teststring', 'second save', false);
31        clearstatcache(false, $file);
32        $this->assertEquals($lastmod, filemtime($file));
33
34        $pagelog = new PageChangeLog($page);
35        $revisions = $pagelog->getRevisions(-1, 200);
36        $this->assertEquals(1, count($revisions));
37
38        // update the page with new text
39        saveWikiText($page, 'teststring2', 'third save', false);
40        clearstatcache(false, $file);
41        $newmod = filemtime($file);
42        $this->assertNotEquals($lastmod, $newmod);
43        $lastmod = $newmod;
44
45        $pagelog = new PageChangeLog($page);
46        $revisions = $pagelog->getRevisions(-1, 200);
47        $this->assertEquals(2, count($revisions));
48        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
49        $this->assertEquals('third save', $revinfo['sum']);
50        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
51
52        sleep(1); // wait for new revision ID
53
54        // add a minor edit (unauthenticated)
55        saveWikiText($page, 'teststring3', 'fourth save', true);
56        clearstatcache(false, $file);
57        $newmod = filemtime($file);
58        $this->assertNotEquals($lastmod, $newmod);
59        $lastmod = $newmod;
60
61        $pagelog = new PageChangeLog($page);
62        $revisions = $pagelog->getRevisions(-1, 200);
63        $this->assertEquals(3, count($revisions));
64        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
65        $this->assertEquals('fourth save', $revinfo['sum']);
66        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
67
68        sleep(1); // wait for new revision ID
69
70        // add a minor edit (authenticated)
71        $_SERVER['REMOTE_USER'] = 'user';
72        saveWikiText($page, 'teststring4', 'fifth save', true);
73        clearstatcache(false, $file);
74        $newmod = filemtime($file);
75        $this->assertNotEquals($lastmod, $newmod);
76        $lastmod = $newmod;
77
78        $pagelog = new PageChangeLog($page);
79        $revisions = $pagelog->getRevisions(-1, 200);
80        $this->assertEquals(4, count($revisions));
81        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
82        $this->assertEquals('fifth save', $revinfo['sum']);
83        $this->assertEquals(DOKU_CHANGE_TYPE_MINOR_EDIT, $revinfo['type']);
84
85        sleep(1); // wait for new revision ID
86
87        // delete
88        saveWikiText($page, '', 'sixth save', false);
89        clearstatcache(false, $file);
90        $this->assertFileNotExists($file);
91
92        $pagelog = new PageChangeLog($page);
93        $revisions = $pagelog->getRevisions(-1, 200);
94        $this->assertEquals(5, count($revisions));
95        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
96        $this->assertEquals('sixth save', $revinfo['sum']);
97        $this->assertEquals(DOKU_CHANGE_TYPE_DELETE, $revinfo['type']);
98
99        sleep(1); // wait for new revision ID
100
101        // restore
102        $REV = $lastmod;
103        saveWikiText($page, 'teststring4', 'seventh save', true);
104        clearstatcache(false, $file);
105        $this->assertFileExists($file);
106        $newmod = filemtime($file);
107        $this->assertNotEquals($lastmod, $newmod);
108        $lastmod = $newmod;
109
110        $pagelog = new PageChangeLog($page);
111        $revisions = $pagelog->getRevisions(-1, 200);
112        $this->assertEquals(6, count($revisions));
113        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
114        $this->assertEquals('seventh save', $revinfo['sum']);
115        $this->assertEquals(DOKU_CHANGE_TYPE_REVERT, $revinfo['type']);
116        $this->assertEquals($REV, $revinfo['extra']);
117        $REV = '';
118
119        sleep(1); // wait for new revision ID
120
121        // create external edit
122        file_put_contents($file, 'teststring5');
123
124        sleep(1); // wait for new revision ID
125
126        // save on top of external edit
127        saveWikiText($page, 'teststring6', 'eigth save', false);
128        clearstatcache(false, $file);
129        $newmod = filemtime($file);
130        $this->assertNotEquals($lastmod, $newmod);
131        $lastmod = $newmod;
132
133        $pagelog = new PageChangeLog($page);
134        $revisions = $pagelog->getRevisions(-1, 200);
135        $this->assertEquals(8, count($revisions)); // two more revisions now!
136        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
137        $this->assertEquals('eigth save', $revinfo['sum']);
138        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
139
140        $revinfo = $pagelog->getRevisionInfo($revisions[1]);
141        $this->assertEquals('external edit', $revinfo['sum']);
142        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
143
144    }
145}
146