xref: /dokuwiki/_test/tests/ChangeLog/PageChangeLogTest.php (revision 2bde879a12352d26be5e3f11e86855f463734d2d)
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