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