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