]> BookStack Code Mirror - bookstack/blob - tests/Entity/PageRevisionTest.php
Merge pull request #3364 from BookStackApp/app_url_requests
[bookstack] / tests / Entity / PageRevisionTest.php
1 <?php
2
3 namespace Tests\Entity;
4
5 use BookStack\Entities\Models\Page;
6 use BookStack\Entities\Repos\PageRepo;
7 use Tests\TestCase;
8
9 class PageRevisionTest extends TestCase
10 {
11     public function test_page_revision_views_viewable()
12     {
13         $this->asEditor();
14
15         $pageRepo = app(PageRepo::class);
16         $page = Page::first();
17         $pageRepo->update($page, ['name' => 'updated page', 'html' => '<p>new content</p>', 'summary' => 'page revision testing']);
18         $pageRevision = $page->revisions->last();
19
20         $revisionView = $this->get($page->getUrl() . '/revisions/' . $pageRevision->id);
21         $revisionView->assertStatus(200);
22         $revisionView->assertSee('new content');
23
24         $revisionView = $this->get($page->getUrl() . '/revisions/' . $pageRevision->id . '/changes');
25         $revisionView->assertStatus(200);
26         $revisionView->assertSee('new content');
27     }
28
29     public function test_page_revision_preview_shows_content_of_revision()
30     {
31         $this->asEditor();
32
33         $pageRepo = app(PageRepo::class);
34         $page = Page::first();
35         $pageRepo->update($page, ['name' => 'updated page', 'html' => '<p>new revision content</p>', 'summary' => 'page revision testing']);
36         $pageRevision = $page->revisions->last();
37         $pageRepo->update($page, ['name' => 'updated page', 'html' => '<p>Updated content</p>', 'summary' => 'page revision testing 2']);
38
39         $revisionView = $this->get($page->getUrl() . '/revisions/' . $pageRevision->id);
40         $revisionView->assertStatus(200);
41         $revisionView->assertSee('new revision content');
42     }
43
44     public function test_page_revision_restore_updates_content()
45     {
46         $this->asEditor();
47
48         $pageRepo = app(PageRepo::class);
49         $page = Page::first();
50         $pageRepo->update($page, ['name' => 'updated page abc123', 'html' => '<p>new contente def456</p>', 'summary' => 'initial page revision testing']);
51         $pageRepo->update($page, ['name' => 'updated page again', 'html' => '<p>new content</p>', 'summary' => 'page revision testing']);
52         $page = Page::find($page->id);
53
54         $pageView = $this->get($page->getUrl());
55         $pageView->assertDontSee('abc123');
56         $pageView->assertDontSee('def456');
57
58         $revToRestore = $page->revisions()->where('name', 'like', '%abc123')->first();
59         $restoreReq = $this->put($page->getUrl() . '/revisions/' . $revToRestore->id . '/restore');
60         $page = Page::find($page->id);
61
62         $restoreReq->assertStatus(302);
63         $restoreReq->assertRedirect($page->getUrl());
64
65         $pageView = $this->get($page->getUrl());
66         $pageView->assertSee('abc123');
67         $pageView->assertSee('def456');
68     }
69
70     public function test_page_revision_restore_with_markdown_retains_markdown_content()
71     {
72         $this->asEditor();
73
74         $pageRepo = app(PageRepo::class);
75         $page = Page::first();
76         $pageRepo->update($page, ['name' => 'updated page abc123', 'markdown' => '## New Content def456', 'summary' => 'initial page revision testing']);
77         $pageRepo->update($page, ['name' => 'updated page again', 'markdown' => '## New Content Updated', 'summary' => 'page revision testing']);
78         $page = Page::find($page->id);
79
80         $pageView = $this->get($page->getUrl());
81         $pageView->assertDontSee('abc123');
82         $pageView->assertDontSee('def456');
83
84         $revToRestore = $page->revisions()->where('name', 'like', '%abc123')->first();
85         $restoreReq = $this->put($page->getUrl() . '/revisions/' . $revToRestore->id . '/restore');
86         $page = Page::find($page->id);
87
88         $restoreReq->assertStatus(302);
89         $restoreReq->assertRedirect($page->getUrl());
90
91         $pageView = $this->get($page->getUrl());
92         $this->assertDatabaseHas('pages', [
93             'id'       => $page->id,
94             'markdown' => '## New Content def456',
95         ]);
96         $pageView->assertSee('abc123');
97         $pageView->assertSee('def456');
98     }
99
100     public function test_page_revision_restore_sets_new_revision_with_summary()
101     {
102         $this->asEditor();
103
104         $pageRepo = app(PageRepo::class);
105         $page = Page::first();
106         $pageRepo->update($page, ['name' => 'updated page abc123', 'html' => '<p>new contente def456</p>', 'summary' => 'My first update']);
107         $pageRepo->update($page, ['name' => 'updated page again', 'html' => '<p>new content</p>', 'summary' => '']);
108         $page->refresh();
109
110         $revToRestore = $page->revisions()->where('name', 'like', '%abc123')->first();
111         $this->put($page->getUrl() . '/revisions/' . $revToRestore->id . '/restore');
112         $page->refresh();
113
114         $this->assertDatabaseHas('page_revisions', [
115             'page_id' => $page->id,
116             'text'    => 'new contente def456',
117             'type'    => 'version',
118             'summary' => "Restored from #{$revToRestore->id}; My first update",
119         ]);
120     }
121
122     public function test_page_revision_count_increments_on_update()
123     {
124         $page = Page::first();
125         $startCount = $page->revision_count;
126         $resp = $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
127         $resp->assertStatus(302);
128
129         $this->assertTrue(Page::find($page->id)->revision_count === $startCount + 1);
130     }
131
132     public function test_revision_count_shown_in_page_meta()
133     {
134         $page = Page::first();
135         $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
136
137         $page = Page::find($page->id);
138         $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
139
140         $page = Page::find($page->id);
141         $pageView = $this->get($page->getUrl());
142         $pageView->assertSee('Revision #' . $page->revision_count);
143     }
144
145     public function test_revision_deletion()
146     {
147         /** @var Page $page */
148         $page = Page::query()->first();
149         $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
150
151         $page->refresh();
152         $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
153
154         $page->refresh();
155         $beforeRevisionCount = $page->revisions->count();
156
157         // Delete the first revision
158         $revision = $page->revisions->get(1);
159         $resp = $this->asEditor()->delete($revision->getUrl('/delete/'));
160         $resp->assertRedirect($page->getUrl('/revisions'));
161
162         $page->refresh();
163         $afterRevisionCount = $page->revisions->count();
164
165         $this->assertTrue($beforeRevisionCount === ($afterRevisionCount + 1));
166
167         // Try to delete the latest revision
168         $beforeRevisionCount = $page->revisions->count();
169         $resp = $this->asEditor()->delete($page->currentRevision->getUrl('/delete/'));
170         $resp->assertRedirect($page->getUrl('/revisions'));
171
172         $page->refresh();
173         $afterRevisionCount = $page->revisions->count();
174         $this->assertTrue($beforeRevisionCount === $afterRevisionCount);
175     }
176
177     public function test_revision_limit_enforced()
178     {
179         config()->set('app.revision_limit', 2);
180         $page = Page::first();
181         $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
182         $page = Page::find($page->id);
183         $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
184         for ($i = 0; $i < 10; $i++) {
185             $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
186         }
187
188         $revisionCount = $page->revisions()->count();
189         $this->assertEquals(2, $revisionCount);
190     }
191
192     public function test_false_revision_limit_allows_many_revisions()
193     {
194         config()->set('app.revision_limit', false);
195         $page = Page::first();
196         $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
197         $page = Page::find($page->id);
198         $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
199         for ($i = 0; $i < 10; $i++) {
200             $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
201         }
202
203         $revisionCount = $page->revisions()->count();
204         $this->assertEquals(12, $revisionCount);
205     }
206
207     public function test_revision_list_shows_editor_type()
208     {
209         /** @var Page $page */
210         $page = Page::first();
211         $this->asAdmin()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html']);
212
213         $resp = $this->get($page->refresh()->getUrl('/revisions'));
214         $resp->assertElementContains('td', '(WYSIWYG)');
215         $resp->assertElementNotContains('td', '(Markdown)');
216
217         $this->asAdmin()->put($page->getUrl(), ['name' => 'Updated page', 'markdown' => '# Some markdown content']);
218         $resp = $this->get($page->refresh()->getUrl('/revisions'));
219         $resp->assertElementContains('td', '(Markdown)');
220     }
221 }