xref: /dokuwiki/_test/tests/Search/Query/NamespacePredicateTest.php (revision ede4646658cf51245060332d97a319a39c788ea1)
1*ede46466SAndreas Gohr<?php
2*ede46466SAndreas Gohr
3*ede46466SAndreas Gohrnamespace dokuwiki\test\Search\Query;
4*ede46466SAndreas Gohr
5*ede46466SAndreas Gohruse dokuwiki\Search\Query\NamespacePredicate;
6*ede46466SAndreas Gohruse dokuwiki\Search\Query\PageSet;
7*ede46466SAndreas Gohr
8*ede46466SAndreas Gohrclass NamespacePredicateTest extends \DokuWikiTest
9*ede46466SAndreas Gohr{
10*ede46466SAndreas Gohr    protected PageSet $pages;
11*ede46466SAndreas Gohr
12*ede46466SAndreas Gohr    public function setUp(): void
13*ede46466SAndreas Gohr    {
14*ede46466SAndreas Gohr        parent::setUp();
15*ede46466SAndreas Gohr        $this->pages = new PageSet([
16*ede46466SAndreas Gohr            'wiki:start' => 5,
17*ede46466SAndreas Gohr            'wiki:syntax' => 3,
18*ede46466SAndreas Gohr            'wiki:sub:page' => 2,
19*ede46466SAndreas Gohr            'other:page' => 4,
20*ede46466SAndreas Gohr            'other:deep:nested' => 1,
21*ede46466SAndreas Gohr            'toplevel' => 6,
22*ede46466SAndreas Gohr        ]);
23*ede46466SAndreas Gohr    }
24*ede46466SAndreas Gohr
25*ede46466SAndreas Gohr    public function testGetPrefix()
26*ede46466SAndreas Gohr    {
27*ede46466SAndreas Gohr        $ns = new NamespacePredicate('wiki:');
28*ede46466SAndreas Gohr        $this->assertEquals('wiki:', $ns->getPrefix());
29*ede46466SAndreas Gohr    }
30*ede46466SAndreas Gohr
31*ede46466SAndreas Gohr    public function testFilterKeepsMatchingNamespace()
32*ede46466SAndreas Gohr    {
33*ede46466SAndreas Gohr        $ns = new NamespacePredicate('wiki:');
34*ede46466SAndreas Gohr        $result = $ns->filter($this->pages);
35*ede46466SAndreas Gohr
36*ede46466SAndreas Gohr        $this->assertEquals([
37*ede46466SAndreas Gohr            'wiki:start' => 5,
38*ede46466SAndreas Gohr            'wiki:syntax' => 3,
39*ede46466SAndreas Gohr            'wiki:sub:page' => 2,
40*ede46466SAndreas Gohr        ], $result->getPages());
41*ede46466SAndreas Gohr    }
42*ede46466SAndreas Gohr
43*ede46466SAndreas Gohr    public function testFilterIncludesSubNamespaces()
44*ede46466SAndreas Gohr    {
45*ede46466SAndreas Gohr        $ns = new NamespacePredicate('wiki:');
46*ede46466SAndreas Gohr        $result = $ns->filter($this->pages);
47*ede46466SAndreas Gohr
48*ede46466SAndreas Gohr        $this->assertArrayHasKey('wiki:sub:page', $result->getPages());
49*ede46466SAndreas Gohr    }
50*ede46466SAndreas Gohr
51*ede46466SAndreas Gohr    public function testFilterDoesNotMatchPartialPrefix()
52*ede46466SAndreas Gohr    {
53*ede46466SAndreas Gohr        // "other:" must not match "otherstuff:page"
54*ede46466SAndreas Gohr        $pages = new PageSet([
55*ede46466SAndreas Gohr            'other:page' => 1,
56*ede46466SAndreas Gohr            'otherstuff:page' => 2,
57*ede46466SAndreas Gohr        ]);
58*ede46466SAndreas Gohr        $ns = new NamespacePredicate('other:');
59*ede46466SAndreas Gohr        $result = $ns->filter($pages);
60*ede46466SAndreas Gohr
61*ede46466SAndreas Gohr        $this->assertEquals(['other:page' => 1], $result->getPages());
62*ede46466SAndreas Gohr    }
63*ede46466SAndreas Gohr
64*ede46466SAndreas Gohr    public function testExcludeRemovesMatchingNamespace()
65*ede46466SAndreas Gohr    {
66*ede46466SAndreas Gohr        $ns = new NamespacePredicate('wiki:');
67*ede46466SAndreas Gohr        $result = $ns->exclude($this->pages);
68*ede46466SAndreas Gohr
69*ede46466SAndreas Gohr        $this->assertEquals([
70*ede46466SAndreas Gohr            'other:page' => 4,
71*ede46466SAndreas Gohr            'other:deep:nested' => 1,
72*ede46466SAndreas Gohr            'toplevel' => 6,
73*ede46466SAndreas Gohr        ], $result->getPages());
74*ede46466SAndreas Gohr    }
75*ede46466SAndreas Gohr
76*ede46466SAndreas Gohr    public function testFilterOnEmptyPageSet()
77*ede46466SAndreas Gohr    {
78*ede46466SAndreas Gohr        $ns = new NamespacePredicate('wiki:');
79*ede46466SAndreas Gohr        $result = $ns->filter(new PageSet());
80*ede46466SAndreas Gohr
81*ede46466SAndreas Gohr        $this->assertEquals([], $result->getPages());
82*ede46466SAndreas Gohr    }
83*ede46466SAndreas Gohr
84*ede46466SAndreas Gohr    public function testFilterNoMatch()
85*ede46466SAndreas Gohr    {
86*ede46466SAndreas Gohr        $ns = new NamespacePredicate('nonexistent:');
87*ede46466SAndreas Gohr        $result = $ns->filter($this->pages);
88*ede46466SAndreas Gohr
89*ede46466SAndreas Gohr        $this->assertEquals([], $result->getPages());
90*ede46466SAndreas Gohr    }
91*ede46466SAndreas Gohr
92*ede46466SAndreas Gohr    public function testExcludeNoMatch()
93*ede46466SAndreas Gohr    {
94*ede46466SAndreas Gohr        $ns = new NamespacePredicate('nonexistent:');
95*ede46466SAndreas Gohr        $result = $ns->exclude($this->pages);
96*ede46466SAndreas Gohr
97*ede46466SAndreas Gohr        // all pages should remain
98*ede46466SAndreas Gohr        $this->assertEquals($this->pages->getPages(), $result->getPages());
99*ede46466SAndreas Gohr    }
100*ede46466SAndreas Gohr
101*ede46466SAndreas Gohr    public function testPreservesScores()
102*ede46466SAndreas Gohr    {
103*ede46466SAndreas Gohr        $ns = new NamespacePredicate('other:');
104*ede46466SAndreas Gohr        $result = $ns->filter($this->pages);
105*ede46466SAndreas Gohr
106*ede46466SAndreas Gohr        $this->assertEquals(4, $result->getPages()['other:page']);
107*ede46466SAndreas Gohr        $this->assertEquals(1, $result->getPages()['other:deep:nested']);
108*ede46466SAndreas Gohr    }
109*ede46466SAndreas Gohr}
110