xref: /dokuwiki/_test/tests/Search/MetadataSearchTest.php (revision 21fbd01b3c3eea88b767376b7b158f31f0f63127)
1<?php
2
3namespace dokuwiki\test\Search;
4
5use dokuwiki\Search\MetadataSearch;
6
7/**
8 * Tests for MetadataSearch utility methods
9 */
10class MetadataSearchTest extends \DokuWikiTest
11{
12    /**
13     * filterPages removes non-existent pages
14     */
15    public function testFilterPagesRemovesNonExistent()
16    {
17        saveWikiText('wiki:existing', 'content', 'init');
18
19        $pages = ['wiki:existing' => true, 'wiki:nonexistent' => true];
20        $result = MetadataSearch::filterPages($pages);
21
22        $this->assertArrayHasKey('wiki:existing', $result);
23        $this->assertArrayNotHasKey('wiki:nonexistent', $result);
24    }
25
26    /**
27     * filterPages respects hidden pages setting
28     */
29    public function testFilterPagesHidden()
30    {
31        global $conf;
32        $conf['hidepages'] = 'hidden:.*';
33
34        saveWikiText('hidden:page', 'content', 'init');
35        saveWikiText('visible:page', 'content', 'init');
36
37        $pages = ['hidden:page' => true, 'visible:page' => true];
38
39        // default: hidden pages are filtered
40        $result = MetadataSearch::filterPages($pages);
41        $this->assertArrayNotHasKey('hidden:page', $result);
42        $this->assertArrayHasKey('visible:page', $result);
43
44        // ignorePerms: hidden pages are kept
45        $result = MetadataSearch::filterPages($pages, true);
46        $this->assertArrayHasKey('hidden:page', $result);
47        $this->assertArrayHasKey('visible:page', $result);
48    }
49
50    /**
51     * filterPages respects ACL permissions
52     */
53    public function testFilterPagesACL()
54    {
55        global $conf;
56        global $AUTH_ACL;
57        $conf['superuser'] = 'admin';
58        $conf['useacl'] = 1;
59
60        $AUTH_ACL = [
61            '*           @ALL           8',
62            'secret:*    @ALL           0',
63        ];
64
65        $_SERVER['REMOTE_USER'] = 'user';
66
67        saveWikiText('public:page', 'content', 'init');
68        saveWikiText('secret:page', 'content', 'init');
69
70        $pages = ['public:page' => true, 'secret:page' => true];
71
72        $result = MetadataSearch::filterPages($pages);
73        $this->assertArrayHasKey('public:page', $result);
74        $this->assertArrayNotHasKey('secret:page', $result);
75
76        $result = MetadataSearch::filterPages($pages, true);
77        $this->assertArrayHasKey('public:page', $result);
78        $this->assertArrayHasKey('secret:page', $result);
79    }
80
81    /**
82     * filterPages filters by modification time
83     */
84    public function testFilterPagesTime()
85    {
86        saveWikiText('wiki:timepage', 'content', 'init');
87        $mtime = filemtime(wikiFN('wiki:timepage'));
88
89        $pages = ['wiki:timepage' => true];
90
91        // after: page mtime is before the threshold → filtered
92        $result = MetadataSearch::filterPages($pages, false, $mtime + 100);
93        $this->assertEmpty($result);
94
95        // after: page mtime is after the threshold → kept
96        $result = MetadataSearch::filterPages($pages, false, $mtime - 100);
97        $this->assertArrayHasKey('wiki:timepage', $result);
98
99        // before: page mtime is after the threshold → filtered
100        $result = MetadataSearch::filterPages($pages, false, null, $mtime - 100);
101        $this->assertEmpty($result);
102
103        // before: page mtime is before the threshold → kept
104        $result = MetadataSearch::filterPages($pages, false, null, $mtime + 100);
105        $this->assertArrayHasKey('wiki:timepage', $result);
106    }
107
108    /**
109     * filterPages preserves original array values
110     */
111    public function testFilterPagesPreservesValues()
112    {
113        saveWikiText('wiki:testpage', 'content', 'init');
114
115        $pages = ['wiki:testpage' => 'My Title'];
116        $result = MetadataSearch::filterPages($pages);
117
118        $this->assertEquals('My Title', $result['wiki:testpage']);
119    }
120}
121