1<?php 2 3class common_saveWikiText_test extends DokuWikiTest { 4 5 /** 6 * Execute a whole bunch of saves on the same page and check the results 7 */ 8 function test_savesequence() { 9 global $REV; 10 11 $page = 'page'; 12 $file = wikiFN($page); 13 14 // create the page 15 $this->assertFileNotExists($file); 16 saveWikiText($page, 'teststring', 'first save', false); 17 $this->assertFileExists($file); 18 $lastmod = filemtime($file); 19 20 $pagelog = new PageChangeLog($page); 21 $revisions = $pagelog->getRevisions(-1, 200); 22 $this->assertEquals(1, count($revisions)); 23 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 24 $this->assertEquals('first save', $revinfo['sum']); 25 $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']); 26 $this->assertEquals(10, $revinfo['sizechange']); 27 28 $this->waitForTick(true); // wait for new revision ID 29 30 // save with same content should be ignored 31 saveWikiText($page, 'teststring', 'second save', false); 32 clearstatcache(false, $file); 33 $this->assertEquals($lastmod, filemtime($file)); 34 35 $pagelog = new PageChangeLog($page); 36 $revisions = $pagelog->getRevisions(-1, 200); 37 $this->assertEquals(1, count($revisions)); 38 39 // update the page with new text 40 saveWikiText($page, 'teststring2long', 'third save', false); 41 clearstatcache(false, $file); 42 $newmod = filemtime($file); 43 $this->assertNotEquals($lastmod, $newmod); 44 $lastmod = $newmod; 45 46 $pagelog = new PageChangeLog($page); 47 $revisions = $pagelog->getRevisions(-1, 200); 48 $this->assertEquals(2, count($revisions)); 49 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 50 $this->assertEquals('third save', $revinfo['sum']); 51 $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']); 52 $this->assertEquals(5, $revinfo['sizechange']); 53 54 $this->waitForTick(); // wait for new revision ID 55 56 // add a minor edit (unauthenticated) 57 saveWikiText($page, 'teststring3long', 'fourth save', true); 58 clearstatcache(false, $file); 59 $newmod = filemtime($file); 60 $this->assertNotEquals($lastmod, $newmod); 61 $lastmod = $newmod; 62 63 $pagelog = new PageChangeLog($page); 64 $revisions = $pagelog->getRevisions(-1, 200); 65 $this->assertEquals(3, count($revisions)); 66 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 67 $this->assertEquals('fourth save', $revinfo['sum']); 68 $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']); 69 $this->assertEquals(0, $revinfo['sizechange']); 70 71 $this->waitForTick(); // wait for new revision ID 72 73 // add a minor edit (authenticated) 74 $_SERVER['REMOTE_USER'] = 'user'; 75 saveWikiText($page, 'teststring4', 'fifth save', true); 76 clearstatcache(false, $file); 77 $newmod = filemtime($file); 78 $this->assertNotEquals($lastmod, $newmod); 79 $lastmod = $newmod; 80 81 $pagelog = new PageChangeLog($page); 82 $revisions = $pagelog->getRevisions(-1, 200); 83 $this->assertEquals(4, count($revisions)); 84 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 85 $this->assertEquals('fifth save', $revinfo['sum']); 86 $this->assertEquals(DOKU_CHANGE_TYPE_MINOR_EDIT, $revinfo['type']); 87 $this->assertEquals(-4, $revinfo['sizechange']); 88 89 $this->waitForTick(); // wait for new revision ID 90 91 // delete 92 saveWikiText($page, '', 'sixth save', false); 93 clearstatcache(false, $file); 94 $this->assertFileNotExists($file); 95 96 $pagelog = new PageChangeLog($page); 97 $revisions = $pagelog->getRevisions(-1, 200); 98 $this->assertEquals(5, count($revisions)); 99 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 100 $this->assertEquals('sixth save', $revinfo['sum']); 101 $this->assertEquals(DOKU_CHANGE_TYPE_DELETE, $revinfo['type']); 102 $this->assertEquals(-11, $revinfo['sizechange']); 103 104 $this->waitForTick(); // wait for new revision ID 105 106 // restore 107 $REV = $lastmod; 108 saveWikiText($page, 'teststring4', 'seventh save', true); 109 clearstatcache(false, $file); 110 $this->assertFileExists($file); 111 $newmod = filemtime($file); 112 $this->assertNotEquals($lastmod, $newmod); 113 $lastmod = $newmod; 114 115 $pagelog = new PageChangeLog($page); 116 $revisions = $pagelog->getRevisions(-1, 200); 117 $this->assertEquals(6, count($revisions)); 118 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 119 $this->assertEquals('seventh save', $revinfo['sum']); 120 $this->assertEquals(DOKU_CHANGE_TYPE_REVERT, $revinfo['type']); 121 $this->assertEquals($REV, $revinfo['extra']); 122 $this->assertEquals(11, $revinfo['sizechange']); 123 $REV = ''; 124 125 $this->waitForTick(); // wait for new revision ID 126 127 // create external edit 128 file_put_contents($file, 'teststring5'); 129 130 $this->waitForTick(); // wait for new revision ID 131 132 // save on top of external edit 133 saveWikiText($page, 'teststring6', 'eigth save', false); 134 clearstatcache(false, $file); 135 $newmod = filemtime($file); 136 $this->assertNotEquals($lastmod, $newmod); 137 $lastmod = $newmod; 138 139 $pagelog = new PageChangeLog($page); 140 $revisions = $pagelog->getRevisions(-1, 200); 141 $this->assertEquals(8, count($revisions)); // two more revisions now! 142 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 143 $this->assertEquals('eigth save', $revinfo['sum']); 144 $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']); 145 $this->assertEquals(0, $revinfo['sizechange']); 146 147 $revinfo = $pagelog->getRevisionInfo($revisions[1]); 148 $this->assertEquals('external edit', $revinfo['sum']); 149 $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']); 150 $this->assertEquals(0, $revinfo['sizechange']); 151 152 } 153 154 /** 155 * Execute a whole bunch of saves on the same page and check the results 156 */ 157 function test_savesequencedeleteexternalrevision() { 158 $page = 'page2'; 159 $file = wikiFN($page); 160 161 // create the page 162 $this->assertFileNotExists($file); 163 saveWikiText($page, 'teststring', 'first save', false); 164 $this->assertFileExists($file); 165 $lastmod = filemtime($file); 166 167 $pagelog = new PageChangeLog($page); 168 $revisions = $pagelog->getRevisions(-1, 200); 169 $this->assertEquals(1, count($revisions)); 170 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 171 $this->assertEquals('first save', $revinfo['sum']); 172 $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']); 173 $this->assertEquals(10, $revinfo['sizechange']); 174 175 $this->waitForTick(true); // wait for new revision ID 176 177 // delete 178 saveWikiText($page, '', 'second save', false); 179 clearstatcache(false, $file); 180 $this->assertFileNotExists($file); 181 182 $pagelog = new PageChangeLog($page); 183 $revisions = $pagelog->getRevisions(-1, 200); 184 $this->assertEquals(2, count($revisions)); 185 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 186 $this->assertEquals('second save', $revinfo['sum']); 187 $this->assertEquals(DOKU_CHANGE_TYPE_DELETE, $revinfo['type']); 188 $this->assertEquals(-10, $revinfo['sizechange']); 189 190 $this->waitForTick(); // wait for new revision ID 191 192 // create external edit 193 file_put_contents($file, 'teststring5'); 194 195 $this->waitForTick(); // wait for new revision ID 196 197 // save on top of external edit 198 saveWikiText($page, 'teststring6', 'third save', false); 199 clearstatcache(false, $file); 200 201 $pagelog = new PageChangeLog($page); 202 $revisions = $pagelog->getRevisions(-1, 200); 203 $this->assertEquals(4, count($revisions)); // two more revisions now! 204 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 205 $this->assertEquals('third save', $revinfo['sum']); 206 $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']); 207 $this->assertEquals(0, $revinfo['sizechange']); 208 209 $revinfo = $pagelog->getRevisionInfo($revisions[1]); 210 $this->assertEquals('external edit', $revinfo['sum']); 211 $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']); 212 $this->assertEquals(11, $revinfo['sizechange']); 213 214 } 215 216 /** 217 * Execute a whole bunch of saves on the same page and check the results 218 */ 219 function test_saveexternalasfirst() { 220 $page = 'page3'; 221 $file = wikiFN($page); 222 223 // create the page 224 $this->assertFileNotExists($file); 225 226 // create external edit 227 file_put_contents($file, 'teststring'); 228 229 $this->waitForTick(true); // wait for new revision ID 230 231 // save on top of external edit 232 saveWikiText($page, 'teststring6', 'first save', false); 233 clearstatcache(false, $file); 234 235 $pagelog = new PageChangeLog($page); 236 $revisions = $pagelog->getRevisions(-1, 200); 237 $this->assertEquals(2, count($revisions)); // two more revisions now! 238 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 239 $this->assertEquals('first save', $revinfo['sum']); 240 $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']); 241 $this->assertEquals(1, $revinfo['sizechange']); 242 243 $revinfo = $pagelog->getRevisionInfo($revisions[1]); 244 $this->assertEquals('external edit', $revinfo['sum']); 245 $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']); 246 $this->assertEquals(10, $revinfo['sizechange']); 247 248 } 249 250 /** 251 * Execute a whole bunch of saves on the same page and check the results 252 */ 253 function test_savesequenceexternaldeleteedit() { 254 $page = 'page4'; 255 $file = wikiFN($page); 256 257 // create the page 258 $this->assertFileNotExists($file); 259 saveWikiText($page, 'teststring', 'first save', false); 260 $this->assertFileExists($file); 261 $lastmod = filemtime($file); 262 263 $pagelog = new PageChangeLog($page); 264 $revisions = $pagelog->getRevisions(-1, 200); 265 $this->assertEquals(1, count($revisions)); 266 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 267 $this->assertEquals('first save', $revinfo['sum']); 268 $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']); 269 $this->assertEquals(10, $revinfo['sizechange']); 270 271 $this->waitForTick(true); // wait for new revision ID 272 273 274 // create external delete 275 unlink($file); 276 clearstatcache(false, $file); 277 278 $this->waitForTick(); // wait for new revision ID 279 280 // save on top of external delete. save is seen as creation 281 saveWikiText($page, 'teststring6', 'second save', false); 282 clearstatcache(false, $file); 283 284 $pagelog = new PageChangeLog($page); 285 $revisions = $pagelog->getRevisions(-1, 200); 286 $this->assertEquals(2, count($revisions)); // one more revisions now! 287 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 288 $this->assertEquals('second save', $revinfo['sum']); 289 $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']); 290 $this->assertEquals(11, $revinfo['sizechange']); 291 292 $revinfo = $pagelog->getRevisionInfo($revisions[1]); 293 $this->assertEquals('first save', $revinfo['sum']); 294 295 } 296 297 /** 298 * Execute a whole bunch of saves on the same page and check the results 299 */ 300 function test_savesequencerevert() { 301 global $REV; 302 303 $page = 'page5'; 304 $file = wikiFN($page); 305 306 // create the page 307 $this->assertFileNotExists($file); 308 saveWikiText($page, 'teststring', 'first save', false); 309 $this->assertFileExists($file); 310 $lastmod = filemtime($file); 311 312 $pagelog = new PageChangeLog($page); 313 $revisions = $pagelog->getRevisions(-1, 200); 314 $this->assertEquals(1, count($revisions)); 315 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 316 $this->assertEquals('first save', $revinfo['sum']); 317 $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']); 318 $this->assertEquals(10, $revinfo['sizechange']); 319 320 $this->waitForTick(true); // wait for new revision ID 321 322 // save with same content should be ignored 323 saveWikiText($page, 'teststring', 'second save', false); 324 clearstatcache(false, $file); 325 $this->assertEquals($lastmod, filemtime($file)); 326 327 $pagelog = new PageChangeLog($page); 328 $revisions = $pagelog->getRevisions(-1, 200); 329 $this->assertEquals(1, count($revisions)); 330 331 // update the page with new text 332 saveWikiText($page, 'teststring2long', 'third save', false); 333 clearstatcache(false, $file); 334 $newmod = filemtime($file); 335 $this->assertNotEquals($lastmod, $newmod); 336 $lastmod = $newmod; 337 $revertrev = $newmod; 338 339 $pagelog = new PageChangeLog($page); 340 $revisions = $pagelog->getRevisions(-1, 200); 341 $this->assertEquals(2, count($revisions)); 342 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 343 $this->assertEquals('third save', $revinfo['sum']); 344 $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']); 345 $this->assertEquals(5, $revinfo['sizechange']); 346 347 $this->waitForTick(); // wait for new revision ID 348 349 // add a minor edit (unauthenticated) 350 saveWikiText($page, 'teststring3long', 'fourth save', true); 351 clearstatcache(false, $file); 352 $newmod = filemtime($file); 353 $this->assertNotEquals($lastmod, $newmod); 354 $lastmod = $newmod; 355 356 $pagelog = new PageChangeLog($page); 357 $revisions = $pagelog->getRevisions(-1, 200); 358 $this->assertEquals(3, count($revisions)); 359 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 360 $this->assertEquals('fourth save', $revinfo['sum']); 361 $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']); 362 $this->assertEquals(0, $revinfo['sizechange']); 363 364 $this->waitForTick(); // wait for new revision ID 365 366 // add a minor edit (authenticated) 367 $_SERVER['REMOTE_USER'] = 'user'; 368 saveWikiText($page, 'teststring4', 'fifth save', true); 369 clearstatcache(false, $file); 370 $newmod = filemtime($file); 371 $this->assertNotEquals($lastmod, $newmod); 372 $lastmod = $newmod; 373 374 $pagelog = new PageChangeLog($page); 375 $revisions = $pagelog->getRevisions(-1, 200); 376 $this->assertEquals(4, count($revisions)); 377 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 378 $this->assertEquals('fifth save', $revinfo['sum']); 379 $this->assertEquals(DOKU_CHANGE_TYPE_MINOR_EDIT, $revinfo['type']); 380 $this->assertEquals(-4, $revinfo['sizechange']); 381 382 $this->waitForTick(); // wait for new revision ID 383 384 // restore 385 $REV = $revertrev; 386 saveWikiText($page, 'teststring2long', 'sixth save', true); 387 clearstatcache(false, $file); 388 $this->assertFileExists($file); 389 $newmod = filemtime($file); 390 $this->assertNotEquals($lastmod, $newmod); 391 392 $pagelog = new PageChangeLog($page); 393 $revisions = $pagelog->getRevisions(-1, 200); 394 $this->assertEquals(5, count($revisions)); 395 $revinfo = $pagelog->getRevisionInfo($revisions[0]); 396 $this->assertEquals('sixth save', $revinfo['sum']); 397 $this->assertEquals(DOKU_CHANGE_TYPE_REVERT, $revinfo['type']); 398 $this->assertEquals($REV, $revinfo['extra']); 399 $this->assertEquals(4, $revinfo['sizechange']); 400 $REV = ''; 401 } 402 403} 404