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