xref: /plugin/struct/_test/AccessTableDataDBTest.php (revision 8fed17f342cc190557a6ce94d1787f9e2f63cb6c)
1*8fed17f3SAndreas Gohr<?php
2*8fed17f3SAndreas Gohr
3*8fed17f3SAndreas Gohrnamespace dokuwiki\plugin\struct\test;
4*8fed17f3SAndreas Gohr
5*8fed17f3SAndreas Gohruse dokuwiki\plugin\struct\meta;
6*8fed17f3SAndreas Gohruse dokuwiki\plugin\struct\meta\Search;
7*8fed17f3SAndreas Gohr
8*8fed17f3SAndreas Gohr/**
9*8fed17f3SAndreas Gohr * Tests to the DB for the struct plugin
10*8fed17f3SAndreas Gohr *
11*8fed17f3SAndreas Gohr * @group plugin_struct
12*8fed17f3SAndreas Gohr * @group plugins
13*8fed17f3SAndreas Gohr *
14*8fed17f3SAndreas Gohr */
15*8fed17f3SAndreas Gohrclass AccessTableDataDBTest extends StructTest
16*8fed17f3SAndreas Gohr{
17*8fed17f3SAndreas Gohr
18*8fed17f3SAndreas Gohr    /** @var \helper_plugin_sqlite $sqlite */
19*8fed17f3SAndreas Gohr    protected $sqlite;
20*8fed17f3SAndreas Gohr
21*8fed17f3SAndreas Gohr    public function setUp(): void
22*8fed17f3SAndreas Gohr    {
23*8fed17f3SAndreas Gohr        parent::setUp();
24*8fed17f3SAndreas Gohr
25*8fed17f3SAndreas Gohr        /** @var \helper_plugin_struct_db $sqlite */
26*8fed17f3SAndreas Gohr        $sqlite = plugin_load('helper', 'struct_db');
27*8fed17f3SAndreas Gohr        $this->sqlite = $sqlite->getDB();
28*8fed17f3SAndreas Gohr
29*8fed17f3SAndreas Gohr        $this->loadSchemaJSON('testtable', '', 100);
30*8fed17f3SAndreas Gohr
31*8fed17f3SAndreas Gohr        // revision 1
32*8fed17f3SAndreas Gohr        $this->saveData(
33*8fed17f3SAndreas Gohr            'testpage',
34*8fed17f3SAndreas Gohr            'testtable',
35*8fed17f3SAndreas Gohr            [
36*8fed17f3SAndreas Gohr                'testcolumn' => 'value1',
37*8fed17f3SAndreas Gohr                'testMulitColumn' => ['value2.1', 'value2.2']
38*8fed17f3SAndreas Gohr            ],
39*8fed17f3SAndreas Gohr            123
40*8fed17f3SAndreas Gohr        );
41*8fed17f3SAndreas Gohr
42*8fed17f3SAndreas Gohr        // revision 2
43*8fed17f3SAndreas Gohr        $this->saveData(
44*8fed17f3SAndreas Gohr            'testpage',
45*8fed17f3SAndreas Gohr            'testtable',
46*8fed17f3SAndreas Gohr            [
47*8fed17f3SAndreas Gohr                'testcolumn' => 'value1a',
48*8fed17f3SAndreas Gohr                'testMulitColumn' => ['value2.1a', 'value2.2a']
49*8fed17f3SAndreas Gohr            ],
50*8fed17f3SAndreas Gohr            789
51*8fed17f3SAndreas Gohr        );
52*8fed17f3SAndreas Gohr
53*8fed17f3SAndreas Gohr        // revision 1 of different page
54*8fed17f3SAndreas Gohr        $this->saveData(
55*8fed17f3SAndreas Gohr            'testpage2',
56*8fed17f3SAndreas Gohr            'testtable',
57*8fed17f3SAndreas Gohr            [
58*8fed17f3SAndreas Gohr                'testcolumn' => 'value1a',
59*8fed17f3SAndreas Gohr                'testMulitColumn' => ['value2.1a']
60*8fed17f3SAndreas Gohr            ],
61*8fed17f3SAndreas Gohr            789
62*8fed17f3SAndreas Gohr        );
63*8fed17f3SAndreas Gohr    }
64*8fed17f3SAndreas Gohr
65*8fed17f3SAndreas Gohr    public function test_getDataFromDB_currentRev()
66*8fed17f3SAndreas Gohr    {
67*8fed17f3SAndreas Gohr
68*8fed17f3SAndreas Gohr        // act
69*8fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage');
70*8fed17f3SAndreas Gohr        $actual_data = $schemaData->getDataFromDb();
71*8fed17f3SAndreas Gohr
72*8fed17f3SAndreas Gohr        $expected_data = [
73*8fed17f3SAndreas Gohr            [
74*8fed17f3SAndreas Gohr                'out1' => 'value1a',
75*8fed17f3SAndreas Gohr                'out2' => 'value2.1a' . Search::CONCAT_SEPARATOR . 'value2.2a',
76*8fed17f3SAndreas Gohr                'PID' => 'testpage',
77*8fed17f3SAndreas Gohr            ],
78*8fed17f3SAndreas Gohr        ];
79*8fed17f3SAndreas Gohr
80*8fed17f3SAndreas Gohr        $this->assertEquals($expected_data, $actual_data);
81*8fed17f3SAndreas Gohr    }
82*8fed17f3SAndreas Gohr
83*8fed17f3SAndreas Gohr    public function test_getDataFromDB_oldRev()
84*8fed17f3SAndreas Gohr    {
85*8fed17f3SAndreas Gohr
86*8fed17f3SAndreas Gohr        // act
87*8fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage', 200);
88*8fed17f3SAndreas Gohr        $actual_data = $schemaData->getDataFromDB();
89*8fed17f3SAndreas Gohr
90*8fed17f3SAndreas Gohr        $expected_data = [
91*8fed17f3SAndreas Gohr            [
92*8fed17f3SAndreas Gohr                'out1' => 'value1',
93*8fed17f3SAndreas Gohr                'out2' => 'value2.1' . Search::CONCAT_SEPARATOR . 'value2.2',
94*8fed17f3SAndreas Gohr                'PID' => 'testpage',
95*8fed17f3SAndreas Gohr            ],
96*8fed17f3SAndreas Gohr        ];
97*8fed17f3SAndreas Gohr
98*8fed17f3SAndreas Gohr        $this->assertEquals($expected_data, $actual_data);
99*8fed17f3SAndreas Gohr    }
100*8fed17f3SAndreas Gohr
101*8fed17f3SAndreas Gohr    public function test_getData_currentRev()
102*8fed17f3SAndreas Gohr    {
103*8fed17f3SAndreas Gohr
104*8fed17f3SAndreas Gohr        // act
105*8fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage');
106*8fed17f3SAndreas Gohr        $actual_data = $schemaData->getData();
107*8fed17f3SAndreas Gohr
108*8fed17f3SAndreas Gohr        $expected_data = [
109*8fed17f3SAndreas Gohr            'testMulitColumn' => ['value2.1a', 'value2.2a'],
110*8fed17f3SAndreas Gohr            'testcolumn' => 'value1a',
111*8fed17f3SAndreas Gohr        ];
112*8fed17f3SAndreas Gohr
113*8fed17f3SAndreas Gohr        // assert
114*8fed17f3SAndreas Gohr        foreach ($expected_data as $key => $value) {
115*8fed17f3SAndreas Gohr            $this->assertEquals($value, $actual_data[$key]->getValue());
116*8fed17f3SAndreas Gohr        }
117*8fed17f3SAndreas Gohr    }
118*8fed17f3SAndreas Gohr
119*8fed17f3SAndreas Gohr    public function test_getDataArray_currentRev()
120*8fed17f3SAndreas Gohr    {
121*8fed17f3SAndreas Gohr
122*8fed17f3SAndreas Gohr        // act
123*8fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage');
124*8fed17f3SAndreas Gohr        $actual_data = $schemaData->getDataArray();
125*8fed17f3SAndreas Gohr
126*8fed17f3SAndreas Gohr        $expected_data = [
127*8fed17f3SAndreas Gohr            'testMulitColumn' => ['value2.1a', 'value2.2a'],
128*8fed17f3SAndreas Gohr            'testcolumn' => 'value1a'
129*8fed17f3SAndreas Gohr        ];
130*8fed17f3SAndreas Gohr
131*8fed17f3SAndreas Gohr        // assert
132*8fed17f3SAndreas Gohr        $this->assertEquals($expected_data, $actual_data);
133*8fed17f3SAndreas Gohr    }
134*8fed17f3SAndreas Gohr
135*8fed17f3SAndreas Gohr    public function test_getData_currentRev2()
136*8fed17f3SAndreas Gohr    {
137*8fed17f3SAndreas Gohr
138*8fed17f3SAndreas Gohr        // act
139*8fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage2');
140*8fed17f3SAndreas Gohr        $actual_data = $schemaData->getData();
141*8fed17f3SAndreas Gohr
142*8fed17f3SAndreas Gohr        $expected_data = [
143*8fed17f3SAndreas Gohr            'testMulitColumn' => ['value2.1a'],
144*8fed17f3SAndreas Gohr            'testcolumn' => 'value1a',
145*8fed17f3SAndreas Gohr        ];
146*8fed17f3SAndreas Gohr
147*8fed17f3SAndreas Gohr        // assert
148*8fed17f3SAndreas Gohr        foreach ($expected_data as $index => $value) {
149*8fed17f3SAndreas Gohr            $this->assertEquals($value, $actual_data[$index]->getValue());
150*8fed17f3SAndreas Gohr        }
151*8fed17f3SAndreas Gohr    }
152*8fed17f3SAndreas Gohr
153*8fed17f3SAndreas Gohr    public function test_getData_oldRev()
154*8fed17f3SAndreas Gohr    {
155*8fed17f3SAndreas Gohr
156*8fed17f3SAndreas Gohr        // act
157*8fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage', 200);
158*8fed17f3SAndreas Gohr        $actual_data = $schemaData->getData();
159*8fed17f3SAndreas Gohr
160*8fed17f3SAndreas Gohr        $expected_data = [
161*8fed17f3SAndreas Gohr            'testMulitColumn' => ['value2.1', 'value2.2'],
162*8fed17f3SAndreas Gohr            'testcolumn' => 'value1',
163*8fed17f3SAndreas Gohr        ];
164*8fed17f3SAndreas Gohr
165*8fed17f3SAndreas Gohr        // assert
166*8fed17f3SAndreas Gohr        foreach ($expected_data as $index => $value) {
167*8fed17f3SAndreas Gohr            $this->assertEquals($value, $actual_data[$index]->getValue());
168*8fed17f3SAndreas Gohr        }
169*8fed17f3SAndreas Gohr    }
170*8fed17f3SAndreas Gohr
171*8fed17f3SAndreas Gohr
172*8fed17f3SAndreas Gohr    /**
173*8fed17f3SAndreas Gohr     * @noinspection SqlNoDataSourceInspection
174*8fed17f3SAndreas Gohr     * @noinspection SqlDialectInspection
175*8fed17f3SAndreas Gohr     */
176*8fed17f3SAndreas Gohr    public function test_saveData()
177*8fed17f3SAndreas Gohr    {
178*8fed17f3SAndreas Gohr        // arrange
179*8fed17f3SAndreas Gohr        $testdata = [
180*8fed17f3SAndreas Gohr            'testcolumn' => 'value1_saved',
181*8fed17f3SAndreas Gohr            'testMulitColumn' => [
182*8fed17f3SAndreas Gohr                "value2.1_saved",
183*8fed17f3SAndreas Gohr                "value2.2_saved",
184*8fed17f3SAndreas Gohr                "value2.3_saved",
185*8fed17f3SAndreas Gohr            ]
186*8fed17f3SAndreas Gohr        ];
187*8fed17f3SAndreas Gohr
188*8fed17f3SAndreas Gohr        // act
189*8fed17f3SAndreas Gohr        $schemaData = meta\AccessTable::getPageAccess('testtable', 'testpage');
190*8fed17f3SAndreas Gohr        $result = $schemaData->saveData($testdata);
191*8fed17f3SAndreas Gohr
192*8fed17f3SAndreas Gohr        // assert
193*8fed17f3SAndreas Gohr        $res = $this->sqlite->query(
194*8fed17f3SAndreas Gohr            "SELECT pid, col1, col2 FROM data_testtable WHERE pid = ? ORDER BY rev DESC LIMIT 1",
195*8fed17f3SAndreas Gohr            ['testpage']
196*8fed17f3SAndreas Gohr        );
197*8fed17f3SAndreas Gohr        $actual_saved_single = $this->sqlite->res2row($res);
198*8fed17f3SAndreas Gohr        $expected_saved_single = [
199*8fed17f3SAndreas Gohr            'pid' => 'testpage',
200*8fed17f3SAndreas Gohr            'col1' => 'value1_saved',
201*8fed17f3SAndreas Gohr            'col2' => 'value2.1_saved' # copy of the multi-value's first value
202*8fed17f3SAndreas Gohr        ];
203*8fed17f3SAndreas Gohr
204*8fed17f3SAndreas Gohr        $res = $this->sqlite->query(
205*8fed17f3SAndreas Gohr            "SELECT colref, row, value FROM multi_testtable WHERE pid = ? ORDER BY rev DESC LIMIT 3",
206*8fed17f3SAndreas Gohr            ['testpage']
207*8fed17f3SAndreas Gohr        );
208*8fed17f3SAndreas Gohr        $actual_saved_multi = $this->sqlite->res2arr($res);
209*8fed17f3SAndreas Gohr        $expected_saved_multi = [
210*8fed17f3SAndreas Gohr            [
211*8fed17f3SAndreas Gohr                'colref' => '2',
212*8fed17f3SAndreas Gohr                'row' => '1',
213*8fed17f3SAndreas Gohr                'value' => "value2.1_saved"
214*8fed17f3SAndreas Gohr            ],
215*8fed17f3SAndreas Gohr            [
216*8fed17f3SAndreas Gohr                'colref' => '2',
217*8fed17f3SAndreas Gohr                'row' => '2',
218*8fed17f3SAndreas Gohr                'value' => "value2.2_saved"
219*8fed17f3SAndreas Gohr            ],
220*8fed17f3SAndreas Gohr            [
221*8fed17f3SAndreas Gohr                'colref' => '2',
222*8fed17f3SAndreas Gohr                'row' => '3',
223*8fed17f3SAndreas Gohr                'value' => "value2.3_saved"
224*8fed17f3SAndreas Gohr            ]
225*8fed17f3SAndreas Gohr        ];
226*8fed17f3SAndreas Gohr
227*8fed17f3SAndreas Gohr        $this->assertTrue($result, 'should be true on success');
228*8fed17f3SAndreas Gohr        $this->assertEquals($expected_saved_single, $actual_saved_single, 'single value fields');
229*8fed17f3SAndreas Gohr        $this->assertEquals($expected_saved_multi, $actual_saved_multi, 'multi value fields');
230*8fed17f3SAndreas Gohr    }
231*8fed17f3SAndreas Gohr
232*8fed17f3SAndreas Gohr    public function test_getDataFromDB_clearData()
233*8fed17f3SAndreas Gohr    {
234*8fed17f3SAndreas Gohr
235*8fed17f3SAndreas Gohr        // act
236*8fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage');
237*8fed17f3SAndreas Gohr        $schemaData->clearData();
238*8fed17f3SAndreas Gohr        $actual_data = $schemaData->getDataFromDB();
239*8fed17f3SAndreas Gohr
240*8fed17f3SAndreas Gohr        $expected_data = [
241*8fed17f3SAndreas Gohr            [
242*8fed17f3SAndreas Gohr                'out1' => '',
243*8fed17f3SAndreas Gohr                'out2' => null,
244*8fed17f3SAndreas Gohr                'PID' => 'testpage',
245*8fed17f3SAndreas Gohr            ]
246*8fed17f3SAndreas Gohr        ];
247*8fed17f3SAndreas Gohr
248*8fed17f3SAndreas Gohr        $this->assertEquals($expected_data, $actual_data, '');
249*8fed17f3SAndreas Gohr    }
250*8fed17f3SAndreas Gohr
251*8fed17f3SAndreas Gohr    public function test_getData_clearData()
252*8fed17f3SAndreas Gohr    {
253*8fed17f3SAndreas Gohr
254*8fed17f3SAndreas Gohr        // act
255*8fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage');
256*8fed17f3SAndreas Gohr        $schemaData->clearData();
257*8fed17f3SAndreas Gohr        $actual_data = $schemaData->getData();
258*8fed17f3SAndreas Gohr
259*8fed17f3SAndreas Gohr        // assert
260*8fed17f3SAndreas Gohr        $this->assertEquals([], $actual_data['testMulitColumn']->getValue());
261*8fed17f3SAndreas Gohr        $this->assertEquals(null, $actual_data['testcolumn']->getValue());
262*8fed17f3SAndreas Gohr    }
263*8fed17f3SAndreas Gohr
264*8fed17f3SAndreas Gohr    public function test_getData_skipEmpty()
265*8fed17f3SAndreas Gohr    {
266*8fed17f3SAndreas Gohr        // arrange
267*8fed17f3SAndreas Gohr        $testdata = [
268*8fed17f3SAndreas Gohr            'testcolumn' => '',
269*8fed17f3SAndreas Gohr            'testMulitColumn' => [
270*8fed17f3SAndreas Gohr                "value2.1_saved",
271*8fed17f3SAndreas Gohr                "value2.2_saved",
272*8fed17f3SAndreas Gohr            ]
273*8fed17f3SAndreas Gohr        ];
274*8fed17f3SAndreas Gohr        $schemaData = meta\AccessTable::getPageAccess('testtable', 'testpage');
275*8fed17f3SAndreas Gohr        $schemaData->saveData($testdata);
276*8fed17f3SAndreas Gohr
277*8fed17f3SAndreas Gohr        // act
278*8fed17f3SAndreas Gohr        $schemaData->optionSkipEmpty(true);
279*8fed17f3SAndreas Gohr        $actual_data = $schemaData->getData();
280*8fed17f3SAndreas Gohr
281*8fed17f3SAndreas Gohr        $expected_data = ['value2.1_saved', 'value2.2_saved'];
282*8fed17f3SAndreas Gohr
283*8fed17f3SAndreas Gohr        // assert
284*8fed17f3SAndreas Gohr        $this->assertEquals(1, count($actual_data), 'There should be only one value returned and the empty value skipped');
285*8fed17f3SAndreas Gohr        $this->assertEquals($expected_data, $actual_data['testMulitColumn']->getValue());
286*8fed17f3SAndreas Gohr    }
287*8fed17f3SAndreas Gohr
288*8fed17f3SAndreas Gohr    public function test_getDataArray_skipEmpty()
289*8fed17f3SAndreas Gohr    {
290*8fed17f3SAndreas Gohr        // arrange
291*8fed17f3SAndreas Gohr        $testdata = [
292*8fed17f3SAndreas Gohr            'testcolumn' => '',
293*8fed17f3SAndreas Gohr            'testMulitColumn' => [
294*8fed17f3SAndreas Gohr                "value2.1_saved",
295*8fed17f3SAndreas Gohr                "value2.2_saved",
296*8fed17f3SAndreas Gohr            ]
297*8fed17f3SAndreas Gohr        ];
298*8fed17f3SAndreas Gohr        $schemaData = meta\AccessTable::getPageAccess('testtable', 'testpage');
299*8fed17f3SAndreas Gohr        $schemaData->saveData($testdata);
300*8fed17f3SAndreas Gohr
301*8fed17f3SAndreas Gohr        // act
302*8fed17f3SAndreas Gohr        $schemaData->optionSkipEmpty(true);
303*8fed17f3SAndreas Gohr        $actual_data = $schemaData->getDataArray();
304*8fed17f3SAndreas Gohr
305*8fed17f3SAndreas Gohr        $expected_data = [
306*8fed17f3SAndreas Gohr            'testMulitColumn' => ['value2.1_saved', 'value2.2_saved']
307*8fed17f3SAndreas Gohr        ];
308*8fed17f3SAndreas Gohr
309*8fed17f3SAndreas Gohr        // assert
310*8fed17f3SAndreas Gohr        $this->assertEquals(1, count($actual_data), 'There should be only one value returned and the empty value skipped');
311*8fed17f3SAndreas Gohr        $this->assertEquals($expected_data, $actual_data);
312*8fed17f3SAndreas Gohr    }
313*8fed17f3SAndreas Gohr
314*8fed17f3SAndreas Gohr    public function test_pseudodiff()
315*8fed17f3SAndreas Gohr    {
316*8fed17f3SAndreas Gohr        $this->loadSchemaJSON('pageschema');
317*8fed17f3SAndreas Gohr        $this->saveData(
318*8fed17f3SAndreas Gohr            'syntax',
319*8fed17f3SAndreas Gohr            'pageschema',
320*8fed17f3SAndreas Gohr            [
321*8fed17f3SAndreas Gohr                'singlepage' => 'wiki:dokuwiki',
322*8fed17f3SAndreas Gohr                'multipage' => ['wiki:dokuwiki', 'wiki:syntax', 'wiki:welcome'],
323*8fed17f3SAndreas Gohr                'singletitle' => 'wiki:dokuwiki',
324*8fed17f3SAndreas Gohr                'multititle' => ['wiki:dokuwiki', 'wiki:syntax', 'wiki:welcome'],
325*8fed17f3SAndreas Gohr            ],
326*8fed17f3SAndreas Gohr            time()
327*8fed17f3SAndreas Gohr        );
328*8fed17f3SAndreas Gohr
329*8fed17f3SAndreas Gohr        // make sure titles for some pages are known (not for wiki:welcome)
330*8fed17f3SAndreas Gohr        $pageMeta = new \dokuwiki\plugin\struct\meta\PageMeta('wiki:dokuwiki');
331*8fed17f3SAndreas Gohr        $pageMeta->setTitle('DokuWiki Overview');
332*8fed17f3SAndreas Gohr        $pageMeta = new \dokuwiki\plugin\struct\meta\PageMeta('wiki:syntax');
333*8fed17f3SAndreas Gohr        $pageMeta->setTitle('DokuWiki Foobar Syntax');
334*8fed17f3SAndreas Gohr        $pageMeta->savePageData();
335*8fed17f3SAndreas Gohr
336*8fed17f3SAndreas Gohr        $schemaData = meta\AccessTable::getPageAccess('pageschema', 'syntax');
337*8fed17f3SAndreas Gohr        $actual_pseudodiff = $schemaData->getDataPseudoSyntax();
338*8fed17f3SAndreas Gohr        $expected_pseudodiff = "pageschema.singlepage : wiki:dokuwiki
339*8fed17f3SAndreas Gohrpageschema.multipage : wiki:dokuwiki, wiki:syntax, wiki:welcome
340*8fed17f3SAndreas Gohrpageschema.singletitle : DokuWiki Overview
341*8fed17f3SAndreas Gohrpageschema.multititle : DokuWiki Overview, DokuWiki Foobar Syntax, wiki:welcome\n";
342*8fed17f3SAndreas Gohr
343*8fed17f3SAndreas Gohr        $this->assertEquals($expected_pseudodiff, $actual_pseudodiff);
344*8fed17f3SAndreas Gohr    }
345*8fed17f3SAndreas Gohr}
346