1*2bde879aSAndreas Gohr<?php 2*2bde879aSAndreas Gohr 3*2bde879aSAndreas Gohrnamespace dokuwiki\test\ChangeLog; 4*2bde879aSAndreas Gohr 5*2bde879aSAndreas Gohruse dokuwiki\ChangeLog\PageChangeLog; 6*2bde879aSAndreas Gohr 7*2bde879aSAndreas Gohr/** 8*2bde879aSAndreas Gohr * Tests for dokuwiki\ChangeLog\PageChangeLog. 9*2bde879aSAndreas Gohr */ 10*2bde879aSAndreas Gohrclass PageChangeLogTest extends \DokuWikiTest 11*2bde879aSAndreas Gohr{ 12*2bde879aSAndreas Gohr /** 13*2bde879aSAndreas Gohr * A page deleted through DokuWiki is recorded as its own revision, newer than the 14*2bde879aSAndreas Gohr * last revision that still had content. getRelativeRevision() must walk back from 15*2bde879aSAndreas Gohr * that deletion entry to the last content revision (issue #4635). 16*2bde879aSAndreas Gohr */ 17*2bde879aSAndreas Gohr public function testRevisionBeforeNormalDeletion() 18*2bde879aSAndreas Gohr { 19*2bde879aSAndreas Gohr $page = 'changelog_deleted'; 20*2bde879aSAndreas Gohr saveWikiText($page, 'first content', 'create', false); 21*2bde879aSAndreas Gohr $this->waitForTick(true); 22*2bde879aSAndreas Gohr saveWikiText($page, 'second content longer', 'edit', false); 23*2bde879aSAndreas Gohr $this->waitForTick(true); 24*2bde879aSAndreas Gohr 25*2bde879aSAndreas Gohr $editRev = (new PageChangeLog($page))->currentRevision(); 26*2bde879aSAndreas Gohr 27*2bde879aSAndreas Gohr saveWikiText($page, '', 'delete', false); 28*2bde879aSAndreas Gohr clearstatcache(); 29*2bde879aSAndreas Gohr 30*2bde879aSAndreas Gohr $changelog = new PageChangeLog($page); 31*2bde879aSAndreas Gohr $delRev = $changelog->currentRevision(); 32*2bde879aSAndreas Gohr 33*2bde879aSAndreas Gohr $this->assertNotEquals($editRev, $delRev, 'deletion should get its own revision'); 34*2bde879aSAndreas Gohr $this->assertEquals( 35*2bde879aSAndreas Gohr DOKU_CHANGE_TYPE_DELETE, 36*2bde879aSAndreas Gohr $changelog->getRevisionInfo($delRev)['type'], 37*2bde879aSAndreas Gohr 'current revision should be the deletion' 38*2bde879aSAndreas Gohr ); 39*2bde879aSAndreas Gohr $this->assertEquals( 40*2bde879aSAndreas Gohr $editRev, 41*2bde879aSAndreas Gohr $changelog->getRelativeRevision($delRev, -1), 42*2bde879aSAndreas Gohr 'the revision before the deletion should be the last edit' 43*2bde879aSAndreas Gohr ); 44*2bde879aSAndreas Gohr } 45*2bde879aSAndreas Gohr 46*2bde879aSAndreas Gohr /** 47*2bde879aSAndreas Gohr * An external deletion is detected and persisted on first read as its own revision 48*2bde879aSAndreas Gohr * with an unknown exact date, newer than the last content revision. 49*2bde879aSAndreas Gohr * getRelativeRevision() must walk back from it to that last content revision 50*2bde879aSAndreas Gohr * (issue #4635). 51*2bde879aSAndreas Gohr */ 52*2bde879aSAndreas Gohr public function testRevisionBeforeExternalDeletion() 53*2bde879aSAndreas Gohr { 54*2bde879aSAndreas Gohr $page = 'changelog_extdeleted'; 55*2bde879aSAndreas Gohr saveWikiText($page, 'first content', 'create', false); 56*2bde879aSAndreas Gohr $this->waitForTick(true); 57*2bde879aSAndreas Gohr saveWikiText($page, 'second content longer', 'edit', false); 58*2bde879aSAndreas Gohr $this->waitForTick(true); 59*2bde879aSAndreas Gohr 60*2bde879aSAndreas Gohr $editRev = (new PageChangeLog($page))->currentRevision(); 61*2bde879aSAndreas Gohr 62*2bde879aSAndreas Gohr // delete the page file externally, bypassing DokuWiki 63*2bde879aSAndreas Gohr unlink(wikiFN($page)); 64*2bde879aSAndreas Gohr clearstatcache(); 65*2bde879aSAndreas Gohr 66*2bde879aSAndreas Gohr // first read detects and persists the external deletion 67*2bde879aSAndreas Gohr $changelog = new PageChangeLog($page); 68*2bde879aSAndreas Gohr $delRev = $changelog->currentRevision(); 69*2bde879aSAndreas Gohr $delInfo = $changelog->getRevisionInfo($delRev); 70*2bde879aSAndreas Gohr 71*2bde879aSAndreas Gohr $this->assertNotEquals($editRev, $delRev, 'external deletion should get its own revision'); 72*2bde879aSAndreas Gohr $this->assertEquals(DOKU_CHANGE_TYPE_DELETE, $delInfo['type'], 'current revision should be the deletion'); 73*2bde879aSAndreas Gohr $this->assertFalse($delInfo['timestamp'], 'external deletion has an unknown exact date'); 74*2bde879aSAndreas Gohr $this->assertEquals( 75*2bde879aSAndreas Gohr $editRev, 76*2bde879aSAndreas Gohr $changelog->getRelativeRevision($delRev, -1), 77*2bde879aSAndreas Gohr 'the revision before the external deletion should be the last edit' 78*2bde879aSAndreas Gohr ); 79*2bde879aSAndreas Gohr } 80*2bde879aSAndreas Gohr} 81