xref: /plugin/struct/_test/AccessTableDataDBTest.php (revision 79b29326ae29dcbf2571b932f1b531c400b9460b)
18fed17f3SAndreas Gohr<?php
28fed17f3SAndreas Gohr
38fed17f3SAndreas Gohrnamespace dokuwiki\plugin\struct\test;
48fed17f3SAndreas Gohr
58fed17f3SAndreas Gohruse dokuwiki\plugin\struct\meta;
68fed17f3SAndreas Gohruse dokuwiki\plugin\struct\meta\Search;
78fed17f3SAndreas Gohr
88fed17f3SAndreas Gohr/**
98fed17f3SAndreas Gohr * Tests to the DB for the struct plugin
108fed17f3SAndreas Gohr *
118fed17f3SAndreas Gohr * @group plugin_struct
128fed17f3SAndreas Gohr * @group plugins
138fed17f3SAndreas Gohr *
148fed17f3SAndreas Gohr */
158fed17f3SAndreas Gohrclass AccessTableDataDBTest extends StructTest
168fed17f3SAndreas Gohr{
178fed17f3SAndreas Gohr
188fed17f3SAndreas Gohr    /** @var \helper_plugin_sqlite $sqlite */
198fed17f3SAndreas Gohr    protected $sqlite;
208fed17f3SAndreas Gohr
218fed17f3SAndreas Gohr    public function setUp(): void
228fed17f3SAndreas Gohr    {
238fed17f3SAndreas Gohr        parent::setUp();
248fed17f3SAndreas Gohr
258fed17f3SAndreas Gohr        /** @var \helper_plugin_struct_db $sqlite */
268fed17f3SAndreas Gohr        $sqlite = plugin_load('helper', 'struct_db');
278fed17f3SAndreas Gohr        $this->sqlite = $sqlite->getDB();
288fed17f3SAndreas Gohr
298fed17f3SAndreas Gohr        $this->loadSchemaJSON('testtable', '', 100);
308fed17f3SAndreas Gohr
318fed17f3SAndreas Gohr        // revision 1
328fed17f3SAndreas Gohr        $this->saveData(
338fed17f3SAndreas Gohr            'testpage',
348fed17f3SAndreas Gohr            'testtable',
358fed17f3SAndreas Gohr            [
368fed17f3SAndreas Gohr                'testcolumn' => 'value1',
378fed17f3SAndreas Gohr                'testMulitColumn' => ['value2.1', 'value2.2']
388fed17f3SAndreas Gohr            ],
398fed17f3SAndreas Gohr            123
408fed17f3SAndreas Gohr        );
418fed17f3SAndreas Gohr
428fed17f3SAndreas Gohr        // revision 2
438fed17f3SAndreas Gohr        $this->saveData(
448fed17f3SAndreas Gohr            'testpage',
458fed17f3SAndreas Gohr            'testtable',
468fed17f3SAndreas Gohr            [
478fed17f3SAndreas Gohr                'testcolumn' => 'value1a',
488fed17f3SAndreas Gohr                'testMulitColumn' => ['value2.1a', 'value2.2a']
498fed17f3SAndreas Gohr            ],
508fed17f3SAndreas Gohr            789
518fed17f3SAndreas Gohr        );
528fed17f3SAndreas Gohr
538fed17f3SAndreas Gohr        // revision 1 of different page
548fed17f3SAndreas Gohr        $this->saveData(
558fed17f3SAndreas Gohr            'testpage2',
568fed17f3SAndreas Gohr            'testtable',
578fed17f3SAndreas Gohr            [
588fed17f3SAndreas Gohr                'testcolumn' => 'value1a',
598fed17f3SAndreas Gohr                'testMulitColumn' => ['value2.1a']
608fed17f3SAndreas Gohr            ],
618fed17f3SAndreas Gohr            789
628fed17f3SAndreas Gohr        );
638fed17f3SAndreas Gohr    }
648fed17f3SAndreas Gohr
658fed17f3SAndreas Gohr    public function test_getDataFromDB_currentRev()
668fed17f3SAndreas Gohr    {
678fed17f3SAndreas Gohr
688fed17f3SAndreas Gohr        // act
698fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage');
708fed17f3SAndreas Gohr        $actual_data = $schemaData->getDataFromDb();
718fed17f3SAndreas Gohr
728fed17f3SAndreas Gohr        $expected_data = [
738fed17f3SAndreas Gohr            [
748fed17f3SAndreas Gohr                'out1' => 'value1a',
758fed17f3SAndreas Gohr                'out2' => 'value2.1a' . Search::CONCAT_SEPARATOR . 'value2.2a',
768fed17f3SAndreas Gohr                'PID' => 'testpage',
778fed17f3SAndreas Gohr            ],
788fed17f3SAndreas Gohr        ];
798fed17f3SAndreas Gohr
808fed17f3SAndreas Gohr        $this->assertEquals($expected_data, $actual_data);
818fed17f3SAndreas Gohr    }
828fed17f3SAndreas Gohr
838fed17f3SAndreas Gohr    public function test_getDataFromDB_oldRev()
848fed17f3SAndreas Gohr    {
858fed17f3SAndreas Gohr
868fed17f3SAndreas Gohr        // act
878fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage', 200);
888fed17f3SAndreas Gohr        $actual_data = $schemaData->getDataFromDB();
898fed17f3SAndreas Gohr
908fed17f3SAndreas Gohr        $expected_data = [
918fed17f3SAndreas Gohr            [
928fed17f3SAndreas Gohr                'out1' => 'value1',
938fed17f3SAndreas Gohr                'out2' => 'value2.1' . Search::CONCAT_SEPARATOR . 'value2.2',
948fed17f3SAndreas Gohr                'PID' => 'testpage',
958fed17f3SAndreas Gohr            ],
968fed17f3SAndreas Gohr        ];
978fed17f3SAndreas Gohr
988fed17f3SAndreas Gohr        $this->assertEquals($expected_data, $actual_data);
998fed17f3SAndreas Gohr    }
1008fed17f3SAndreas Gohr
1018fed17f3SAndreas Gohr    public function test_getData_currentRev()
1028fed17f3SAndreas Gohr    {
1038fed17f3SAndreas Gohr
1048fed17f3SAndreas Gohr        // act
1058fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage');
1068fed17f3SAndreas Gohr        $actual_data = $schemaData->getData();
1078fed17f3SAndreas Gohr
1088fed17f3SAndreas Gohr        $expected_data = [
1098fed17f3SAndreas Gohr            'testMulitColumn' => ['value2.1a', 'value2.2a'],
1108fed17f3SAndreas Gohr            'testcolumn' => 'value1a',
1118fed17f3SAndreas Gohr        ];
1128fed17f3SAndreas Gohr
1138fed17f3SAndreas Gohr        // assert
1148fed17f3SAndreas Gohr        foreach ($expected_data as $key => $value) {
1158fed17f3SAndreas Gohr            $this->assertEquals($value, $actual_data[$key]->getValue());
1168fed17f3SAndreas Gohr        }
1178fed17f3SAndreas Gohr    }
1188fed17f3SAndreas Gohr
1198fed17f3SAndreas Gohr    public function test_getDataArray_currentRev()
1208fed17f3SAndreas Gohr    {
1218fed17f3SAndreas Gohr
1228fed17f3SAndreas Gohr        // act
1238fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage');
1248fed17f3SAndreas Gohr        $actual_data = $schemaData->getDataArray();
1258fed17f3SAndreas Gohr
1268fed17f3SAndreas Gohr        $expected_data = [
1278fed17f3SAndreas Gohr            'testMulitColumn' => ['value2.1a', 'value2.2a'],
1288fed17f3SAndreas Gohr            'testcolumn' => 'value1a'
1298fed17f3SAndreas Gohr        ];
1308fed17f3SAndreas Gohr
1318fed17f3SAndreas Gohr        // assert
1328fed17f3SAndreas Gohr        $this->assertEquals($expected_data, $actual_data);
1338fed17f3SAndreas Gohr    }
1348fed17f3SAndreas Gohr
1358fed17f3SAndreas Gohr    public function test_getData_currentRev2()
1368fed17f3SAndreas Gohr    {
1378fed17f3SAndreas Gohr
1388fed17f3SAndreas Gohr        // act
1398fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage2');
1408fed17f3SAndreas Gohr        $actual_data = $schemaData->getData();
1418fed17f3SAndreas Gohr
1428fed17f3SAndreas Gohr        $expected_data = [
1438fed17f3SAndreas Gohr            'testMulitColumn' => ['value2.1a'],
1448fed17f3SAndreas Gohr            'testcolumn' => 'value1a',
1458fed17f3SAndreas Gohr        ];
1468fed17f3SAndreas Gohr
1478fed17f3SAndreas Gohr        // assert
1488fed17f3SAndreas Gohr        foreach ($expected_data as $index => $value) {
1498fed17f3SAndreas Gohr            $this->assertEquals($value, $actual_data[$index]->getValue());
1508fed17f3SAndreas Gohr        }
1518fed17f3SAndreas Gohr    }
1528fed17f3SAndreas Gohr
1538fed17f3SAndreas Gohr    public function test_getData_oldRev()
1548fed17f3SAndreas Gohr    {
1558fed17f3SAndreas Gohr
1568fed17f3SAndreas Gohr        // act
1578fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage', 200);
1588fed17f3SAndreas Gohr        $actual_data = $schemaData->getData();
1598fed17f3SAndreas Gohr
1608fed17f3SAndreas Gohr        $expected_data = [
1618fed17f3SAndreas Gohr            'testMulitColumn' => ['value2.1', 'value2.2'],
1628fed17f3SAndreas Gohr            'testcolumn' => 'value1',
1638fed17f3SAndreas Gohr        ];
1648fed17f3SAndreas Gohr
1658fed17f3SAndreas Gohr        // assert
1668fed17f3SAndreas Gohr        foreach ($expected_data as $index => $value) {
1678fed17f3SAndreas Gohr            $this->assertEquals($value, $actual_data[$index]->getValue());
1688fed17f3SAndreas Gohr        }
1698fed17f3SAndreas Gohr    }
1708fed17f3SAndreas Gohr
1718fed17f3SAndreas Gohr
1728fed17f3SAndreas Gohr    /**
1738fed17f3SAndreas Gohr     * @noinspection SqlNoDataSourceInspection
1748fed17f3SAndreas Gohr     * @noinspection SqlDialectInspection
1758fed17f3SAndreas Gohr     */
1768fed17f3SAndreas Gohr    public function test_saveData()
1778fed17f3SAndreas Gohr    {
1788fed17f3SAndreas Gohr        // arrange
1798fed17f3SAndreas Gohr        $testdata = [
1808fed17f3SAndreas Gohr            'testcolumn' => 'value1_saved',
1818fed17f3SAndreas Gohr            'testMulitColumn' => [
1828fed17f3SAndreas Gohr                "value2.1_saved",
1838fed17f3SAndreas Gohr                "value2.2_saved",
1848fed17f3SAndreas Gohr                "value2.3_saved",
1858fed17f3SAndreas Gohr            ]
1868fed17f3SAndreas Gohr        ];
1878fed17f3SAndreas Gohr
1888fed17f3SAndreas Gohr        // act
1898fed17f3SAndreas Gohr        $schemaData = meta\AccessTable::getPageAccess('testtable', 'testpage');
1908fed17f3SAndreas Gohr        $result = $schemaData->saveData($testdata);
1918fed17f3SAndreas Gohr
1928fed17f3SAndreas Gohr        // assert
193*79b29326SAnna Dabrowska        $actual_saved_single = $this->sqlite->queryRecord(
1948fed17f3SAndreas Gohr            "SELECT pid, col1, col2 FROM data_testtable WHERE pid = ? ORDER BY rev DESC LIMIT 1",
1958fed17f3SAndreas Gohr            ['testpage']
1968fed17f3SAndreas Gohr        );
1978fed17f3SAndreas Gohr        $expected_saved_single = [
1988fed17f3SAndreas Gohr            'pid' => 'testpage',
1998fed17f3SAndreas Gohr            'col1' => 'value1_saved',
2008fed17f3SAndreas Gohr            'col2' => 'value2.1_saved' # copy of the multi-value's first value
2018fed17f3SAndreas Gohr        ];
2028fed17f3SAndreas Gohr
203*79b29326SAnna Dabrowska        $actual_saved_multi = $this->sqlite->queryAll(
2048fed17f3SAndreas Gohr            "SELECT colref, row, value FROM multi_testtable WHERE pid = ? ORDER BY rev DESC LIMIT 3",
2058fed17f3SAndreas Gohr            ['testpage']
2068fed17f3SAndreas Gohr        );
2078fed17f3SAndreas Gohr        $expected_saved_multi = [
2088fed17f3SAndreas Gohr            [
2098fed17f3SAndreas Gohr                'colref' => '2',
2108fed17f3SAndreas Gohr                'row' => '1',
2118fed17f3SAndreas Gohr                'value' => "value2.1_saved"
2128fed17f3SAndreas Gohr            ],
2138fed17f3SAndreas Gohr            [
2148fed17f3SAndreas Gohr                'colref' => '2',
2158fed17f3SAndreas Gohr                'row' => '2',
2168fed17f3SAndreas Gohr                'value' => "value2.2_saved"
2178fed17f3SAndreas Gohr            ],
2188fed17f3SAndreas Gohr            [
2198fed17f3SAndreas Gohr                'colref' => '2',
2208fed17f3SAndreas Gohr                'row' => '3',
2218fed17f3SAndreas Gohr                'value' => "value2.3_saved"
2228fed17f3SAndreas Gohr            ]
2238fed17f3SAndreas Gohr        ];
2248fed17f3SAndreas Gohr
2258fed17f3SAndreas Gohr        $this->assertTrue($result, 'should be true on success');
2268fed17f3SAndreas Gohr        $this->assertEquals($expected_saved_single, $actual_saved_single, 'single value fields');
2278fed17f3SAndreas Gohr        $this->assertEquals($expected_saved_multi, $actual_saved_multi, 'multi value fields');
2288fed17f3SAndreas Gohr    }
2298fed17f3SAndreas Gohr
2308fed17f3SAndreas Gohr    public function test_getDataFromDB_clearData()
2318fed17f3SAndreas Gohr    {
2328fed17f3SAndreas Gohr
2338fed17f3SAndreas Gohr        // act
2348fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage');
2358fed17f3SAndreas Gohr        $schemaData->clearData();
2368fed17f3SAndreas Gohr        $actual_data = $schemaData->getDataFromDB();
2378fed17f3SAndreas Gohr
2388fed17f3SAndreas Gohr        $expected_data = [
2398fed17f3SAndreas Gohr            [
2408fed17f3SAndreas Gohr                'out1' => '',
2418fed17f3SAndreas Gohr                'out2' => null,
2428fed17f3SAndreas Gohr                'PID' => 'testpage',
2438fed17f3SAndreas Gohr            ]
2448fed17f3SAndreas Gohr        ];
2458fed17f3SAndreas Gohr
2468fed17f3SAndreas Gohr        $this->assertEquals($expected_data, $actual_data, '');
2478fed17f3SAndreas Gohr    }
2488fed17f3SAndreas Gohr
2498fed17f3SAndreas Gohr    public function test_getData_clearData()
2508fed17f3SAndreas Gohr    {
2518fed17f3SAndreas Gohr
2528fed17f3SAndreas Gohr        // act
2538fed17f3SAndreas Gohr        $schemaData = mock\AccessTable::getPageAccess('testtable', 'testpage');
2548fed17f3SAndreas Gohr        $schemaData->clearData();
2558fed17f3SAndreas Gohr        $actual_data = $schemaData->getData();
2568fed17f3SAndreas Gohr
2578fed17f3SAndreas Gohr        // assert
2588fed17f3SAndreas Gohr        $this->assertEquals([], $actual_data['testMulitColumn']->getValue());
2598fed17f3SAndreas Gohr        $this->assertEquals(null, $actual_data['testcolumn']->getValue());
2608fed17f3SAndreas Gohr    }
2618fed17f3SAndreas Gohr
2628fed17f3SAndreas Gohr    public function test_getData_skipEmpty()
2638fed17f3SAndreas Gohr    {
2648fed17f3SAndreas Gohr        // arrange
2658fed17f3SAndreas Gohr        $testdata = [
2668fed17f3SAndreas Gohr            'testcolumn' => '',
2678fed17f3SAndreas Gohr            'testMulitColumn' => [
2688fed17f3SAndreas Gohr                "value2.1_saved",
2698fed17f3SAndreas Gohr                "value2.2_saved",
2708fed17f3SAndreas Gohr            ]
2718fed17f3SAndreas Gohr        ];
2728fed17f3SAndreas Gohr        $schemaData = meta\AccessTable::getPageAccess('testtable', 'testpage');
2738fed17f3SAndreas Gohr        $schemaData->saveData($testdata);
2748fed17f3SAndreas Gohr
2758fed17f3SAndreas Gohr        // act
2768fed17f3SAndreas Gohr        $schemaData->optionSkipEmpty(true);
2778fed17f3SAndreas Gohr        $actual_data = $schemaData->getData();
2788fed17f3SAndreas Gohr
2798fed17f3SAndreas Gohr        $expected_data = ['value2.1_saved', 'value2.2_saved'];
2808fed17f3SAndreas Gohr
2818fed17f3SAndreas Gohr        // assert
2828fed17f3SAndreas Gohr        $this->assertEquals(1, count($actual_data), 'There should be only one value returned and the empty value skipped');
2838fed17f3SAndreas Gohr        $this->assertEquals($expected_data, $actual_data['testMulitColumn']->getValue());
2848fed17f3SAndreas Gohr    }
2858fed17f3SAndreas Gohr
2868fed17f3SAndreas Gohr    public function test_getDataArray_skipEmpty()
2878fed17f3SAndreas Gohr    {
2888fed17f3SAndreas Gohr        // arrange
2898fed17f3SAndreas Gohr        $testdata = [
2908fed17f3SAndreas Gohr            'testcolumn' => '',
2918fed17f3SAndreas Gohr            'testMulitColumn' => [
2928fed17f3SAndreas Gohr                "value2.1_saved",
2938fed17f3SAndreas Gohr                "value2.2_saved",
2948fed17f3SAndreas Gohr            ]
2958fed17f3SAndreas Gohr        ];
2968fed17f3SAndreas Gohr        $schemaData = meta\AccessTable::getPageAccess('testtable', 'testpage');
2978fed17f3SAndreas Gohr        $schemaData->saveData($testdata);
2988fed17f3SAndreas Gohr
2998fed17f3SAndreas Gohr        // act
3008fed17f3SAndreas Gohr        $schemaData->optionSkipEmpty(true);
3018fed17f3SAndreas Gohr        $actual_data = $schemaData->getDataArray();
3028fed17f3SAndreas Gohr
3038fed17f3SAndreas Gohr        $expected_data = [
3048fed17f3SAndreas Gohr            'testMulitColumn' => ['value2.1_saved', 'value2.2_saved']
3058fed17f3SAndreas Gohr        ];
3068fed17f3SAndreas Gohr
3078fed17f3SAndreas Gohr        // assert
3088fed17f3SAndreas Gohr        $this->assertEquals(1, count($actual_data), 'There should be only one value returned and the empty value skipped');
3098fed17f3SAndreas Gohr        $this->assertEquals($expected_data, $actual_data);
3108fed17f3SAndreas Gohr    }
3118fed17f3SAndreas Gohr
3128fed17f3SAndreas Gohr    public function test_pseudodiff()
3138fed17f3SAndreas Gohr    {
3148fed17f3SAndreas Gohr        $this->loadSchemaJSON('pageschema');
3158fed17f3SAndreas Gohr        $this->saveData(
3168fed17f3SAndreas Gohr            'syntax',
3178fed17f3SAndreas Gohr            'pageschema',
3188fed17f3SAndreas Gohr            [
3198fed17f3SAndreas Gohr                'singlepage' => 'wiki:dokuwiki',
3208fed17f3SAndreas Gohr                'multipage' => ['wiki:dokuwiki', 'wiki:syntax', 'wiki:welcome'],
3218fed17f3SAndreas Gohr                'singletitle' => 'wiki:dokuwiki',
3228fed17f3SAndreas Gohr                'multititle' => ['wiki:dokuwiki', 'wiki:syntax', 'wiki:welcome'],
3238fed17f3SAndreas Gohr            ],
3248fed17f3SAndreas Gohr            time()
3258fed17f3SAndreas Gohr        );
3268fed17f3SAndreas Gohr
3278fed17f3SAndreas Gohr        // make sure titles for some pages are known (not for wiki:welcome)
3288fed17f3SAndreas Gohr        $pageMeta = new \dokuwiki\plugin\struct\meta\PageMeta('wiki:dokuwiki');
3298fed17f3SAndreas Gohr        $pageMeta->setTitle('DokuWiki Overview');
3308fed17f3SAndreas Gohr        $pageMeta = new \dokuwiki\plugin\struct\meta\PageMeta('wiki:syntax');
3318fed17f3SAndreas Gohr        $pageMeta->setTitle('DokuWiki Foobar Syntax');
3328fed17f3SAndreas Gohr        $pageMeta->savePageData();
3338fed17f3SAndreas Gohr
3348fed17f3SAndreas Gohr        $schemaData = meta\AccessTable::getPageAccess('pageschema', 'syntax');
3358fed17f3SAndreas Gohr        $actual_pseudodiff = $schemaData->getDataPseudoSyntax();
3368fed17f3SAndreas Gohr        $expected_pseudodiff = "pageschema.singlepage : wiki:dokuwiki
3378fed17f3SAndreas Gohrpageschema.multipage : wiki:dokuwiki, wiki:syntax, wiki:welcome
3388fed17f3SAndreas Gohrpageschema.singletitle : DokuWiki Overview
3398fed17f3SAndreas Gohrpageschema.multititle : DokuWiki Overview, DokuWiki Foobar Syntax, wiki:welcome\n";
3408fed17f3SAndreas Gohr
3418fed17f3SAndreas Gohr        $this->assertEquals($expected_pseudodiff, $actual_pseudodiff);
3428fed17f3SAndreas Gohr    }
3438fed17f3SAndreas Gohr}
344