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