1*d0a5ba7aSAndreas Gohr<?php /** @noinspection SqlDialectInspection */ 2*d0a5ba7aSAndreas Gohr 3*d0a5ba7aSAndreas Gohrnamespace dokuwiki\plugin\sqlite\test; 4*d0a5ba7aSAndreas Gohr 5*d0a5ba7aSAndreas Gohruse DokuWikiTest; 6*d0a5ba7aSAndreas Gohr 7*d0a5ba7aSAndreas Gohr/** 8*d0a5ba7aSAndreas Gohr * Test the helper plugin for backwards compatibility 9*d0a5ba7aSAndreas Gohr * 10*d0a5ba7aSAndreas Gohr * @group plugin_sqlite 11*d0a5ba7aSAndreas Gohr * @group plugins 12*d0a5ba7aSAndreas Gohr */ 13*d0a5ba7aSAndreas Gohrclass HelperTest extends DokuWikiTest 14*d0a5ba7aSAndreas Gohr{ 15*d0a5ba7aSAndreas Gohr 16*d0a5ba7aSAndreas Gohr protected $res; 17*d0a5ba7aSAndreas Gohr 18*d0a5ba7aSAndreas Gohr /** @inheritdoc */ 19*d0a5ba7aSAndreas Gohr public function setUp(): void 20*d0a5ba7aSAndreas Gohr { 21*d0a5ba7aSAndreas Gohr $this->pluginsEnabled[] = 'data'; 22*d0a5ba7aSAndreas Gohr $this->pluginsEnabled[] = 'sqlite'; 23*d0a5ba7aSAndreas Gohr parent::setUp(); 24*d0a5ba7aSAndreas Gohr } 25*d0a5ba7aSAndreas Gohr 26*d0a5ba7aSAndreas Gohr /** 27*d0a5ba7aSAndreas Gohr * @return \helper_plugin_sqlite 28*d0a5ba7aSAndreas Gohr * @throws \Exception when databsse is not initialized 29*d0a5ba7aSAndreas Gohr */ 30*d0a5ba7aSAndreas Gohr protected function getSqliteHelper() 31*d0a5ba7aSAndreas Gohr { 32*d0a5ba7aSAndreas Gohr /** @var $SqliteHelper \helper_plugin_sqlite */ 33*d0a5ba7aSAndreas Gohr $SqliteHelper = plugin_load('helper', 'sqlite'); 34*d0a5ba7aSAndreas Gohr if (!$SqliteHelper->init("testdb", DOKU_PLUGIN . "sqlite/_test/db")) { 35*d0a5ba7aSAndreas Gohr throw new \Exception('Initializing Sqlite Helper fails!'); 36*d0a5ba7aSAndreas Gohr } 37*d0a5ba7aSAndreas Gohr return $SqliteHelper; 38*d0a5ba7aSAndreas Gohr } 39*d0a5ba7aSAndreas Gohr 40*d0a5ba7aSAndreas Gohr /** 41*d0a5ba7aSAndreas Gohr * @return \helper_plugin_sqlite 42*d0a5ba7aSAndreas Gohr */ 43*d0a5ba7aSAndreas Gohr protected function getResultSelectquery() 44*d0a5ba7aSAndreas Gohr { 45*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getSqliteHelper(); 46*d0a5ba7aSAndreas Gohr 47*d0a5ba7aSAndreas Gohr $sql = "SELECT * FROM testdata WHERE keyword='music'"; 48*d0a5ba7aSAndreas Gohr $res = $SqliteHelper->query($sql); 49*d0a5ba7aSAndreas Gohr $this->res = $res; 50*d0a5ba7aSAndreas Gohr return $SqliteHelper; 51*d0a5ba7aSAndreas Gohr } 52*d0a5ba7aSAndreas Gohr 53*d0a5ba7aSAndreas Gohr /** 54*d0a5ba7aSAndreas Gohr * @return \helper_plugin_sqlite 55*d0a5ba7aSAndreas Gohr */ 56*d0a5ba7aSAndreas Gohr protected function getResultInsertquery() 57*d0a5ba7aSAndreas Gohr { 58*d0a5ba7aSAndreas Gohr /** @var $SqliteHelper \helper_plugin_sqlite */ 59*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getSqliteHelper(); 60*d0a5ba7aSAndreas Gohr 61*d0a5ba7aSAndreas Gohr $sql = "INSERT INTO testdata VALUES(20,'glass','Purple')"; 62*d0a5ba7aSAndreas Gohr $res = $SqliteHelper->query($sql); 63*d0a5ba7aSAndreas Gohr $this->res = $res; 64*d0a5ba7aSAndreas Gohr return $SqliteHelper; 65*d0a5ba7aSAndreas Gohr } 66*d0a5ba7aSAndreas Gohr 67*d0a5ba7aSAndreas Gohr public function testSQLstring2array() 68*d0a5ba7aSAndreas Gohr { 69*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getSqliteHelper(); 70*d0a5ba7aSAndreas Gohr 71*d0a5ba7aSAndreas Gohr $sqlstring1 = "INSERT INTO data VALUES('text','text ;text')"; 72*d0a5ba7aSAndreas Gohr $sqlarray1 = array("INSERT INTO data VALUES('text','text ;text')"); 73*d0a5ba7aSAndreas Gohr 74*d0a5ba7aSAndreas Gohr $sqlstring2 = "INSERT INTO data VALUES('text','text ;text');INSERT INTO data VALUES('text','te''xt ;text');"; 75*d0a5ba7aSAndreas Gohr $sqlarray2 = array( 76*d0a5ba7aSAndreas Gohr "INSERT INTO data VALUES('text','text ;text')", 77*d0a5ba7aSAndreas Gohr "INSERT INTO data VALUES('text','te''xt ;text')" 78*d0a5ba7aSAndreas Gohr ); 79*d0a5ba7aSAndreas Gohr 80*d0a5ba7aSAndreas Gohr $this->assertEquals($sqlarray1, $SqliteHelper->SQLstring2array($sqlstring1)); 81*d0a5ba7aSAndreas Gohr $this->assertEquals($sqlarray2, $SqliteHelper->SQLstring2array($sqlstring2)); 82*d0a5ba7aSAndreas Gohr } 83*d0a5ba7aSAndreas Gohr 84*d0a5ba7aSAndreas Gohr public function testSQLstring2array_complex() 85*d0a5ba7aSAndreas Gohr { 86*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getSqliteHelper(); 87*d0a5ba7aSAndreas Gohr 88*d0a5ba7aSAndreas Gohr $input = <<<EOF 89*d0a5ba7aSAndreas Gohr-- This is test data for the SQLstring2array function 90*d0a5ba7aSAndreas Gohr 91*d0a5ba7aSAndreas GohrINSERT INTO foo SET bar = ' 92*d0a5ba7aSAndreas Gohrsome multi''d line string 93*d0a5ba7aSAndreas Gohr-- not a comment 94*d0a5ba7aSAndreas Gohr'; 95*d0a5ba7aSAndreas Gohr 96*d0a5ba7aSAndreas GohrSELECT * FROM bar; 97*d0a5ba7aSAndreas GohrSELECT * FROM bax; 98*d0a5ba7aSAndreas Gohr 99*d0a5ba7aSAndreas GohrSELECT * FROM bar; SELECT * FROM bax; 100*d0a5ba7aSAndreas Gohr"; 101*d0a5ba7aSAndreas GohrEOF; 102*d0a5ba7aSAndreas Gohr 103*d0a5ba7aSAndreas Gohr $statements = $SqliteHelper->SQLstring2array($input); 104*d0a5ba7aSAndreas Gohr 105*d0a5ba7aSAndreas Gohr $this->assertCount(6, $statements, 'number of detected statements'); 106*d0a5ba7aSAndreas Gohr 107*d0a5ba7aSAndreas Gohr $this->assertStringContainsString('some multi\'\'d line string', $statements[0]); 108*d0a5ba7aSAndreas Gohr $this->assertStringContainsString('-- not a comment', $statements[0]); 109*d0a5ba7aSAndreas Gohr 110*d0a5ba7aSAndreas Gohr $this->assertEquals('SELECT * FROM bar', $statements[1]); 111*d0a5ba7aSAndreas Gohr $this->assertEquals('SELECT * FROM bax', $statements[2]); 112*d0a5ba7aSAndreas Gohr $this->assertEquals('SELECT * FROM bar', $statements[3]); 113*d0a5ba7aSAndreas Gohr $this->assertEquals('SELECT * FROM bax', $statements[4]); 114*d0a5ba7aSAndreas Gohr } 115*d0a5ba7aSAndreas Gohr 116*d0a5ba7aSAndreas Gohr public function testQuoteAndJoin() 117*d0a5ba7aSAndreas Gohr { 118*d0a5ba7aSAndreas Gohr /** @var $SqliteHelper \helper_plugin_sqlite */ 119*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getSqliteHelper(); 120*d0a5ba7aSAndreas Gohr 121*d0a5ba7aSAndreas Gohr $string = "Co'mpl''ex \"st'\"ring"; 122*d0a5ba7aSAndreas Gohr $vals = array($string, $string); 123*d0a5ba7aSAndreas Gohr $quotedstring = "'Co''mpl''''ex \"st''\"ring','Co''mpl''''ex \"st''\"ring'"; 124*d0a5ba7aSAndreas Gohr $this->assertEquals($quotedstring, $SqliteHelper->quote_and_join($vals)); 125*d0a5ba7aSAndreas Gohr } 126*d0a5ba7aSAndreas Gohr 127*d0a5ba7aSAndreas Gohr public function testQuoteString() 128*d0a5ba7aSAndreas Gohr { 129*d0a5ba7aSAndreas Gohr /** @var $SqliteHelper \helper_plugin_sqlite */ 130*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getSqliteHelper(); 131*d0a5ba7aSAndreas Gohr 132*d0a5ba7aSAndreas Gohr $string = "Co'mpl''ex \"st'\"ring"; 133*d0a5ba7aSAndreas Gohr $quotedstring = "'Co''mpl''''ex \"st''\"ring'"; 134*d0a5ba7aSAndreas Gohr $this->assertEquals($quotedstring, $SqliteHelper->quote_string($string)); 135*d0a5ba7aSAndreas Gohr } 136*d0a5ba7aSAndreas Gohr 137*d0a5ba7aSAndreas Gohr function testEscapeString() 138*d0a5ba7aSAndreas Gohr { 139*d0a5ba7aSAndreas Gohr /** @var $SqliteHelper \helper_plugin_sqlite */ 140*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getSqliteHelper(); 141*d0a5ba7aSAndreas Gohr 142*d0a5ba7aSAndreas Gohr $string = "Co'mpl''ex \"st'\"ring"; 143*d0a5ba7aSAndreas Gohr $quotedstring = "Co''mpl''''ex \"st''\"ring"; 144*d0a5ba7aSAndreas Gohr $this->assertEquals($quotedstring, $SqliteHelper->escape_string($string)); 145*d0a5ba7aSAndreas Gohr } 146*d0a5ba7aSAndreas Gohr 147*d0a5ba7aSAndreas Gohr function testQuerySelect() 148*d0a5ba7aSAndreas Gohr { 149*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getResultSelectquery(); 150*d0a5ba7aSAndreas Gohr $this->assertNotEquals(false, $this->res); 151*d0a5ba7aSAndreas Gohr 152*d0a5ba7aSAndreas Gohr //close cursor 153*d0a5ba7aSAndreas Gohr $SqliteHelper->res_close($this->res); 154*d0a5ba7aSAndreas Gohr } 155*d0a5ba7aSAndreas Gohr 156*d0a5ba7aSAndreas Gohr function testRes2arrAssoc() 157*d0a5ba7aSAndreas Gohr { 158*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getResultSelectquery(); 159*d0a5ba7aSAndreas Gohr 160*d0a5ba7aSAndreas Gohr $resultassoc = array( 161*d0a5ba7aSAndreas Gohr 0 => array('tid' => 3, 'keyword' => 'music', 'value' => 'happy'), 162*d0a5ba7aSAndreas Gohr 1 => array('tid' => 4, 'keyword' => 'music', 'value' => 'Classic'), 163*d0a5ba7aSAndreas Gohr 2 => array('tid' => 5, 'keyword' => 'music', 'value' => 'Pop'), 164*d0a5ba7aSAndreas Gohr 3 => array('tid' => 8, 'keyword' => 'music', 'value' => 'Pink'), 165*d0a5ba7aSAndreas Gohr 4 => array('tid' => 10, 'keyword' => 'music', 'value' => 'Boring') 166*d0a5ba7aSAndreas Gohr ); 167*d0a5ba7aSAndreas Gohr 168*d0a5ba7aSAndreas Gohr $this->assertEquals($resultassoc, $SqliteHelper->res2arr($this->res, $assoc = true)); 169*d0a5ba7aSAndreas Gohr $this->assertEquals(array(), $SqliteHelper->res2arr(false)); 170*d0a5ba7aSAndreas Gohr } 171*d0a5ba7aSAndreas Gohr 172*d0a5ba7aSAndreas Gohr function testRes2arrNum() 173*d0a5ba7aSAndreas Gohr { 174*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getResultSelectquery(); 175*d0a5ba7aSAndreas Gohr 176*d0a5ba7aSAndreas Gohr $resultnum = array( 177*d0a5ba7aSAndreas Gohr 0 => array(0 => 3, 1 => 'music', 2 => 'happy'), 178*d0a5ba7aSAndreas Gohr 1 => array(0 => 4, 1 => 'music', 2 => 'Classic'), 179*d0a5ba7aSAndreas Gohr 2 => array(0 => 5, 1 => 'music', 2 => 'Pop'), 180*d0a5ba7aSAndreas Gohr 3 => array(0 => 8, 1 => 'music', 2 => 'Pink'), 181*d0a5ba7aSAndreas Gohr 4 => array(0 => 10, 1 => 'music', 2 => 'Boring') 182*d0a5ba7aSAndreas Gohr ); 183*d0a5ba7aSAndreas Gohr 184*d0a5ba7aSAndreas Gohr $this->assertEquals($resultnum, $SqliteHelper->res2arr($this->res, $assoc = false)); 185*d0a5ba7aSAndreas Gohr } 186*d0a5ba7aSAndreas Gohr 187*d0a5ba7aSAndreas Gohr function testRes2row() 188*d0a5ba7aSAndreas Gohr { 189*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getResultSelectquery(); 190*d0a5ba7aSAndreas Gohr 191*d0a5ba7aSAndreas Gohr $result0 = array('tid' => 3, 'keyword' => 'music', 'value' => 'happy',); 192*d0a5ba7aSAndreas Gohr $result2 = array('tid' => 5, 'keyword' => 'music', 'value' => 'Pop',); 193*d0a5ba7aSAndreas Gohr 194*d0a5ba7aSAndreas Gohr $this->assertEquals(false, $SqliteHelper->res2row(false)); 195*d0a5ba7aSAndreas Gohr $this->assertEquals($result0, $SqliteHelper->res2row($this->res)); 196*d0a5ba7aSAndreas Gohr $SqliteHelper->res2row($this->res); // skip one row 197*d0a5ba7aSAndreas Gohr $this->assertEquals($result2, $SqliteHelper->res2row($this->res)); 198*d0a5ba7aSAndreas Gohr 199*d0a5ba7aSAndreas Gohr //close cursor 200*d0a5ba7aSAndreas Gohr $SqliteHelper->res_close($this->res); 201*d0a5ba7aSAndreas Gohr } 202*d0a5ba7aSAndreas Gohr 203*d0a5ba7aSAndreas Gohr function testRes2single() 204*d0a5ba7aSAndreas Gohr { 205*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getResultSelectquery(); 206*d0a5ba7aSAndreas Gohr 207*d0a5ba7aSAndreas Gohr $result1 = 3; 208*d0a5ba7aSAndreas Gohr $result2 = 4; 209*d0a5ba7aSAndreas Gohr 210*d0a5ba7aSAndreas Gohr $this->assertEquals(false, $SqliteHelper->res2single(false)); 211*d0a5ba7aSAndreas Gohr $this->assertEquals($result1, $SqliteHelper->res2single($this->res)); 212*d0a5ba7aSAndreas Gohr $this->assertEquals($result2, $SqliteHelper->res2single($this->res)); //next row 213*d0a5ba7aSAndreas Gohr 214*d0a5ba7aSAndreas Gohr //close cursor 215*d0a5ba7aSAndreas Gohr $SqliteHelper->res_close($this->res); 216*d0a5ba7aSAndreas Gohr } 217*d0a5ba7aSAndreas Gohr 218*d0a5ba7aSAndreas Gohr function testResFetchArray() 219*d0a5ba7aSAndreas Gohr { 220*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getResultSelectquery(); 221*d0a5ba7aSAndreas Gohr 222*d0a5ba7aSAndreas Gohr $result0 = array(0 => 3, 1 => 'music', 2 => 'happy'); 223*d0a5ba7aSAndreas Gohr $result1 = array(0 => 4, 1 => 'music', 2 => 'Classic'); 224*d0a5ba7aSAndreas Gohr 225*d0a5ba7aSAndreas Gohr $this->assertEquals(false, $SqliteHelper->res_fetch_array(false)); 226*d0a5ba7aSAndreas Gohr $this->assertEquals($result0, $SqliteHelper->res_fetch_array($this->res)); 227*d0a5ba7aSAndreas Gohr $this->assertEquals($result1, $SqliteHelper->res_fetch_array($this->res)); //next row 228*d0a5ba7aSAndreas Gohr 229*d0a5ba7aSAndreas Gohr //close cursor 230*d0a5ba7aSAndreas Gohr $SqliteHelper->res_close($this->res); 231*d0a5ba7aSAndreas Gohr } 232*d0a5ba7aSAndreas Gohr 233*d0a5ba7aSAndreas Gohr function testFetchAssoc() 234*d0a5ba7aSAndreas Gohr { 235*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getResultSelectquery(); 236*d0a5ba7aSAndreas Gohr 237*d0a5ba7aSAndreas Gohr $result0 = array('tid' => 3, 'keyword' => 'music', 'value' => 'happy',); 238*d0a5ba7aSAndreas Gohr $result1 = array('tid' => 4, 'keyword' => 'music', 'value' => 'Classic'); 239*d0a5ba7aSAndreas Gohr 240*d0a5ba7aSAndreas Gohr $this->assertEquals(false, $SqliteHelper->res_fetch_assoc(false)); 241*d0a5ba7aSAndreas Gohr $this->assertEquals($result0, $SqliteHelper->res_fetch_assoc($this->res)); 242*d0a5ba7aSAndreas Gohr $this->assertEquals($result1, $SqliteHelper->res_fetch_assoc($this->res)); //next row 243*d0a5ba7aSAndreas Gohr 244*d0a5ba7aSAndreas Gohr //close cursor 245*d0a5ba7aSAndreas Gohr $SqliteHelper->res_close($this->res); 246*d0a5ba7aSAndreas Gohr } 247*d0a5ba7aSAndreas Gohr 248*d0a5ba7aSAndreas Gohr function testRes2count() 249*d0a5ba7aSAndreas Gohr { 250*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getResultSelectquery(); 251*d0a5ba7aSAndreas Gohr 252*d0a5ba7aSAndreas Gohr $result = 5; 253*d0a5ba7aSAndreas Gohr 254*d0a5ba7aSAndreas Gohr $this->assertSame(0, $SqliteHelper->res2count(false)); 255*d0a5ba7aSAndreas Gohr $this->assertEquals($result, $SqliteHelper->res2count($this->res)); 256*d0a5ba7aSAndreas Gohr } 257*d0a5ba7aSAndreas Gohr 258*d0a5ba7aSAndreas Gohr function testCountChanges() 259*d0a5ba7aSAndreas Gohr { 260*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getResultInsertquery(); 261*d0a5ba7aSAndreas Gohr 262*d0a5ba7aSAndreas Gohr $this->assertSame(0, $SqliteHelper->countChanges(false), 'Empty result'); 263*d0a5ba7aSAndreas Gohr $this->assertEquals(1, $SqliteHelper->countChanges($this->res), 'Insert result'); 264*d0a5ba7aSAndreas Gohr } 265*d0a5ba7aSAndreas Gohr 266*d0a5ba7aSAndreas Gohr function testSerialize() 267*d0a5ba7aSAndreas Gohr { 268*d0a5ba7aSAndreas Gohr $SqliteHelper = $this->getSqliteHelper(); 269*d0a5ba7aSAndreas Gohr 270*d0a5ba7aSAndreas Gohr $res = $SqliteHelper->query('SELECT * FROM testdata'); 271*d0a5ba7aSAndreas Gohr $this->assertNotFalse($res); 272*d0a5ba7aSAndreas Gohr $SqliteHelper->res_close($res); 273*d0a5ba7aSAndreas Gohr 274*d0a5ba7aSAndreas Gohr $obj = unserialize(serialize($SqliteHelper)); 275*d0a5ba7aSAndreas Gohr 276*d0a5ba7aSAndreas Gohr $res = $obj->query('SELECT * FROM testdata'); 277*d0a5ba7aSAndreas Gohr $this->assertNotFalse($res); 278*d0a5ba7aSAndreas Gohr $obj->res_close($res); 279*d0a5ba7aSAndreas Gohr } 280*d0a5ba7aSAndreas Gohr} 281