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