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