1<?php
2
3use dokuwiki\ChangeLog\MediaChangeLog;
4use dokuwiki\ChangeLog\PageChangeLog;
5
6/**
7 * Tests for requesting revisioninfo of a revision of a page with getRevisionInfo()
8 *
9 * This class uses the files:
10 * - data/pages/mailinglist.txt
11 * - data/meta/mailinglist.changes
12 */
13class changelog_getlastrevisionat_test extends DokuWikiTest {
14
15    private $pageid = 'mailinglist';
16
17    function setup() : void {
18        parent::setup();
19        global $cache_revinfo;
20        $cache =& $cache_revinfo;
21        unset($cache['nonexist']);
22        unset($cache['mailinglist']);
23    }
24
25
26    /**
27     * no nonexist.changes meta file available
28     */
29    function test_changemetadatanotexists() {
30        $rev = 1362525899;
31        $id = 'nonexist';
32        $revsexpected = false;
33
34        $pagelog = new PageChangeLog($id, $chunk_size = 8192);
35        $revs = $pagelog->getLastRevisionAt($rev);
36        $this->assertEquals($revsexpected, $revs);
37    }
38
39    /**
40     * start at exact current revision of mailinglist page
41     *
42     */
43    function test_startatexactcurrentrev() {
44        $rev = 1385051947;
45        $revsexpected = '';
46
47        //set a known timestamp
48        touch(wikiFN($this->pageid), $rev);
49
50        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
51        $revs = $pagelog->getLastRevisionAt($rev);
52        $this->assertEquals($revsexpected, $revs);
53
54    }
55
56    /**
57     * test a future revision
58     *
59     */
60    function test_futurerev() {
61        $rev = 1385051947;
62        $revsexpected = '';
63
64        //set a known timestamp
65        touch(wikiFN($this->pageid), $rev);
66
67        $rev +=1;
68
69        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
70        $revs = $pagelog->getLastRevisionAt($rev);
71        $this->assertEquals($revsexpected, $revs);
72
73    }
74
75    /**
76     * start at exact last revision of mailinglist page
77     *
78     */
79    function test_exactlastrev() {
80        $rev = 1360110636;
81        $revsexpected = 1360110636;
82
83        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
84        $revs = $pagelog->getLastRevisionAt($rev);
85        $this->assertEquals($revsexpected, $revs);
86    }
87
88
89    /**
90     * Request not existing revision
91     *
92     */
93    function test_olderrev() {
94        $rev = 1;
95        $revexpected = false;
96
97        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
98        $revfound = $pagelog->getLastRevisionAt($rev);
99        $this->assertEquals($revexpected, $revfound);
100    }
101
102    /**
103     * Start at non existing revision somewhere between existing revisions
104     */
105    function test_notexistingrev() {
106        $rev = 1362525890;
107        $revexpected = 1362525359;
108
109        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
110        $revfound = $pagelog->getLastRevisionAt($rev);
111        $this->assertEquals($revexpected, $revfound);
112    }
113
114    /**
115     * request nonexisting page
116     *
117     */
118    function test_notexistingpage() {
119        $rev = 1385051947;
120        $currentexpected = false;
121
122        $pagelog = new PageChangeLog('nonexistingpage', $chunk_size = 8192);
123        $current = $pagelog->getLastRevisionAt($rev);
124        $this->assertEquals($currentexpected, $current);
125    }
126
127    /**
128     * test get correct revision on deleted media
129     *
130     */
131    function test_deletedimage() {
132        global $conf;
133        global $AUTH_ACL;
134
135        //we need to have a user with AUTH_DELETE rights
136        //save settings
137        $oldSuperUser = $conf['superuser'];
138        $oldUseacl = $conf['useacl'];
139        $oldRemoteUser = isset($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'] : null;
140
141        $conf['superuser'] = 'admin';
142        $conf['useacl']    = 1;
143        $_SERVER['REMOTE_USER'] = 'admin';
144
145        $image = 'wiki:imageat.png';
146
147        $ret = copy(mediaFn('wiki:kind_zu_katze.png'),mediaFn($image));
148
149        $revexpected = @filemtime(mediaFn($image));
150        $rev = $revexpected + 10;
151
152        $this->waitForTick(true);
153
154        $ret = media_delete($image, 0);
155
156        $medialog = new MediaChangeLog($image);
157        $current = $medialog->getLastRevisionAt($rev);
158        // as we wait for a tick, we should get something greater than the timestamp
159        $this->assertGreaterThan($revexpected, $current);
160        // however, it should be less than the current time or equal to it
161        $this->assertLessThanOrEqual(time(), $current);
162
163        //restore settings
164        if ($oldRemoteUser !== null) {
165            $_SERVER['REMOTE_USER'] = $oldRemoteUser;
166        }
167        $conf['superuser'] = $oldSuperUser;
168        $conf['useacl'] = $oldUseacl;
169    }
170}
171