xref: /plugin/sqlite/_test/HelperTest.php (revision d0a5ba7ae2c780ae7f13d185722582499bff7c71)
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