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