xref: /dokuwiki/_test/tests/Remote/ApiCoreTest.php (revision 61d21e86ed667b6b4110b90d683dddf13903de67)
153585189SAndreas Gohr<?php
253585189SAndreas Gohr
353585189SAndreas Gohrnamespace dokuwiki\test\Remote;
453585189SAndreas Gohr
5d1f06eb4SAndreas Gohruse dokuwiki\Remote\AccessDeniedException;
653585189SAndreas Gohruse dokuwiki\Remote\Api;
753585189SAndreas Gohruse dokuwiki\Remote\ApiCore;
8d1f06eb4SAndreas Gohruse dokuwiki\Remote\RemoteException;
953585189SAndreas Gohruse dokuwiki\test\mock\AuthPlugin;
1053585189SAndreas Gohr
11d1f06eb4SAndreas Gohr
1253585189SAndreas Gohr/**
1353585189SAndreas Gohr * Class remoteapicore_test
1453585189SAndreas Gohr */
1553585189SAndreas Gohrclass ApiCoreTest extends \DokuWikiTest
1653585189SAndreas Gohr{
1753585189SAndreas Gohr
1853585189SAndreas Gohr    protected $userinfo;
1953585189SAndreas Gohr    protected $oldAuthAcl;
2053585189SAndreas Gohr    /** @var  Api */
2153585189SAndreas Gohr    protected $remote;
2253585189SAndreas Gohr
2353585189SAndreas Gohr    public function setUp(): void
2453585189SAndreas Gohr    {
2553585189SAndreas Gohr        // we need a clean setup before each single test:
2653585189SAndreas Gohr        \DokuWikiTest::setUpBeforeClass();
2753585189SAndreas Gohr
2853585189SAndreas Gohr        parent::setUp();
2953585189SAndreas Gohr        global $conf;
3053585189SAndreas Gohr        global $USERINFO;
3153585189SAndreas Gohr        global $AUTH_ACL;
3253585189SAndreas Gohr        global $auth;
3353585189SAndreas Gohr        $this->oldAuthAcl = $AUTH_ACL;
3453585189SAndreas Gohr        $this->userinfo = $USERINFO;
3553585189SAndreas Gohr        $auth = new AuthPlugin();
3653585189SAndreas Gohr
3753585189SAndreas Gohr        $conf['remote'] = 1;
3853585189SAndreas Gohr        $conf['remoteuser'] = '@user';
3953585189SAndreas Gohr        $conf['useacl'] = 0;
4053585189SAndreas Gohr
4153585189SAndreas Gohr        $this->remote = new Api();
4253585189SAndreas Gohr    }
4353585189SAndreas Gohr
4453585189SAndreas Gohr    public function tearDown(): void
4553585189SAndreas Gohr    {
4653585189SAndreas Gohr        parent::tearDown();
4753585189SAndreas Gohr
4853585189SAndreas Gohr        global $USERINFO;
4953585189SAndreas Gohr        global $AUTH_ACL;
5053585189SAndreas Gohr
5153585189SAndreas Gohr        $USERINFO = $this->userinfo;
5253585189SAndreas Gohr        $AUTH_ACL = $this->oldAuthAcl;
5353585189SAndreas Gohr    }
5453585189SAndreas Gohr
55d1f06eb4SAndreas Gohr    /**
56d1f06eb4SAndreas Gohr     * Do an assertion that converts to JSON inbetween
57d1f06eb4SAndreas Gohr     *
58d1f06eb4SAndreas Gohr     * This lets us compare result objects with arrays
59d1f06eb4SAndreas Gohr     */
60d1f06eb4SAndreas Gohr    protected function assertEqualResult($expected, $actual, $msg = '')
6153585189SAndreas Gohr    {
62d1f06eb4SAndreas Gohr        // sort object arrays
63d1f06eb4SAndreas Gohr        if (is_array($actual) && array_key_exists(0, $actual) && is_object($actual[0])) {
64d1f06eb4SAndreas Gohr            sort($actual);
65d1f06eb4SAndreas Gohr            sort($expected);
6653585189SAndreas Gohr        }
6753585189SAndreas Gohr
68d1f06eb4SAndreas Gohr        $expected = json_decode(json_encode($expected), true);
69d1f06eb4SAndreas Gohr        $actual = json_decode(json_encode($actual), true);
70d1f06eb4SAndreas Gohr        $this->assertEquals($expected, $actual, $msg);
7153585189SAndreas Gohr    }
7253585189SAndreas Gohr
73d1f06eb4SAndreas Gohr    // region info
74d1f06eb4SAndreas Gohr
75d1f06eb4SAndreas Gohr    // core.getAPIVersion
76d1f06eb4SAndreas Gohr    public function testGetAPIVersion()
7753585189SAndreas Gohr    {
78d1f06eb4SAndreas Gohr        $this->assertEqualResult(
79d1f06eb4SAndreas Gohr            ApiCore::API_VERSION,
80d1f06eb4SAndreas Gohr            $this->remote->call('core.getAPIVersion')
81d1f06eb4SAndreas Gohr        );
82d1f06eb4SAndreas Gohr    }
83d1f06eb4SAndreas Gohr
84d1f06eb4SAndreas Gohr    // core.getWikiVersion
85d1f06eb4SAndreas Gohr    public function testGetWikiVersion()
86d1f06eb4SAndreas Gohr    {
87d1f06eb4SAndreas Gohr        $this->assertEqualResult(
88d1f06eb4SAndreas Gohr            getVersion(),
89d1f06eb4SAndreas Gohr            $this->remote->call('core.getWikiVersion')
90d1f06eb4SAndreas Gohr        );
91d1f06eb4SAndreas Gohr    }
92d1f06eb4SAndreas Gohr
93d1f06eb4SAndreas Gohr    // core.getWikiTitle
94d1f06eb4SAndreas Gohr    public function testGetWikiTitle()
95d1f06eb4SAndreas Gohr    {
96d1f06eb4SAndreas Gohr        global $conf;
97d1f06eb4SAndreas Gohr        $this->assertEqualResult(
98d1f06eb4SAndreas Gohr            $conf['title'],
99d1f06eb4SAndreas Gohr            $this->remote->call('core.getWikiTitle')
100d1f06eb4SAndreas Gohr        );
101d1f06eb4SAndreas Gohr    }
102d1f06eb4SAndreas Gohr
103d1f06eb4SAndreas Gohr    // core.getWikiTime
104d1f06eb4SAndreas Gohr    public function testGetWikiTime()
105d1f06eb4SAndreas Gohr    {
106d1f06eb4SAndreas Gohr        $this->assertEqualsWithDelta(
107d1f06eb4SAndreas Gohr            time(),
108d1f06eb4SAndreas Gohr            $this->remote->call('core.getWikiTime'),
109d1f06eb4SAndreas Gohr            1 // allow 1 second difference
110d1f06eb4SAndreas Gohr        );
111d1f06eb4SAndreas Gohr    }
112d1f06eb4SAndreas Gohr
113d1f06eb4SAndreas Gohr    // endregion
114d1f06eb4SAndreas Gohr
115d1f06eb4SAndreas Gohr    // region user
116d1f06eb4SAndreas Gohr
117d1f06eb4SAndreas Gohr    // core.login
118d1f06eb4SAndreas Gohr    public function testLogin()
119d1f06eb4SAndreas Gohr    {
120d1f06eb4SAndreas Gohr        $this->markTestIncomplete('Missing test for core.login API Call');
121d1f06eb4SAndreas Gohr    }
122d1f06eb4SAndreas Gohr
123d1f06eb4SAndreas Gohr    // core.logoff
124d1f06eb4SAndreas Gohr    public function testLogoff()
125d1f06eb4SAndreas Gohr    {
126d1f06eb4SAndreas Gohr        $this->markTestIncomplete('Missing test for core.logoff API Call');
127d1f06eb4SAndreas Gohr    }
128d1f06eb4SAndreas Gohr
129d1f06eb4SAndreas Gohr    // core.whoAmI
130d1f06eb4SAndreas Gohr    public function testWhoAmI()
131d1f06eb4SAndreas Gohr    {
132d1f06eb4SAndreas Gohr        $this->markTestIncomplete('Missing test for core.whoAmI API Call');
133d1f06eb4SAndreas Gohr    }
134d1f06eb4SAndreas Gohr
135d1f06eb4SAndreas Gohr    // core.aclCheck -> See also ApiCoreAclCheckTest.php
136d1f06eb4SAndreas Gohr    public function testAclCheck()
137d1f06eb4SAndreas Gohr    {
138d1f06eb4SAndreas Gohr        $id = 'aclpage';
139d1f06eb4SAndreas Gohr
140d1f06eb4SAndreas Gohr        $this->assertEquals(AUTH_UPLOAD, $this->remote->call('core.aclCheck', ['page' => $id]));
141d1f06eb4SAndreas Gohr
142d1f06eb4SAndreas Gohr        global $conf;
143d1f06eb4SAndreas Gohr        global $AUTH_ACL;
144d1f06eb4SAndreas Gohr        global $USERINFO;
145d1f06eb4SAndreas Gohr        $conf['useacl'] = 1;
146d1f06eb4SAndreas Gohr        $_SERVER['REMOTE_USER'] = 'john';
147d1f06eb4SAndreas Gohr        $USERINFO['grps'] = ['user'];
148d1f06eb4SAndreas Gohr        $AUTH_ACL = [
149d1f06eb4SAndreas Gohr            '*                  @ALL           0',
150d1f06eb4SAndreas Gohr            '*                  @user          2', //edit
151d1f06eb4SAndreas Gohr        ];
152d1f06eb4SAndreas Gohr
153d1f06eb4SAndreas Gohr        $this->assertEquals(AUTH_EDIT, $this->remote->call('core.aclCheck', ['page' => $id]));
154d1f06eb4SAndreas Gohr    }
155d1f06eb4SAndreas Gohr
156d1f06eb4SAndreas Gohr
157d1f06eb4SAndreas Gohr    // endregion
158d1f06eb4SAndreas Gohr
159d1f06eb4SAndreas Gohr    // region pages
160d1f06eb4SAndreas Gohr
161d1f06eb4SAndreas Gohr    // core.listPages
162d1f06eb4SAndreas Gohr    public function testlistPagesAll()
163d1f06eb4SAndreas Gohr    {
164d1f06eb4SAndreas Gohr        // all pages depends on index
165d1f06eb4SAndreas Gohr        idx_addPage('wiki:syntax');
166d1f06eb4SAndreas Gohr        idx_addPage('wiki:dokuwiki');
167d1f06eb4SAndreas Gohr
168d1f06eb4SAndreas Gohr        $file1 = wikiFN('wiki:syntax');
169d1f06eb4SAndreas Gohr        $file2 = wikiFN('wiki:dokuwiki');
170d1f06eb4SAndreas Gohr
17153585189SAndreas Gohr        $expected = [
17253585189SAndreas Gohr            [
173d1f06eb4SAndreas Gohr                'id' => 'wiki:syntax',
174d1f06eb4SAndreas Gohr                'title' => 'wiki:syntax',
175d1f06eb4SAndreas Gohr                'permission' => 8,
17653585189SAndreas Gohr                'size' => filesize($file1),
177d1f06eb4SAndreas Gohr                'revision' => filemtime($file1),
1786535a28fSEduardo Mozart de Oliveira                'hash' => md5(trim(io_readFile($file1))),
179d1f06eb4SAndreas Gohr                'author' => '',
18053585189SAndreas Gohr            ],
18153585189SAndreas Gohr            [
182d1f06eb4SAndreas Gohr                'id' => 'wiki:dokuwiki',
183d1f06eb4SAndreas Gohr                'title' => 'wiki:dokuwiki',
184d1f06eb4SAndreas Gohr                'permission' => 8,
18553585189SAndreas Gohr                'size' => filesize($file2),
186d1f06eb4SAndreas Gohr                'revision' => filemtime($file2),
1876535a28fSEduardo Mozart de Oliveira                'hash' => md5(trim(io_readFile($file2))),
188d1f06eb4SAndreas Gohr                'author' => '',
18953585189SAndreas Gohr            ]
19053585189SAndreas Gohr        ];
191d1f06eb4SAndreas Gohr        $this->assertEqualResult(
192d1f06eb4SAndreas Gohr            $expected,
193d1f06eb4SAndreas Gohr            $this->remote->call(
194d1f06eb4SAndreas Gohr                'core.listPages',
19553585189SAndreas Gohr                [
196d1f06eb4SAndreas Gohr                    'namespace' => '',
19753585189SAndreas Gohr                    'depth' => 0, // 0 for all
198d1f06eb4SAndreas Gohr                    'hash' => true
19953585189SAndreas Gohr                ]
200d1f06eb4SAndreas Gohr            )
201d1f06eb4SAndreas Gohr        );
20253585189SAndreas Gohr    }
20353585189SAndreas Gohr
204d1f06eb4SAndreas Gohr    // core.listPages
205d1f06eb4SAndreas Gohr    public function testListPagesNamespace()
206d1f06eb4SAndreas Gohr    {
207d1f06eb4SAndreas Gohr        $file1 = wikiFN('wiki:syntax');
208d1f06eb4SAndreas Gohr        $file2 = wikiFN('wiki:dokuwiki');
209d1f06eb4SAndreas Gohr        // no indexing needed here
210d1f06eb4SAndreas Gohr
211d1f06eb4SAndreas Gohr        global $conf;
212d1f06eb4SAndreas Gohr        $conf['useheading'] = 1;
213d1f06eb4SAndreas Gohr
214d1f06eb4SAndreas Gohr        $expected = [
215d1f06eb4SAndreas Gohr            [
216d1f06eb4SAndreas Gohr                'id' => 'wiki:syntax',
217d1f06eb4SAndreas Gohr                'title' => 'Formatting Syntax',
218d1f06eb4SAndreas Gohr                'permission' => 8,
219d1f06eb4SAndreas Gohr                'size' => filesize($file1),
220d1f06eb4SAndreas Gohr                'revision' => filemtime($file1),
221d1f06eb4SAndreas Gohr                'hash' => '',
222d1f06eb4SAndreas Gohr                'author' => '',
223d1f06eb4SAndreas Gohr            ],
224d1f06eb4SAndreas Gohr            [
225d1f06eb4SAndreas Gohr                'id' => 'wiki:dokuwiki',
226d1f06eb4SAndreas Gohr                'title' => 'DokuWiki',
227d1f06eb4SAndreas Gohr                'permission' => 8,
228d1f06eb4SAndreas Gohr                'size' => filesize($file2),
229d1f06eb4SAndreas Gohr                'revision' => filemtime($file2),
230d1f06eb4SAndreas Gohr                'hash' => '',
231d1f06eb4SAndreas Gohr                'author' => '',
232d1f06eb4SAndreas Gohr            ],
233d1f06eb4SAndreas Gohr        ];
234d1f06eb4SAndreas Gohr
235d1f06eb4SAndreas Gohr        $this->assertEqualResult(
236d1f06eb4SAndreas Gohr            $expected,
237d1f06eb4SAndreas Gohr            $this->remote->call(
238d1f06eb4SAndreas Gohr                'core.listPages',
239d1f06eb4SAndreas Gohr                [
240d1f06eb4SAndreas Gohr                    'namespace' => 'wiki:',
241d1f06eb4SAndreas Gohr                    'depth' => 1,
242d1f06eb4SAndreas Gohr                ]
243d1f06eb4SAndreas Gohr            )
244d1f06eb4SAndreas Gohr        );
245d1f06eb4SAndreas Gohr    }
246d1f06eb4SAndreas Gohr
247d1f06eb4SAndreas Gohr    // core.searchPages
248d1f06eb4SAndreas Gohr    public function testSearchPages()
24953585189SAndreas Gohr    {
25053585189SAndreas Gohr        $id = 'wiki:syntax';
25153585189SAndreas Gohr        $file = wikiFN($id);
25253585189SAndreas Gohr
25353585189SAndreas Gohr        idx_addPage($id); //full text search depends on index
25453585189SAndreas Gohr        $expected = [
25553585189SAndreas Gohr            [
25653585189SAndreas Gohr                'id' => $id,
25753585189SAndreas Gohr                'score' => 1,
258d1f06eb4SAndreas Gohr                'revision' => filemtime($file),
259d1f06eb4SAndreas Gohr                'permission' => 8,
26053585189SAndreas Gohr                'size' => filesize($file),
26153585189SAndreas Gohr                'snippet' => ' a footnote)) by using double parentheses.
26253585189SAndreas Gohr
26353585189SAndreas Gohr===== <strong class="search_hit">Sectioning</strong> =====
26453585189SAndreas Gohr
26553585189SAndreas GohrYou can use up to five different levels of',
266d1f06eb4SAndreas Gohr                'title' => 'wiki:syntax',
267d1f06eb4SAndreas Gohr                'author' => '',
268d1f06eb4SAndreas Gohr                'hash' => '',
26953585189SAndreas Gohr            ]
27053585189SAndreas Gohr        ];
27153585189SAndreas Gohr
272d1f06eb4SAndreas Gohr        $this->assertEqualResult(
273d1f06eb4SAndreas Gohr            $expected,
274d1f06eb4SAndreas Gohr            $this->remote->call(
275d1f06eb4SAndreas Gohr                'core.searchPages',
27653585189SAndreas Gohr                [
277d1f06eb4SAndreas Gohr                    'query' => 'Sectioning'
27853585189SAndreas Gohr                ]
279d1f06eb4SAndreas Gohr            )
280d1f06eb4SAndreas Gohr        );
281d1f06eb4SAndreas Gohr    }
282d1f06eb4SAndreas Gohr
283d1f06eb4SAndreas Gohr    //core.getRecentPageChanges
284d1f06eb4SAndreas Gohr    public function testGetRecentPageChanges()
285d1f06eb4SAndreas Gohr    {
286d1f06eb4SAndreas Gohr        $_SERVER['REMOTE_USER'] = 'testuser';
287d1f06eb4SAndreas Gohr
288d1f06eb4SAndreas Gohr        saveWikiText('pageone', 'test', 'test one');
289d1f06eb4SAndreas Gohr        $rev1 = filemtime(wikiFN('pageone'));
290d1f06eb4SAndreas Gohr        saveWikiText('pagetwo', 'test', 'test two');
291d1f06eb4SAndreas Gohr        $rev2 = filemtime(wikiFN('pagetwo'));
29253585189SAndreas Gohr
29353585189SAndreas Gohr        $expected = [
29453585189SAndreas Gohr            [
295d1f06eb4SAndreas Gohr                'id' => 'pageone',
296d1f06eb4SAndreas Gohr                'revision' => $rev1,
297d1f06eb4SAndreas Gohr                'author' => 'testuser',
298d1f06eb4SAndreas Gohr                'sizechange' => 4,
299d1f06eb4SAndreas Gohr                'summary' => 'test one',
300d1f06eb4SAndreas Gohr                'type' => 'C',
301d1f06eb4SAndreas Gohr                'ip' => clientIP(),
302d1f06eb4SAndreas Gohr            ],
303d1f06eb4SAndreas Gohr            [
304d1f06eb4SAndreas Gohr                'id' => 'pagetwo',
305d1f06eb4SAndreas Gohr                'revision' => $rev2,
306d1f06eb4SAndreas Gohr                'author' => 'testuser',
307d1f06eb4SAndreas Gohr                'sizechange' => 4,
308d1f06eb4SAndreas Gohr                'summary' => 'test two',
309d1f06eb4SAndreas Gohr                'type' => 'C',
310d1f06eb4SAndreas Gohr                'ip' => clientIP(),
31153585189SAndreas Gohr            ]
31253585189SAndreas Gohr        ];
31353585189SAndreas Gohr
314d1f06eb4SAndreas Gohr        $this->assertEqualResult(
315d1f06eb4SAndreas Gohr            $expected,
316d1f06eb4SAndreas Gohr            $this->remote->call(
317d1f06eb4SAndreas Gohr                'core.getRecentPageChanges',
31853585189SAndreas Gohr                [
319d1f06eb4SAndreas Gohr                    'timestamp' => 0 // all recent changes
32053585189SAndreas Gohr                ]
321d1f06eb4SAndreas Gohr            )
322d1f06eb4SAndreas Gohr        );
32353585189SAndreas Gohr    }
32453585189SAndreas Gohr
325d1f06eb4SAndreas Gohr    // core.getPage
32653585189SAndreas Gohr    public function testGetPage()
32753585189SAndreas Gohr    {
32853585189SAndreas Gohr        $id = 'pageversion';
32953585189SAndreas Gohr        $file = wikiFN($id);
33053585189SAndreas Gohr
33153585189SAndreas Gohr        saveWikiText($id, 'first version', 'first');
33253585189SAndreas Gohr        $rev1 = filemtime($file);
33353585189SAndreas Gohr        clearstatcache(false, $file);
33453585189SAndreas Gohr        $this->waitForTick(true);
33553585189SAndreas Gohr        saveWikiText($id, 'second version', 'second');
33653585189SAndreas Gohr        $rev2 = filemtime($file);
33753585189SAndreas Gohr
338d1f06eb4SAndreas Gohr        $this->assertEqualResult(
339d1f06eb4SAndreas Gohr            'second version',
340d1f06eb4SAndreas Gohr            $this->remote->call('core.getPage', ['page' => $id, 'rev' => 0]),
341d1f06eb4SAndreas Gohr            'no revision given -> current'
342d1f06eb4SAndreas Gohr        );
34353585189SAndreas Gohr
344d1f06eb4SAndreas Gohr        $this->assertEqualResult(
345d1f06eb4SAndreas Gohr            'first version',
346d1f06eb4SAndreas Gohr            $this->remote->call('core.getPage', ['page' => $id, 'rev' => $rev1]),
347d1f06eb4SAndreas Gohr            '1st revision given'
348d1f06eb4SAndreas Gohr        );
34953585189SAndreas Gohr
350d1f06eb4SAndreas Gohr        $this->assertEqualResult(
351d1f06eb4SAndreas Gohr            'second version',
352d1f06eb4SAndreas Gohr            $this->remote->call('core.getPage', ['page' => $id, 'rev' => $rev2]),
353d1f06eb4SAndreas Gohr            '2nd revision given'
354d1f06eb4SAndreas Gohr        );
35553585189SAndreas Gohr
356d1f06eb4SAndreas Gohr        $this->assertEqualResult(
357d1f06eb4SAndreas Gohr            '',
358d1f06eb4SAndreas Gohr            $this->remote->call('core.getPage', ['page' => $id, 'rev' => 1234]),
359d1f06eb4SAndreas Gohr            'Non existing revision given'
360d1f06eb4SAndreas Gohr        );
36153585189SAndreas Gohr
362d1f06eb4SAndreas Gohr        $this->assertEqualResult(
363d1f06eb4SAndreas Gohr            '',
364d1f06eb4SAndreas Gohr            $this->remote->call('core.getPage', ['page' => 'foobar', 'rev' => 1234]),
365d1f06eb4SAndreas Gohr            'Non existing page given'
366d1f06eb4SAndreas Gohr        );
36753585189SAndreas Gohr    }
36853585189SAndreas Gohr
369d1f06eb4SAndreas Gohr    //core.getPageHTML
37053585189SAndreas Gohr    public function testGetPageHTMLVersion()
37153585189SAndreas Gohr    {
37253585189SAndreas Gohr        $id = 'htmltest';
37353585189SAndreas Gohr        $file = wikiFN($id);
37453585189SAndreas Gohr
37553585189SAndreas Gohr        $content1 = "====Title====\nText";
37653585189SAndreas Gohr        $html1 = "\n<h3 class=\"sectionedit1\" id=\"title\">Title</h3>\n<div class=\"level3\">\n\n<p>\nText\n</p>\n\n</div>\n";
37753585189SAndreas Gohr        $content2 = "====Foobar====\nText Bamm";
37853585189SAndreas Gohr        $html2 = "\n<h3 class=\"sectionedit1\" id=\"foobar\">Foobar</h3>\n<div class=\"level3\">\n\n<p>\nText Bamm\n</p>\n\n</div>\n";
37953585189SAndreas Gohr
38053585189SAndreas Gohr        saveWikiText($id, $content1, 'first');
38153585189SAndreas Gohr        $rev1 = filemtime($file);
38253585189SAndreas Gohr        clearstatcache(false, $file);
38353585189SAndreas Gohr        $this->waitForTick(true);
38453585189SAndreas Gohr        saveWikiText($id, $content2, 'second');
38553585189SAndreas Gohr        $rev2 = filemtime($file);
38653585189SAndreas Gohr
387d1f06eb4SAndreas Gohr        $this->assertEqualResult(
388d1f06eb4SAndreas Gohr            $html2,
389d1f06eb4SAndreas Gohr            $this->remote->call('core.getPageHTML', ['page' => $id, 'rev' => 0]),
390d1f06eb4SAndreas Gohr            'no revision given -> current'
391d1f06eb4SAndreas Gohr        );
39253585189SAndreas Gohr
393d1f06eb4SAndreas Gohr        $this->assertEqualResult(
394d1f06eb4SAndreas Gohr            $html1,
395d1f06eb4SAndreas Gohr            $this->remote->call('core.getPageHTML', ['page' => $id, 'rev' => $rev1]),
396d1f06eb4SAndreas Gohr            '1st revision given'
397d1f06eb4SAndreas Gohr        );
39853585189SAndreas Gohr
399d1f06eb4SAndreas Gohr        $this->assertEqualResult(
400d1f06eb4SAndreas Gohr            $html2,
401d1f06eb4SAndreas Gohr            $this->remote->call('core.getPageHTML', ['page' => $id, 'rev' => $rev2]),
402d1f06eb4SAndreas Gohr            '2nd revision given'
403d1f06eb4SAndreas Gohr        );
40453585189SAndreas Gohr
405d1f06eb4SAndreas Gohr        $e = null;
406d1f06eb4SAndreas Gohr        try {
407d1f06eb4SAndreas Gohr            $this->remote->call('core.getPageHTML', ['page' => $id, 'rev' => 1234]);
408d1f06eb4SAndreas Gohr        } catch (RemoteException $e) {
409d1f06eb4SAndreas Gohr        }
410d1f06eb4SAndreas Gohr        $this->assertInstanceOf(RemoteException::class, $e);
411d1f06eb4SAndreas Gohr        $this->assertEquals(121, $e->getCode(), 'Non existing revision given');
41253585189SAndreas Gohr
413d1f06eb4SAndreas Gohr        $e = null;
414d1f06eb4SAndreas Gohr        try {
415d1f06eb4SAndreas Gohr            $this->remote->call('core.getPageHTML', ['page' => 'foobar', 'rev' => 1234]);
416d1f06eb4SAndreas Gohr        } catch (RemoteException $e) {
417d1f06eb4SAndreas Gohr        }
418d1f06eb4SAndreas Gohr        $this->assertInstanceOf(RemoteException::class, $e);
419d1f06eb4SAndreas Gohr        $this->assertEquals(121, $e->getCode(), 'Non existing page given');
42053585189SAndreas Gohr    }
42153585189SAndreas Gohr
422d1f06eb4SAndreas Gohr    //core.getPageInfo
42353585189SAndreas Gohr    public function testGetPageInfo()
42453585189SAndreas Gohr    {
42553585189SAndreas Gohr        $id = 'pageinfo';
42653585189SAndreas Gohr        $file = wikiFN($id);
42753585189SAndreas Gohr
428d1f06eb4SAndreas Gohr        $_SERVER['REMOTE_USER'] = 'testuser';
42953585189SAndreas Gohr
43053585189SAndreas Gohr        saveWikiText($id, 'first version', 'first');
43153585189SAndreas Gohr        $rev1 = filemtime($file);
43253585189SAndreas Gohr        clearstatcache(false, $file);
43353585189SAndreas Gohr        $this->waitForTick(true);
43453585189SAndreas Gohr        saveWikiText($id, 'second version', 'second');
43553585189SAndreas Gohr        $rev2 = filemtime($file);
43653585189SAndreas Gohr
43753585189SAndreas Gohr        $expected = [
438d1f06eb4SAndreas Gohr            'id' => $id,
439d1f06eb4SAndreas Gohr            'revision' => $rev2,
440d1f06eb4SAndreas Gohr            'author' => 'testuser',
4416535a28fSEduardo Mozart de Oliveira            'hash' => md5(trim(io_readFile($file))),
442d1f06eb4SAndreas Gohr            'title' => $id,
443d1f06eb4SAndreas Gohr            'size' => filesize($file),
444d1f06eb4SAndreas Gohr            'permission' => 8,
44553585189SAndreas Gohr        ];
446d1f06eb4SAndreas Gohr        $this->assertEqualResult(
447d1f06eb4SAndreas Gohr            $expected,
448d1f06eb4SAndreas Gohr            $this->remote->call('core.getPageInfo', ['page' => $id, 'rev' => 0, 'hash' => true, 'author' => true]),
449d1f06eb4SAndreas Gohr            'no revision given -> current'
450d1f06eb4SAndreas Gohr        );
45153585189SAndreas Gohr
45253585189SAndreas Gohr        $expected = [
453d1f06eb4SAndreas Gohr            'id' => $id,
454d1f06eb4SAndreas Gohr            'revision' => $rev1,
455d1f06eb4SAndreas Gohr            'author' => '',
456d1f06eb4SAndreas Gohr            'hash' => '',
457d1f06eb4SAndreas Gohr            'title' => $id,
458d1f06eb4SAndreas Gohr            'size' => filesize(wikiFN($id, $rev1)),
459d1f06eb4SAndreas Gohr            'permission' => 8,
46053585189SAndreas Gohr        ];
461d1f06eb4SAndreas Gohr        $this->assertEqualResult(
462d1f06eb4SAndreas Gohr            $expected,
463d1f06eb4SAndreas Gohr            $this->remote->call('core.getPageInfo', ['page' => $id, 'rev' => $rev1]),
464d1f06eb4SAndreas Gohr            '1st revision given'
465d1f06eb4SAndreas Gohr        );
46653585189SAndreas Gohr
46753585189SAndreas Gohr        $expected = [
468d1f06eb4SAndreas Gohr            'id' => $id,
469d1f06eb4SAndreas Gohr            'revision' => $rev2,
470d1f06eb4SAndreas Gohr            'author' => '',
471d1f06eb4SAndreas Gohr            'hash' => '',
472d1f06eb4SAndreas Gohr            'title' => $id,
473d1f06eb4SAndreas Gohr            'size' => filesize(wikiFN($id, $rev2)),
474d1f06eb4SAndreas Gohr            'permission' => 8,
47553585189SAndreas Gohr        ];
476d1f06eb4SAndreas Gohr        $this->assertEqualResult(
477d1f06eb4SAndreas Gohr            $expected,
478d1f06eb4SAndreas Gohr            $this->remote->call('core.getPageInfo', ['page' => $id, 'rev' => $rev2]),
479d1f06eb4SAndreas Gohr            '2nd revision given'
480d1f06eb4SAndreas Gohr        );
481d1f06eb4SAndreas Gohr
482d1f06eb4SAndreas Gohr        $e = null;
483d1f06eb4SAndreas Gohr        try {
484d1f06eb4SAndreas Gohr            $this->remote->call('core.getPageInfo', ['page' => $id, 'rev' => 1234]);
485d1f06eb4SAndreas Gohr        } catch (RemoteException $e) {
486d1f06eb4SAndreas Gohr        }
487d1f06eb4SAndreas Gohr        $this->assertInstanceOf(RemoteException::class, $e);
488d1f06eb4SAndreas Gohr        $this->assertEquals(121, $e->getCode(), 'Non existing revision given');
489d1f06eb4SAndreas Gohr
490d1f06eb4SAndreas Gohr        $e = null;
491d1f06eb4SAndreas Gohr        try {
492d1f06eb4SAndreas Gohr            $this->remote->call('core.getPageInfo', ['page' => 'foobar', 'rev' => 1234]);
493d1f06eb4SAndreas Gohr        } catch (RemoteException $e) {
494d1f06eb4SAndreas Gohr        }
495d1f06eb4SAndreas Gohr        $this->assertInstanceOf(RemoteException::class, $e);
496d1f06eb4SAndreas Gohr        $this->assertEquals(121, $e->getCode(), 'Non existing page given');
49753585189SAndreas Gohr    }
49853585189SAndreas Gohr
499d1f06eb4SAndreas Gohr    //core.getPageHistory
500d1f06eb4SAndreas Gohr    public function testGetPageHistory()
50153585189SAndreas Gohr    {
50253585189SAndreas Gohr        global $conf;
50353585189SAndreas Gohr
50453585189SAndreas Gohr        $id = 'revpage';
50553585189SAndreas Gohr        $file = wikiFN($id);
50653585189SAndreas Gohr
50753585189SAndreas Gohr        $rev = [];
50853585189SAndreas Gohr        for ($i = 0; $i < 6; $i++) {
50953585189SAndreas Gohr            $this->waitForTick();
51053585189SAndreas Gohr            saveWikiText($id, "rev$i", "rev$i");
51153585189SAndreas Gohr            clearstatcache(false, $file);
51253585189SAndreas Gohr            $rev[$i] = filemtime($file);
51353585189SAndreas Gohr        }
51453585189SAndreas Gohr
515d1f06eb4SAndreas Gohr        $params = ['page' => $id, 'first' => 0];
516d1f06eb4SAndreas Gohr        $versions = $this->remote->call('core.getPageHistory', $params);
517d1f06eb4SAndreas Gohr        $versions = json_decode(json_encode($versions), true);
51853585189SAndreas Gohr        $this->assertEquals(6, count($versions));
519d1f06eb4SAndreas Gohr        $this->assertEquals($rev[5], $versions[0]['revision']);
520d1f06eb4SAndreas Gohr        $this->assertEquals($rev[4], $versions[1]['revision']);
521d1f06eb4SAndreas Gohr        $this->assertEquals($rev[3], $versions[2]['revision']);
522d1f06eb4SAndreas Gohr        $this->assertEquals($rev[2], $versions[3]['revision']);
523d1f06eb4SAndreas Gohr        $this->assertEquals($rev[1], $versions[4]['revision']);
524d1f06eb4SAndreas Gohr        $this->assertEquals($rev[0], $versions[5]['revision']);
52553585189SAndreas Gohr
526d1f06eb4SAndreas Gohr        $params = ['page' => $id, 'first' => 1]; // offset 1
527d1f06eb4SAndreas Gohr        $versions = $this->remote->call('core.getPageHistory', $params);
528d1f06eb4SAndreas Gohr        $versions = json_decode(json_encode($versions), true);
52953585189SAndreas Gohr        $this->assertEquals(5, count($versions));
530d1f06eb4SAndreas Gohr        $this->assertEquals($rev[4], $versions[0]['revision']);
531d1f06eb4SAndreas Gohr        $this->assertEquals($rev[3], $versions[1]['revision']);
532d1f06eb4SAndreas Gohr        $this->assertEquals($rev[2], $versions[2]['revision']);
533d1f06eb4SAndreas Gohr        $this->assertEquals($rev[1], $versions[3]['revision']);
534d1f06eb4SAndreas Gohr        $this->assertEquals($rev[0], $versions[4]['revision']);
53553585189SAndreas Gohr
53653585189SAndreas Gohr        $conf['recent'] = 3; //set number of results per page
53753585189SAndreas Gohr
538d1f06eb4SAndreas Gohr        $params = ['page' => $id, 'first' => 0]; // first page
539d1f06eb4SAndreas Gohr        $versions = $this->remote->call('core.getPageHistory', $params);
540d1f06eb4SAndreas Gohr        $versions = json_decode(json_encode($versions), true);
54153585189SAndreas Gohr        $this->assertEquals(3, count($versions));
542d1f06eb4SAndreas Gohr        $this->assertEquals($rev[5], $versions[0]['revision']);
543d1f06eb4SAndreas Gohr        $this->assertEquals($rev[4], $versions[1]['revision']);
544d1f06eb4SAndreas Gohr        $this->assertEquals($rev[3], $versions[2]['revision']);
54553585189SAndreas Gohr
546d1f06eb4SAndreas Gohr        $params = ['page' => $id, 'first' => $conf['recent']]; // second page
547d1f06eb4SAndreas Gohr        $versions = $this->remote->call('core.getPageHistory', $params);
548d1f06eb4SAndreas Gohr        $versions = json_decode(json_encode($versions), true);
54953585189SAndreas Gohr        $this->assertEquals(3, count($versions));
550d1f06eb4SAndreas Gohr        $this->assertEquals($rev[2], $versions[0]['revision']);
551d1f06eb4SAndreas Gohr        $this->assertEquals($rev[1], $versions[1]['revision']);
552d1f06eb4SAndreas Gohr        $this->assertEquals($rev[0], $versions[2]['revision']);
55353585189SAndreas Gohr
554d1f06eb4SAndreas Gohr        $params = ['page' => $id, 'first' => $conf['recent'] * 2]; // third page
555d1f06eb4SAndreas Gohr        $versions = $this->remote->call('core.getPageHistory', $params);
556d1f06eb4SAndreas Gohr        $versions = json_decode(json_encode($versions), true);
55753585189SAndreas Gohr        $this->assertEquals(0, count($versions));
55853585189SAndreas Gohr    }
55953585189SAndreas Gohr
560d1f06eb4SAndreas Gohr    //core.getPageLinks
561d1f06eb4SAndreas Gohr    public function testGetPageLinks()
56253585189SAndreas Gohr    {
56353585189SAndreas Gohr        $localdoku = [
56453585189SAndreas Gohr            'type' => 'local',
56553585189SAndreas Gohr            'page' => 'DokuWiki',
56653585189SAndreas Gohr            'href' => DOKU_BASE . DOKU_SCRIPT . '?id=DokuWiki'
56753585189SAndreas Gohr        ];
568d1f06eb4SAndreas Gohr        $expected = [
56953585189SAndreas Gohr            $localdoku,
57053585189SAndreas Gohr            [
57153585189SAndreas Gohr                'type' => 'extern',
57253585189SAndreas Gohr                'page' => 'http://www.freelists.org',
57353585189SAndreas Gohr                'href' => 'http://www.freelists.org'
57453585189SAndreas Gohr            ],
57553585189SAndreas Gohr            [
576d1f06eb4SAndreas Gohr                'type' => 'interwiki',
577d1f06eb4SAndreas Gohr                'page' => 'rfc>1855',
57853585189SAndreas Gohr                'href' => 'https://tools.ietf.org/html/rfc1855'
57953585189SAndreas Gohr            ],
58053585189SAndreas Gohr            [
58153585189SAndreas Gohr                'type' => 'extern',
58253585189SAndreas Gohr                'page' => 'http://www.catb.org/~esr/faqs/smart-questions.html',
58353585189SAndreas Gohr                'href' => 'http://www.catb.org/~esr/faqs/smart-questions.html'
58453585189SAndreas Gohr            ],
58553585189SAndreas Gohr            $localdoku,
58653585189SAndreas Gohr            $localdoku
58753585189SAndreas Gohr        ];
588d1f06eb4SAndreas Gohr
589d1f06eb4SAndreas Gohr        $this->assertEqualResult(
590d1f06eb4SAndreas Gohr            $expected,
591d1f06eb4SAndreas Gohr            $this->remote->call('core.getPageLinks', ['page' => 'mailinglist'])
592d1f06eb4SAndreas Gohr        );
593d1f06eb4SAndreas Gohr
594d1f06eb4SAndreas Gohr        $this->expectExceptionCode(121);
595d1f06eb4SAndreas Gohr        $this->remote->call('core.getPageLinks', ['page' => 'foobar']);
59653585189SAndreas Gohr    }
59753585189SAndreas Gohr
598d1f06eb4SAndreas Gohr    //core.getPageBackLinks
599d1f06eb4SAndreas Gohr    public function testGetPageBackLinks()
600d1f06eb4SAndreas Gohr    {
601d1f06eb4SAndreas Gohr        saveWikiText('linky', '[[wiki:syntax]]', 'test');
602d1f06eb4SAndreas Gohr        // backlinks need index
603d1f06eb4SAndreas Gohr        idx_addPage('wiki:syntax');
604d1f06eb4SAndreas Gohr        idx_addPage('linky');
605d1f06eb4SAndreas Gohr
606d1f06eb4SAndreas Gohr        $result = $this->remote->call('core.getPageBackLinks', ['page' => 'wiki:syntax']);
607d1f06eb4SAndreas Gohr        $this->assertTrue(count($result) > 0);
608d1f06eb4SAndreas Gohr        $this->assertEqualResult(ft_backlinks('wiki:syntax'), $result);
609d1f06eb4SAndreas Gohr
610d1f06eb4SAndreas Gohr        $this->assertEquals([], $this->remote->call('core.getPageBackLinks', ['page' => 'foobar']));
611d1f06eb4SAndreas Gohr    }
612d1f06eb4SAndreas Gohr
613d1f06eb4SAndreas Gohr    //core.lockPages
614d1f06eb4SAndreas Gohr    public function testLockPages()
615d1f06eb4SAndreas Gohr    {
616d1f06eb4SAndreas Gohr        // lock a first set of pages
617d1f06eb4SAndreas Gohr        $_SERVER['REMOTE_USER'] = 'testuser1';
618d1f06eb4SAndreas Gohr        $tolock = ['wiki:dokuwiki', 'nonexisting'];
619d1f06eb4SAndreas Gohr        $this->assertEquals(
620d1f06eb4SAndreas Gohr            $tolock,
621d1f06eb4SAndreas Gohr            $this->remote->call('core.lockPages', ['pages' => $tolock]),
622d1f06eb4SAndreas Gohr            'all pages should lock'
623d1f06eb4SAndreas Gohr        );
624d1f06eb4SAndreas Gohr
625d1f06eb4SAndreas Gohr        // now we're someone else
626d1f06eb4SAndreas Gohr        $_SERVER['REMOTE_USER'] = 'testuser2';
627d1f06eb4SAndreas Gohr        $tolock = ['wiki:dokuwiki', 'nonexisting', 'wiki:syntax', 'another'];
628d1f06eb4SAndreas Gohr        $expected = ['wiki:syntax', 'another'];
629d1f06eb4SAndreas Gohr        $this->assertEquals(
630d1f06eb4SAndreas Gohr            $expected,
631d1f06eb4SAndreas Gohr            $this->remote->call('core.lockPages', ['pages' => $tolock]),
632d1f06eb4SAndreas Gohr            'only half the pages should lock'
633d1f06eb4SAndreas Gohr        );
634d1f06eb4SAndreas Gohr    }
635d1f06eb4SAndreas Gohr
636d1f06eb4SAndreas Gohr    // core.unlockPages
637d1f06eb4SAndreas Gohr    public function testUnlockPages()
638d1f06eb4SAndreas Gohr    {
639d1f06eb4SAndreas Gohr        $_SERVER['REMOTE_USER'] = 'testuser1';
640d1f06eb4SAndreas Gohr        lock('wiki:dokuwiki');
641d1f06eb4SAndreas Gohr        lock('nonexisting');
642d1f06eb4SAndreas Gohr
643d1f06eb4SAndreas Gohr        $_SERVER['REMOTE_USER'] = 'testuser2';
644d1f06eb4SAndreas Gohr        lock('wiki:syntax');
645d1f06eb4SAndreas Gohr        lock('another');
646d1f06eb4SAndreas Gohr
647d1f06eb4SAndreas Gohr        $tounlock = ['wiki:dokuwiki', 'nonexisting', 'wiki:syntax', 'another', 'notlocked'];
648d1f06eb4SAndreas Gohr        $expected = ['wiki:syntax', 'another'];
649d1f06eb4SAndreas Gohr
650d1f06eb4SAndreas Gohr        $this->assertEquals(
651d1f06eb4SAndreas Gohr            $expected,
652d1f06eb4SAndreas Gohr            $this->remote->call('core.unlockPages', ['pages' => $tounlock])
653d1f06eb4SAndreas Gohr        );
654d1f06eb4SAndreas Gohr    }
655d1f06eb4SAndreas Gohr
656d1f06eb4SAndreas Gohr    //core.savePage
657d1f06eb4SAndreas Gohr    public function testSavePage()
658d1f06eb4SAndreas Gohr    {
659d1f06eb4SAndreas Gohr        $id = 'putpage';
660d1f06eb4SAndreas Gohr
661d1f06eb4SAndreas Gohr        $content = "====Title====\nText";
662d1f06eb4SAndreas Gohr        $params = [
663d1f06eb4SAndreas Gohr            'page' => $id,
664d1f06eb4SAndreas Gohr            'text' => $content,
665d1f06eb4SAndreas Gohr            'isminor' => false,
666d1f06eb4SAndreas Gohr            'summary' => 'Summary of nice text'
667d1f06eb4SAndreas Gohr        ];
668d1f06eb4SAndreas Gohr        $this->assertTrue($this->remote->call('core.savePage', $params));
669d1f06eb4SAndreas Gohr        $this->assertEquals($content, rawWiki($id));
670d1f06eb4SAndreas Gohr
671d1f06eb4SAndreas Gohr        // remove page
672d1f06eb4SAndreas Gohr        $params = [
673d1f06eb4SAndreas Gohr            'page' => $id,
674d1f06eb4SAndreas Gohr            'text' => '',
675d1f06eb4SAndreas Gohr        ];
676d1f06eb4SAndreas Gohr        $this->assertTrue($this->remote->call('core.savePage', $params));
6779ad2b913SAndreas Gohr        $this->assertFileDoesNotExist(wikiFN($id));
678d1f06eb4SAndreas Gohr
679d1f06eb4SAndreas Gohr        // remove non existing page (reusing above params)
680d1f06eb4SAndreas Gohr        $e = null;
681d1f06eb4SAndreas Gohr        try {
682d1f06eb4SAndreas Gohr            $this->remote->call('core.savePage', $params);
683d1f06eb4SAndreas Gohr        } catch (RemoteException $e) {
684d1f06eb4SAndreas Gohr        }
685d1f06eb4SAndreas Gohr        $this->assertInstanceOf(RemoteException::class, $e);
686d1f06eb4SAndreas Gohr        $this->assertEquals(132, $e->getCode());
687d1f06eb4SAndreas Gohr    }
688d1f06eb4SAndreas Gohr
689d1f06eb4SAndreas Gohr    //core.appendPage
690d1f06eb4SAndreas Gohr    public function testAppendPage()
691d1f06eb4SAndreas Gohr    {
692d1f06eb4SAndreas Gohr        $id = 'appendpage';
693d1f06eb4SAndreas Gohr        $content = 'a test';
694d1f06eb4SAndreas Gohr        $morecontent = "\nOther text";
695d1f06eb4SAndreas Gohr        saveWikiText($id, $content, 'local');
696d1f06eb4SAndreas Gohr
697d1f06eb4SAndreas Gohr        $params = [
698d1f06eb4SAndreas Gohr            'page' => $id,
699d1f06eb4SAndreas Gohr            'text' => $morecontent,
700d1f06eb4SAndreas Gohr        ];
701d1f06eb4SAndreas Gohr        $this->assertEquals(true, $this->remote->call('core.appendPage', $params));
702d1f06eb4SAndreas Gohr        $this->assertEquals($content . $morecontent, rawWiki($id));
703d1f06eb4SAndreas Gohr    }
704d1f06eb4SAndreas Gohr
705d1f06eb4SAndreas Gohr    // endregion
706d1f06eb4SAndreas Gohr
707d1f06eb4SAndreas Gohr    // region media
708d1f06eb4SAndreas Gohr
709d1f06eb4SAndreas Gohr    // core.listMedia
710d1f06eb4SAndreas Gohr    public function testListMedia()
711d1f06eb4SAndreas Gohr    {
712d1f06eb4SAndreas Gohr        $id = 'wiki:dokuwiki-128.png';
713d1f06eb4SAndreas Gohr        $file = mediaFN($id);
714d1f06eb4SAndreas Gohr        $content = file_get_contents($file);
715d1f06eb4SAndreas Gohr
716d1f06eb4SAndreas Gohr        $expected = [
717d1f06eb4SAndreas Gohr            [
718d1f06eb4SAndreas Gohr                'id' => $id,
719d1f06eb4SAndreas Gohr                'size' => filesize($file),
720d1f06eb4SAndreas Gohr                'revision' => filemtime($file),
721d1f06eb4SAndreas Gohr                'isimage' => true,
722d1f06eb4SAndreas Gohr                'hash' => md5($content),
723d1f06eb4SAndreas Gohr                'permission' => 8,
724d1f06eb4SAndreas Gohr                'author' => '',
725d1f06eb4SAndreas Gohr            ]
726d1f06eb4SAndreas Gohr        ];
727d1f06eb4SAndreas Gohr        $this->assertEqualResult(
728d1f06eb4SAndreas Gohr            $expected,
729d1f06eb4SAndreas Gohr            $this->remote->call(
730d1f06eb4SAndreas Gohr                'core.listMedia',
731d1f06eb4SAndreas Gohr                [
732d1f06eb4SAndreas Gohr                    'namespace' => 'wiki',
733d1f06eb4SAndreas Gohr                    'pattern' => '/128/',
734d1f06eb4SAndreas Gohr                    'hash' => true,
735d1f06eb4SAndreas Gohr                ]
736d1f06eb4SAndreas Gohr            )
737d1f06eb4SAndreas Gohr        );
738d1f06eb4SAndreas Gohr    }
739d1f06eb4SAndreas Gohr
740d1f06eb4SAndreas Gohr    //core.getRecentMediaChanges
741d1f06eb4SAndreas Gohr    public function testGetRecentMediaChanges()
74253585189SAndreas Gohr    {
74353585189SAndreas Gohr        global $conf;
74453585189SAndreas Gohr
745d1f06eb4SAndreas Gohr        $_SERVER['REMOTE_USER'] = 'testuser';
74653585189SAndreas Gohr
747d1f06eb4SAndreas Gohr        $orig = mediaFN('wiki:dokuwiki-128.png');
748d1f06eb4SAndreas Gohr        $tmp = $conf['tmpdir'] . 'test.png';
74953585189SAndreas Gohr
750d1f06eb4SAndreas Gohr        $target1 = 'test:image1.png';
751d1f06eb4SAndreas Gohr        $file1 = mediaFN($target1);
752d1f06eb4SAndreas Gohr        copy($orig, $tmp);
753d1f06eb4SAndreas Gohr        media_save(['name' => $tmp], $target1, true, AUTH_UPLOAD, 'rename');
75453585189SAndreas Gohr
755d1f06eb4SAndreas Gohr        $target2 = 'test:image2.png';
756d1f06eb4SAndreas Gohr        $file2 = mediaFN($target2);
757d1f06eb4SAndreas Gohr        copy($orig, $tmp);
758d1f06eb4SAndreas Gohr        media_save(['name' => $tmp], $target2, true, AUTH_UPLOAD, 'rename');
759d1f06eb4SAndreas Gohr
76053585189SAndreas Gohr        $expected = [
76153585189SAndreas Gohr            [
762d1f06eb4SAndreas Gohr                'id' => $target1,
763d1f06eb4SAndreas Gohr                'revision' => filemtime($file1),
764d1f06eb4SAndreas Gohr                'author' => 'testuser',
765d1f06eb4SAndreas Gohr                'ip' => clientIP(),
766d1f06eb4SAndreas Gohr                'sizechange' => filesize($file1),
767d1f06eb4SAndreas Gohr                'summary' => 'created',
768d1f06eb4SAndreas Gohr                'type' => 'C',
769d1f06eb4SAndreas Gohr            ],
77053585189SAndreas Gohr            [
771d1f06eb4SAndreas Gohr                'id' => $target2,
772d1f06eb4SAndreas Gohr                'revision' => filemtime($file2),
773d1f06eb4SAndreas Gohr                'author' => 'testuser',
774d1f06eb4SAndreas Gohr                'ip' => clientIP(),
775d1f06eb4SAndreas Gohr                'sizechange' => filesize($file2),
776d1f06eb4SAndreas Gohr                'summary' => 'created',
777d1f06eb4SAndreas Gohr                'type' => 'C',
77853585189SAndreas Gohr            ]
77953585189SAndreas Gohr        ];
780d1f06eb4SAndreas Gohr
781d1f06eb4SAndreas Gohr        $this->assertEqualResult(
782d1f06eb4SAndreas Gohr            $expected,
783d1f06eb4SAndreas Gohr            $this->remote->call(
784d1f06eb4SAndreas Gohr                'core.getRecentMediaChanges',
78553585189SAndreas Gohr                [
786d1f06eb4SAndreas Gohr                    'timestamp' => 0 // all recent changes
78753585189SAndreas Gohr                ]
788d1f06eb4SAndreas Gohr            )
789d1f06eb4SAndreas Gohr        );
79053585189SAndreas Gohr    }
79153585189SAndreas Gohr
792d1f06eb4SAndreas Gohr    //core.getMedia
793d1f06eb4SAndreas Gohr    public function testGetMedia()
794d1f06eb4SAndreas Gohr    {
795d1f06eb4SAndreas Gohr        $id = 'wiki:dokuwiki-128.png';
796d1f06eb4SAndreas Gohr        $file = mediaFN($id);
797d1f06eb4SAndreas Gohr        $base64 = base64_encode(file_get_contents($file));
798d1f06eb4SAndreas Gohr
799d1f06eb4SAndreas Gohr        $this->assertEquals(
800d1f06eb4SAndreas Gohr            $base64,
801d1f06eb4SAndreas Gohr            $this->remote->call('core.getMedia', ['media' => $id])
802d1f06eb4SAndreas Gohr        );
803d1f06eb4SAndreas Gohr
804d1f06eb4SAndreas Gohr        $e = null;
805d1f06eb4SAndreas Gohr        try {
806d1f06eb4SAndreas Gohr            $this->remote->call('core.getMedia', ['media' => $id, 'rev' => 1234]);
807d1f06eb4SAndreas Gohr        } catch (RemoteException $e) {
808d1f06eb4SAndreas Gohr        }
809d1f06eb4SAndreas Gohr        $this->assertInstanceOf(RemoteException::class, $e);
810d1f06eb4SAndreas Gohr        $this->assertEquals(221, $e->getCode(), 'Non existing revision given');
811d1f06eb4SAndreas Gohr
812d1f06eb4SAndreas Gohr        $e = null;
813d1f06eb4SAndreas Gohr        try {
814d1f06eb4SAndreas Gohr            $this->remote->call('core.getMedia', ['media' => 'foobar.png']);
815d1f06eb4SAndreas Gohr        } catch (RemoteException $e) {
816d1f06eb4SAndreas Gohr        }
817d1f06eb4SAndreas Gohr        $this->assertInstanceOf(RemoteException::class, $e);
818d1f06eb4SAndreas Gohr        $this->assertEquals(221, $e->getCode(), 'Non existing media id given');
819d1f06eb4SAndreas Gohr    }
820d1f06eb4SAndreas Gohr
821d1f06eb4SAndreas Gohr
822d1f06eb4SAndreas Gohr    //core.getMediaInfo
823d1f06eb4SAndreas Gohr    public function testGetMediaInfo()
824d1f06eb4SAndreas Gohr    {
825d1f06eb4SAndreas Gohr        $id = 'wiki:dokuwiki-128.png';
826d1f06eb4SAndreas Gohr        $file = mediaFN($id);
827d1f06eb4SAndreas Gohr
828d1f06eb4SAndreas Gohr        $expected = [
829d1f06eb4SAndreas Gohr            'id' => $id,
830d1f06eb4SAndreas Gohr            'revision' => filemtime($file),
831d1f06eb4SAndreas Gohr            'author' => '',
832d1f06eb4SAndreas Gohr            'hash' => md5(file_get_contents($file)),
833d1f06eb4SAndreas Gohr            'size' => filesize($file),
834d1f06eb4SAndreas Gohr            'permission' => 8,
835d1f06eb4SAndreas Gohr            'isimage' => true,
836d1f06eb4SAndreas Gohr        ];
837d1f06eb4SAndreas Gohr        $this->assertEqualResult(
838d1f06eb4SAndreas Gohr            $expected,
839d1f06eb4SAndreas Gohr            $this->remote->call('core.getMediaInfo', ['media' => $id, 'hash' => true, 'author' => false])
840d1f06eb4SAndreas Gohr        );
841d1f06eb4SAndreas Gohr
842d1f06eb4SAndreas Gohr        $e = null;
843d1f06eb4SAndreas Gohr        try {
844d1f06eb4SAndreas Gohr            $this->remote->call('core.getMediaInfo', ['media' => $id, 'rev' => 1234]);
845d1f06eb4SAndreas Gohr        } catch (RemoteException $e) {
846d1f06eb4SAndreas Gohr        }
847d1f06eb4SAndreas Gohr        $this->assertInstanceOf(RemoteException::class, $e);
848d1f06eb4SAndreas Gohr        $this->assertEquals(221, $e->getCode(), 'Non existing revision given');
849d1f06eb4SAndreas Gohr
850d1f06eb4SAndreas Gohr        $e = null;
851d1f06eb4SAndreas Gohr        try {
852d1f06eb4SAndreas Gohr            $this->remote->call('core.getMediaInfo', ['media' => 'foobar.png']);
853d1f06eb4SAndreas Gohr        } catch (RemoteException $e) {
854d1f06eb4SAndreas Gohr        }
855d1f06eb4SAndreas Gohr        $this->assertInstanceOf(RemoteException::class, $e);
856d1f06eb4SAndreas Gohr        $this->assertEquals(221, $e->getCode(), 'Non existing media id given');
857d1f06eb4SAndreas Gohr    }
858d1f06eb4SAndreas Gohr
859*61d21e86Skuangfio    //core.getMediaHistory
860*61d21e86Skuangfio    public function testGetMediaHistory()
861*61d21e86Skuangfio    {
862*61d21e86Skuangfio        global $conf;
863*61d21e86Skuangfio
864*61d21e86Skuangfio        $_SERVER['REMOTE_USER'] = 'testuser';
865*61d21e86Skuangfio
866*61d21e86Skuangfio        //image to be uploaded
867*61d21e86Skuangfio        $orig = mediaFN('wiki:dokuwiki-128.png');
868*61d21e86Skuangfio        $tmp = $conf['tmpdir'] . 'test.png';
869*61d21e86Skuangfio
870*61d21e86Skuangfio        //create image to be revised
871*61d21e86Skuangfio        $id = 'test:image3.png';
872*61d21e86Skuangfio        $media = mediaFN($id);
873*61d21e86Skuangfio
874*61d21e86Skuangfio        $rev = [];
875*61d21e86Skuangfio        for ($i = 0; $i < 2; $i++) {
876*61d21e86Skuangfio            $this->waitForTick();
877*61d21e86Skuangfio            copy($orig, $tmp);
878*61d21e86Skuangfio            media_save(['name' => $tmp], $id, true, AUTH_UPLOAD, 'rename');
879*61d21e86Skuangfio            $rev[$i] = filemtime($media);
880*61d21e86Skuangfio        }
881*61d21e86Skuangfio
882*61d21e86Skuangfio        $params = ['media' => $id, 'first' => 0]; // offset 0
883*61d21e86Skuangfio        $versions = $this->remote->call('core.getMediaHistory', $params);
884*61d21e86Skuangfio        $versions = json_decode(json_encode($versions), true);
885*61d21e86Skuangfio        $this->assertEquals(2, count($versions));
886*61d21e86Skuangfio        $this->assertEquals($rev[1], $versions[0]['revision']);
887*61d21e86Skuangfio        $this->assertEquals($rev[0], $versions[1]['revision']);
888*61d21e86Skuangfio
889*61d21e86Skuangfio        $params = ['media' => $id, 'first' => 1]; // offset 1
890*61d21e86Skuangfio        $versions = $this->remote->call('core.getMediaHistory', $params);
891*61d21e86Skuangfio        $versions = json_decode(json_encode($versions), true);
892*61d21e86Skuangfio        $this->assertEquals(1, count($versions));
893*61d21e86Skuangfio        $this->assertEquals($rev[0], $versions[0]['revision']);
894*61d21e86Skuangfio
895*61d21e86Skuangfio        $params = ['media' => $id, 'first' => 2]; // offset 2
896*61d21e86Skuangfio        $versions = $this->remote->call('core.getMediaHistory', $params);
897*61d21e86Skuangfio        $versions = json_decode(json_encode($versions), true);
898*61d21e86Skuangfio        $this->assertEquals(0, count($versions));
899*61d21e86Skuangfio
900*61d21e86Skuangfio        $params = ['media' => $id, 'first' => 2]; // offset 3
901*61d21e86Skuangfio        $versions = $this->remote->call('core.getMediaHistory', $params);
902*61d21e86Skuangfio        $versions = json_decode(json_encode($versions), true);
903*61d21e86Skuangfio        $this->assertEquals(0, count($versions));
904*61d21e86Skuangfio    }
905*61d21e86Skuangfio
906d1f06eb4SAndreas Gohr    //core.saveMedia
907d1f06eb4SAndreas Gohr    public function testSaveMedia()
908d1f06eb4SAndreas Gohr    {
909d1f06eb4SAndreas Gohr        $orig = mediaFN('wiki:dokuwiki-128.png');
910d1f06eb4SAndreas Gohr        $base64 = base64_encode(file_get_contents($orig));
911d1f06eb4SAndreas Gohr
912d1f06eb4SAndreas Gohr        $target = 'test:putimage.png';
913d1f06eb4SAndreas Gohr        $targetfile = mediaFN($target);
914d1f06eb4SAndreas Gohr
915d1f06eb4SAndreas Gohr        $this->assertTrue($this->remote->call('core.saveMedia', ['media' => $target, 'base64' => $base64]));
916d1f06eb4SAndreas Gohr        $this->assertFileExists($targetfile);
917d1f06eb4SAndreas Gohr        $this->assertFileEquals($orig, $targetfile);
918d1f06eb4SAndreas Gohr    }
919d1f06eb4SAndreas Gohr
920d1f06eb4SAndreas Gohr    //core.deleteMedia
921d1f06eb4SAndreas Gohr    public function testDeleteMedia()
922d1f06eb4SAndreas Gohr    {
923d1f06eb4SAndreas Gohr        global $conf;
924d1f06eb4SAndreas Gohr        global $AUTH_ACL;
925d1f06eb4SAndreas Gohr        global $USERINFO;
926d1f06eb4SAndreas Gohr
927d1f06eb4SAndreas Gohr        $id = 'wiki:dokuwiki-128.png';
928d1f06eb4SAndreas Gohr        $file = mediaFN($id);
929d1f06eb4SAndreas Gohr
930d1f06eb4SAndreas Gohr        // deletion should fail, we only have AUTH_UPLOAD
931d1f06eb4SAndreas Gohr        $e = null;
932d1f06eb4SAndreas Gohr        try {
933d1f06eb4SAndreas Gohr            $this->remote->call('core.deleteMedia', ['media' => $id]);
934d1f06eb4SAndreas Gohr        } catch (AccessDeniedException $e) {
935d1f06eb4SAndreas Gohr        }
936d1f06eb4SAndreas Gohr        $this->assertInstanceOf(AccessDeniedException::class, $e);
937d1f06eb4SAndreas Gohr        $this->assertEquals(212, $e->getCode(), 'No permission to delete');
938d1f06eb4SAndreas Gohr        $this->assertFileExists($file);
939d1f06eb4SAndreas Gohr
940d1f06eb4SAndreas Gohr        // setup new ACLs
941d1f06eb4SAndreas Gohr        $conf['useacl'] = 1;
942d1f06eb4SAndreas Gohr        $_SERVER['REMOTE_USER'] = 'john';
943d1f06eb4SAndreas Gohr        $USERINFO['grps'] = array('user');
944d1f06eb4SAndreas Gohr        $AUTH_ACL = array(
945d1f06eb4SAndreas Gohr            '*                  @ALL           0',
946d1f06eb4SAndreas Gohr            '*                  @user          16',
947d1f06eb4SAndreas Gohr        );
948d1f06eb4SAndreas Gohr
949d1f06eb4SAndreas Gohr        // deletion should work now
950d1f06eb4SAndreas Gohr        $this->assertTrue($this->remote->call('core.deleteMedia', ['media' => $id]));
9519ad2b913SAndreas Gohr        $this->assertFileDoesNotExist($file);
952d1f06eb4SAndreas Gohr
953d1f06eb4SAndreas Gohr        clearstatcache(false, $file);
954d1f06eb4SAndreas Gohr
955d1f06eb4SAndreas Gohr        // deleting the file again should not work
956d1f06eb4SAndreas Gohr        $e = null;
957d1f06eb4SAndreas Gohr        try {
958d1f06eb4SAndreas Gohr            $this->remote->call('core.deleteMedia', ['media' => $id]);
959d1f06eb4SAndreas Gohr        } catch (RemoteException $e) {
960d1f06eb4SAndreas Gohr        }
961d1f06eb4SAndreas Gohr        $this->assertInstanceOf(RemoteException::class, $e);
962d1f06eb4SAndreas Gohr        $this->assertEquals(221, $e->getCode(), 'Non existing media id given');
963d1f06eb4SAndreas Gohr    }
964d1f06eb4SAndreas Gohr    // endregion
96553585189SAndreas Gohr}
966