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