xref: /plugin/tagging/_test/SearchTest.php (revision 55d5df8c4e40f0eede3f71e725efe9b563b29dbd)
1*55d5df8cSAnna Dabrowska<?php
2*55d5df8cSAnna Dabrowska
3*55d5df8cSAnna Dabrowskanamespace dokuwiki\plugin\tagging\test;
4*55d5df8cSAnna Dabrowska
5*55d5df8cSAnna Dabrowskause DokuWikiTest;
6*55d5df8cSAnna Dabrowska
7*55d5df8cSAnna Dabrowska/**
8*55d5df8cSAnna Dabrowska * Helper tests for the tagging plugin
9*55d5df8cSAnna Dabrowska *
10*55d5df8cSAnna Dabrowska * @group plugin_tagging
11*55d5df8cSAnna Dabrowska * @group plugins
12*55d5df8cSAnna Dabrowska */
13*55d5df8cSAnna Dabrowskaclass SearchTest extends DokuWikiTest
14*55d5df8cSAnna Dabrowska{
15*55d5df8cSAnna Dabrowska    protected $pluginsEnabled = ['tagging', 'sqlite'];
16*55d5df8cSAnna Dabrowska
17*55d5df8cSAnna Dabrowska    /**
18*55d5df8cSAnna Dabrowska     * Provide the test data
19*55d5df8cSAnna Dabrowska     *
20*55d5df8cSAnna Dabrowska     * @return array
21*55d5df8cSAnna Dabrowska     */
22*55d5df8cSAnna Dabrowska    public function dataTags()
23*55d5df8cSAnna Dabrowska    {
24*55d5df8cSAnna Dabrowska        return [
25*55d5df8cSAnna Dabrowska            [
26*55d5df8cSAnna Dabrowska                ['ortag' => ['image']],
27*55d5df8cSAnna Dabrowska                'SELECT pid AS item, COUNT(*) AS cnt
28*55d5df8cSAnna Dabrowska                FROM taggings
29*55d5df8cSAnna Dabrowska                WHERE 1=1
30*55d5df8cSAnna Dabrowska                AND CLEANTAG(tag) = CLEANTAG(?)
31*55d5df8cSAnna Dabrowska                AND GETACCESSLEVEL(pid) >= '. AUTH_READ .'
32*55d5df8cSAnna Dabrowska                GROUP BY pid
33*55d5df8cSAnna Dabrowska                ORDER BY cnt DESC, pid'
34*55d5df8cSAnna Dabrowska            ],
35*55d5df8cSAnna Dabrowska            [
36*55d5df8cSAnna Dabrowska                ['ortag' => ['acks', 'image']],
37*55d5df8cSAnna Dabrowska                'SELECT pid AS item, COUNT(*) AS cnt
38*55d5df8cSAnna Dabrowska                FROM taggings
39*55d5df8cSAnna Dabrowska                WHERE 1=1
40*55d5df8cSAnna Dabrowska                AND CLEANTAG(tag) = CLEANTAG(?) OR CLEANTAG(tag) = CLEANTAG(?)
41*55d5df8cSAnna Dabrowska                AND GETACCESSLEVEL(pid) >= '. AUTH_READ .'
42*55d5df8cSAnna Dabrowska                GROUP BY pid
43*55d5df8cSAnna Dabrowska                ORDER BY cnt DESC, pid'
44*55d5df8cSAnna Dabrowska            ],
45*55d5df8cSAnna Dabrowska            [
46*55d5df8cSAnna Dabrowska                ['andtag' => ['acks', 'image']],
47*55d5df8cSAnna Dabrowska                'SELECT pid AS item, COUNT(*) AS cnt
48*55d5df8cSAnna Dabrowska                FROM taggings
49*55d5df8cSAnna Dabrowska                WHERE 1=1
50*55d5df8cSAnna Dabrowska                AND CLEANTAG(tag) = CLEANTAG(?) OR CLEANTAG(tag) = CLEANTAG(?)
51*55d5df8cSAnna Dabrowska                AND GETACCESSLEVEL(pid) >= '. AUTH_READ .'
52*55d5df8cSAnna Dabrowska                GROUP BY pid
53*55d5df8cSAnna Dabrowska                HAVING cnt = 2
54*55d5df8cSAnna Dabrowska                ORDER BY cnt DESC, pid'
55*55d5df8cSAnna Dabrowska            ],
56*55d5df8cSAnna Dabrowska            [
57*55d5df8cSAnna Dabrowska                [
58*55d5df8cSAnna Dabrowska                    'ortag' => ['image'],
59*55d5df8cSAnna Dabrowska                    'ns' => ['wiki:*']
60*55d5df8cSAnna Dabrowska                ],
61*55d5df8cSAnna Dabrowska                'SELECT pid AS item, COUNT(*) AS cnt
62*55d5df8cSAnna Dabrowska                FROM taggings
63*55d5df8cSAnna Dabrowska                WHERE 1=1
64*55d5df8cSAnna Dabrowska                AND pid GLOB ?
65*55d5df8cSAnna Dabrowska                AND CLEANTAG(tag) = CLEANTAG(?)
66*55d5df8cSAnna Dabrowska                AND GETACCESSLEVEL(pid) >= '. AUTH_READ .'
67*55d5df8cSAnna Dabrowska                GROUP BY pid
68*55d5df8cSAnna Dabrowska                ORDER BY cnt DESC, pid'
69*55d5df8cSAnna Dabrowska            ],
70*55d5df8cSAnna Dabrowska            [
71*55d5df8cSAnna Dabrowska                [
72*55d5df8cSAnna Dabrowska                    'ortag' => ['image'],
73*55d5df8cSAnna Dabrowska                    'notns' => ['wiki:*']
74*55d5df8cSAnna Dabrowska                ],
75*55d5df8cSAnna Dabrowska                'SELECT pid AS item, COUNT(*) AS cnt
76*55d5df8cSAnna Dabrowska                FROM taggings
77*55d5df8cSAnna Dabrowska                WHERE 1=1
78*55d5df8cSAnna Dabrowska                AND pid NOT GLOB ?
79*55d5df8cSAnna Dabrowska                AND CLEANTAG(tag) = CLEANTAG(?)
80*55d5df8cSAnna Dabrowska                AND GETACCESSLEVEL(pid) >= '. AUTH_READ .'
81*55d5df8cSAnna Dabrowska                GROUP BY pid
82*55d5df8cSAnna Dabrowska                ORDER BY cnt DESC, pid'
83*55d5df8cSAnna Dabrowska
84*55d5df8cSAnna Dabrowska            ],
85*55d5df8cSAnna Dabrowska            [
86*55d5df8cSAnna Dabrowska                [
87*55d5df8cSAnna Dabrowska                    'ortag' => ['image'],
88*55d5df8cSAnna Dabrowska                    'notns' => ['wiki:*', 'awiki:*']
89*55d5df8cSAnna Dabrowska                ],
90*55d5df8cSAnna Dabrowska                'SELECT pid AS item, COUNT(*) AS cnt
91*55d5df8cSAnna Dabrowska                FROM taggings
92*55d5df8cSAnna Dabrowska                WHERE 1=1
93*55d5df8cSAnna Dabrowska                AND pid NOT GLOB ? AND pid NOT GLOB ?
94*55d5df8cSAnna Dabrowska                AND CLEANTAG(tag) = CLEANTAG(?)
95*55d5df8cSAnna Dabrowska                AND GETACCESSLEVEL(pid) >= '. AUTH_READ .'
96*55d5df8cSAnna Dabrowska                GROUP BY pid
97*55d5df8cSAnna Dabrowska                ORDER BY cnt DESC, pid'
98*55d5df8cSAnna Dabrowska            ],
99*55d5df8cSAnna Dabrowska            [
100*55d5df8cSAnna Dabrowska                ['ortag' => ['acks*']],
101*55d5df8cSAnna Dabrowska                'SELECT pid AS item, COUNT(*) AS cnt
102*55d5df8cSAnna Dabrowska                FROM taggings
103*55d5df8cSAnna Dabrowska                WHERE 1=1
104*55d5df8cSAnna Dabrowska                AND CLEANTAG(tag) GLOB CLEANTAG(?)
105*55d5df8cSAnna Dabrowska                AND GETACCESSLEVEL(pid) >= '. AUTH_READ .'
106*55d5df8cSAnna Dabrowska                GROUP BY pid
107*55d5df8cSAnna Dabrowska                ORDER BY cnt DESC, pid'
108*55d5df8cSAnna Dabrowska            ],
109*55d5df8cSAnna Dabrowska            [
110*55d5df8cSAnna Dabrowska                ['ortag' => ['acks', 'image*']],
111*55d5df8cSAnna Dabrowska                'SELECT pid AS item, COUNT(*) AS cnt
112*55d5df8cSAnna Dabrowska                FROM taggings
113*55d5df8cSAnna Dabrowska                WHERE 1=1
114*55d5df8cSAnna Dabrowska                AND CLEANTAG(tag) = CLEANTAG(?) OR CLEANTAG(tag) GLOB CLEANTAG(?)
115*55d5df8cSAnna Dabrowska                AND GETACCESSLEVEL(pid) >= '. AUTH_READ .'
116*55d5df8cSAnna Dabrowska                GROUP BY pid
117*55d5df8cSAnna Dabrowska                ORDER BY cnt DESC, pid'
118*55d5df8cSAnna Dabrowska            ],
119*55d5df8cSAnna Dabrowska            [
120*55d5df8cSAnna Dabrowska                ['ortag' => ['acks*', 'image']],
121*55d5df8cSAnna Dabrowska                'SELECT pid AS item, COUNT(*) AS cnt
122*55d5df8cSAnna Dabrowska                FROM taggings
123*55d5df8cSAnna Dabrowska                WHERE 1=1
124*55d5df8cSAnna Dabrowska                AND CLEANTAG(tag) GLOB CLEANTAG(?) OR CLEANTAG(tag) = CLEANTAG(?)
125*55d5df8cSAnna Dabrowska                AND GETACCESSLEVEL(pid) >= '. AUTH_READ .'
126*55d5df8cSAnna Dabrowska                GROUP BY pid
127*55d5df8cSAnna Dabrowska                ORDER BY cnt DESC, pid'
128*55d5df8cSAnna Dabrowska            ],
129*55d5df8cSAnna Dabrowska            [
130*55d5df8cSAnna Dabrowska                ['ortag' => ['acks*', 'image*']],
131*55d5df8cSAnna Dabrowska                'SELECT pid AS item, COUNT(*) AS cnt
132*55d5df8cSAnna Dabrowska                FROM taggings
133*55d5df8cSAnna Dabrowska                WHERE 1=1
134*55d5df8cSAnna Dabrowska                AND CLEANTAG(tag) GLOB CLEANTAG(?) OR CLEANTAG(tag) GLOB CLEANTAG(?)
135*55d5df8cSAnna Dabrowska                AND GETACCESSLEVEL(pid) >= '. AUTH_READ .'
136*55d5df8cSAnna Dabrowska                GROUP BY pid
137*55d5df8cSAnna Dabrowska                ORDER BY cnt DESC, pid'
138*55d5df8cSAnna Dabrowska            ],
139*55d5df8cSAnna Dabrowska            [
140*55d5df8cSAnna Dabrowska                ['andtag' => ['acks*', 'image*']],
141*55d5df8cSAnna Dabrowska                'SELECT pid AS item, COUNT(*) AS cnt
142*55d5df8cSAnna Dabrowska                FROM taggings
143*55d5df8cSAnna Dabrowska                WHERE 1=1
144*55d5df8cSAnna Dabrowska                AND CLEANTAG(tag) GLOB CLEANTAG(?) OR CLEANTAG(tag) GLOB CLEANTAG(?)
145*55d5df8cSAnna Dabrowska                AND GETACCESSLEVEL(pid) >= '. AUTH_READ .'
146*55d5df8cSAnna Dabrowska                GROUP BY pid
147*55d5df8cSAnna Dabrowska                HAVING cnt = 2
148*55d5df8cSAnna Dabrowska                ORDER BY cnt DESC, pid'
149*55d5df8cSAnna Dabrowska            ],
150*55d5df8cSAnna Dabrowska        ];
151*55d5df8cSAnna Dabrowska    }
152*55d5df8cSAnna Dabrowska
153*55d5df8cSAnna Dabrowska    /**
154*55d5df8cSAnna Dabrowska     * Search results
155*55d5df8cSAnna Dabrowska     *
156*55d5df8cSAnna Dabrowska     * @dataProvider dataTags
157*55d5df8cSAnna Dabrowska     * @param array $filter
158*55d5df8cSAnna Dabrowska     * @param string $expected
159*55d5df8cSAnna Dabrowska     */
160*55d5df8cSAnna Dabrowska    public function testSearchSql($filter, $expected)
161*55d5df8cSAnna Dabrowska    {
162*55d5df8cSAnna Dabrowska        /** @var helper_plugin_tagging_querybuilder $queryBuilder */
163*55d5df8cSAnna Dabrowska        $queryBuilder = plugin_load('helper', 'tagging_querybuilder');
164*55d5df8cSAnna Dabrowska        $queryBuilder->setField('pid');
165*55d5df8cSAnna Dabrowska
166*55d5df8cSAnna Dabrowska        if (isset($filter['andtag'])) {
167*55d5df8cSAnna Dabrowska            $queryBuilder->setTags($filter['andtag']);
168*55d5df8cSAnna Dabrowska            $queryBuilder->setLogicalAnd(true);
169*55d5df8cSAnna Dabrowska        } else {
170*55d5df8cSAnna Dabrowska            $queryBuilder->setTags($filter['ortag']);
171*55d5df8cSAnna Dabrowska        }
172*55d5df8cSAnna Dabrowska
173*55d5df8cSAnna Dabrowska        if (isset($filter['ns'])) $queryBuilder->includeNS($filter['ns']);
174*55d5df8cSAnna Dabrowska        if (isset($filter['notns'])) $queryBuilder->excludeNS($filter['notns']);
175*55d5df8cSAnna Dabrowska
176*55d5df8cSAnna Dabrowska        $actual = $queryBuilder->getPages()[0];
177*55d5df8cSAnna Dabrowska        $this->assertEquals($this->toSingleLine($expected), $this->toSingleLine($actual));
178*55d5df8cSAnna Dabrowska    }
179*55d5df8cSAnna Dabrowska
180*55d5df8cSAnna Dabrowska    /**
181*55d5df8cSAnna Dabrowska     * @param string $string
182*55d5df8cSAnna Dabrowska     * @return string
183*55d5df8cSAnna Dabrowska     */
184*55d5df8cSAnna Dabrowska    protected function toSingleLine($string)
185*55d5df8cSAnna Dabrowska    {
186*55d5df8cSAnna Dabrowska        $string = str_replace(["\r","\n"], '', $string);
187*55d5df8cSAnna Dabrowska        $string = preg_replace('/ +/', ' ', $string);
188*55d5df8cSAnna Dabrowska        return trim($string);
189*55d5df8cSAnna Dabrowska    }
190*55d5df8cSAnna Dabrowska}
191