1<?php 2 3namespace dokuwiki\test\Search; 4 5use dokuwiki\Search\Indexer; 6use dokuwiki\Search\Index\FileIndex; 7 8/** 9 * Tests the Indexer class 10 */ 11class IndexerTest extends \DokuWikiTest 12{ 13 /** 14 * Test basic page indexing via addPage 15 */ 16 public function testAddPage() 17 { 18 $indexer = new Indexer(); 19 20 saveWikiText('testpage', 'Foo bar baz.', 'Test initialization'); 21 $indexer->addPage('testpage'); 22 23 // page should be in the entity index 24 $pageIndex = new FileIndex('page'); 25 $result = $pageIndex->search('/^testpage$/'); 26 $this->assertNotEmpty($result, 'testpage not found in page.idx'); 27 } 28 29 /** 30 * Test that deletePage clears data 31 */ 32 public function testDeletePage() 33 { 34 $indexer = new Indexer(); 35 36 saveWikiText('delpage', 'Delete me content.', 'Test initialization'); 37 $indexer->addPage('delpage'); 38 $indexer->deletePage('delpage', true); 39 40 // page entity persists in page.idx but data is cleared 41 $pageIndex = new FileIndex('page'); 42 $result = $pageIndex->search('/^delpage$/'); 43 $this->assertNotEmpty($result, 'delpage should persist in page.idx'); 44 } 45 46 /** 47 * Test renamePage clears old and indexes new 48 */ 49 public function testRenamePage() 50 { 51 $indexer = new Indexer(); 52 53 saveWikiText('old_name', 'Old page content words.', 'Test initialization'); 54 $indexer->addPage('old_name'); 55 56 // move the page on disk 57 io_rename(wikiFN('old_name'), wikiFN('new_name')); 58 saveWikiText('new_name', 'Old page content words.', 'Renamed'); 59 60 $indexer->renamePage('old_name', 'new_name'); 61 62 // new page should be indexed 63 $pageIndex = new FileIndex('page'); 64 $result = $pageIndex->search('/^new_name$/'); 65 $this->assertNotEmpty($result, 'new_name not found in page.idx after rename'); 66 } 67 68 /** 69 * Test that clear removes all index files 70 */ 71 public function testClear() 72 { 73 global $conf; 74 $indexer = new Indexer(); 75 76 saveWikiText('clearpage', 'Some words to index.', 'Test initialization'); 77 $indexer->addPage('clearpage'); 78 79 $this->assertFileExists($conf['indexdir'] . '/page.idx'); 80 81 $indexer->clear(); 82 83 $this->assertFileDoesNotExist($conf['indexdir'] . '/page.idx'); 84 } 85 86 /** 87 * Test that getVersion returns a version string 88 */ 89 public function testGetVersion() 90 { 91 $indexer = new Indexer(); 92 $version = $indexer->getVersion(); 93 $this->assertNotEmpty($version); 94 $this->assertIsString((string)$version); 95 } 96 97 /** 98 * Test needsIndexing returns true for new pages 99 */ 100 public function testNeedsIndexing() 101 { 102 $indexer = new Indexer(); 103 104 saveWikiText('needsidx', 'Some content.', 'Test initialization'); 105 $this->assertTrue($indexer->needsIndexing('needsidx')); 106 107 $indexer->addPage('needsidx'); 108 // ensure the .indexed tag is strictly newer than the wiki file 109 touch(metaFN('needsidx', '.indexed'), time() + 1); 110 $this->assertFalse($indexer->needsIndexing('needsidx')); 111 $this->assertTrue($indexer->needsIndexing('needsidx', true)); // force 112 } 113 114 /** 115 * Test the logger callback 116 */ 117 public function testLogger() 118 { 119 $messages = []; 120 $indexer = (new Indexer())->setLogger(function ($msg) use (&$messages) { 121 $messages[] = $msg; 122 }); 123 124 saveWikiText('logpage', 'Log test content.', 'Test initialization'); 125 $indexer->addPage('logpage'); 126 127 // ensure the .indexed tag is strictly newer so second call detects "up to date" 128 touch(metaFN('logpage', '.indexed'), time() + 1); 129 130 $indexer->addPage('logpage'); 131 $this->assertNotEmpty($messages); 132 $this->assertStringContainsString('up to date', end($messages)); 133 } 134} 135