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