1<?php
2
3use dokuwiki\ChangeLog\PageChangeLog;
4
5/**
6 * Tests for requesting revisions of a page with getRevisions()
7 *
8 * This class uses the files:
9 * - data/pages/mailinglist.txt
10 * - data/meta/mailinglist.changes
11 */
12class changelog_getrevisionsaround_test extends DokuWikiTest {
13
14    /**
15     * list of revisions in mailinglist.changes
16     */
17    private $revsexpected = array(
18        1374261194, //current page
19        1371579614, 1368622240,
20        1368622195, 1368622152,
21        1368612599, 1368612506,
22        1368609772, 1368575634,
23        1363436892, 1362527164,
24        1362527046, 1362526861,
25        1362526767, 1362526167,
26        1362526119, 1362526039,
27        1362525926, 1362525899,
28        1362525359, 1362525145,
29        1362524799, 1361901536,
30        1360110636
31    );
32    private $pageid = 'mailinglist';
33
34    function setup() : void {
35        parent::setup();
36        global $cache_revinfo;
37        $cache =& $cache_revinfo;
38        unset($cache['nonexist']);
39        unset($cache['mailinglist']);
40        // fix filemtime of page source
41        touch(wikiFN($this->pageid), $this->revsexpected[0]);
42    }
43
44    /**
45     * no nonexist.changes meta file available
46     */
47    function test_changemetadatanotexists() {
48        $rev1 = 1362526767;
49        $rev2 = 1362527164;
50        $max = 50;
51        $id = 'nonexist';
52        $revsexpected = array(array(), array());
53
54        $pagelog = new PageChangeLog($id, $chunk_size = 8192);
55        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
56        $this->assertEquals($revsexpected, $revs);
57    }
58
59    /**
60     * Surrounding revisions of rev1 and rev2 overlaps
61     */
62    function test_request_overlapping() {
63        $rev1 = 1362526767;
64        $rev2 = 1362527164;
65        $max = 10;
66        $revsexpected = array(
67            array_slice($this->revsexpected, 8, 11),
68            array_slice($this->revsexpected, 5, 11)
69        );
70
71        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
72        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
73        $this->assertEquals($revsexpected, $revs);
74
75        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 512);
76        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
77        $this->assertEquals($revsexpected, $revs);
78
79        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 20);
80        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
81        $this->assertEquals($revsexpected, $revs);
82    }
83
84    /**
85     * Surrounding revisions of rev1 and rev2 don't overlap.
86     */
87    function test_request_non_overlapping() {
88        $rev1 = 1362525899;
89        $rev2 = 1368612599;
90        $max = 10;
91        $revsexpected = array(
92            array_slice($this->revsexpected, 13, 11),
93            array_slice($this->revsexpected, 0, 11)
94        );
95
96        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
97        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
98        $this->assertEquals($revsexpected, $revs);
99
100        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 512);
101        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
102        $this->assertEquals($revsexpected, $revs);
103
104        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 20);
105        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
106        $this->assertEquals($revsexpected, $revs);
107    }
108
109    /**
110     * rev1 and rev2 are at start and end of the changelog.
111     * Should return still a number of revisions equal to max
112     */
113    function test_request_first_last() {
114        $rev1 = 1360110636;
115        $rev2 = 1374261194;
116        $max = 10;
117        $revsexpected = array(
118            array_slice($this->revsexpected, 13, 11),
119            array_slice($this->revsexpected, 0, 11)
120        );
121
122        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
123        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
124        $this->assertEquals($revsexpected, $revs);
125
126        //todo: number of revisions on the left side is not (yet) completed until max number
127        $revsexpected = array(
128            array_slice($this->revsexpected, 18, 6),
129            array_slice($this->revsexpected, 0, 11)
130        );
131        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 512);
132        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
133        $this->assertEquals($revsexpected, $revs);
134
135        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 20);
136        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
137        $this->assertEquals($revsexpected, $revs);
138    }
139
140
141    /**
142     * Number of requested revisions is larger than available revisions,
143     * so returns whole log
144     */
145    function test_request_wholelog() {
146        $rev1 = 1362525899;
147        $rev2 = 1368612599;
148        $max = 50;
149        $revsexpected = array($this->revsexpected, $this->revsexpected);
150
151        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
152        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
153        $this->assertEquals($revsexpected, $revs);
154
155        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 512);
156        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
157        $this->assertEquals($revsexpected, $revs);
158
159        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 20);
160        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
161        $this->assertEquals($revsexpected, $revs);
162    }
163
164    /**
165     * When rev1 > rev2, their order is changed
166     */
167    function test_request_wrong_order_revs() {
168        $rev1 = 1362527164;
169        $rev2 = 1362526767;
170        $max = 10;
171        $revsexpected = array(
172            array_slice($this->revsexpected, 8, 11),
173            array_slice($this->revsexpected, 5, 11)
174        );
175
176        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
177        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
178        $this->assertEquals($revsexpected, $revs);
179
180        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 512);
181        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
182        $this->assertEquals($revsexpected, $revs);
183
184        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 20);
185        $revs = $pagelog->getRevisionsAround($rev1, $rev2, $max);
186        $this->assertEquals($revsexpected, $revs);
187    }
188
189}
190