xref: /dokuwiki/_test/tests/Search/IndexerTest.php (revision 21fbd01b3c3eea88b767376b7b158f31f0f63127)
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