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