]> BookStack Code Mirror - bookstack/blob - tests/Entity/DefaultTemplateTest.php
Lexical: Added about button/view
[bookstack] / tests / Entity / DefaultTemplateTest.php
1 <?php
2
3 namespace Tests\Entity;
4
5 use BookStack\Entities\Models\Book;
6 use BookStack\Entities\Models\Chapter;
7 use BookStack\Entities\Models\Page;
8 use Tests\TestCase;
9
10 class DefaultTemplateTest extends TestCase
11 {
12     public function test_creating_book_with_default_template()
13     {
14         $templatePage = $this->entities->templatePage();
15         $details = [
16             'name' => 'My book with default template',
17             'default_template_id' => $templatePage->id,
18         ];
19
20         $this->asEditor()->post('/books', $details);
21         $this->assertDatabaseHas('books', $details);
22     }
23
24     public function test_creating_chapter_with_default_template()
25     {
26         $templatePage = $this->entities->templatePage();
27         $book = $this->entities->book();
28         $details = [
29             'name' => 'My chapter with default template',
30             'default_template_id' => $templatePage->id,
31         ];
32
33         $this->asEditor()->post($book->getUrl('/create-chapter'), $details);
34         $this->assertDatabaseHas('chapters', $details);
35     }
36
37     public function test_updating_book_with_default_template()
38     {
39         $book = $this->entities->book();
40         $templatePage = $this->entities->templatePage();
41
42         $this->asEditor()->put($book->getUrl(), ['name' => $book->name, 'default_template_id' => strval($templatePage->id)]);
43         $this->assertDatabaseHas('books', ['id' => $book->id, 'default_template_id' => $templatePage->id]);
44
45         $this->asEditor()->put($book->getUrl(), ['name' => $book->name, 'default_template_id' => '']);
46         $this->assertDatabaseHas('books', ['id' => $book->id, 'default_template_id' => null]);
47     }
48
49     public function test_updating_chapter_with_default_template()
50     {
51         $chapter = $this->entities->chapter();
52         $templatePage = $this->entities->templatePage();
53
54         $this->asEditor()->put($chapter->getUrl(), ['name' => $chapter->name, 'default_template_id' => strval($templatePage->id)]);
55         $this->assertDatabaseHas('chapters', ['id' => $chapter->id, 'default_template_id' => $templatePage->id]);
56
57         $this->asEditor()->put($chapter->getUrl(), ['name' => $chapter->name, 'default_template_id' => '']);
58         $this->assertDatabaseHas('chapters', ['id' => $chapter->id, 'default_template_id' => null]);
59     }
60
61     public function test_default_book_template_cannot_be_set_if_not_a_template()
62     {
63         $book = $this->entities->book();
64         $page = $this->entities->page();
65         $this->assertFalse($page->template);
66
67         $this->asEditor()->put("/books/{$book->slug}", ['name' => $book->name, 'default_template_id' => $page->id]);
68         $this->assertDatabaseHas('books', ['id' => $book->id, 'default_template_id' => null]);
69     }
70
71     public function test_default_chapter_template_cannot_be_set_if_not_a_template()
72     {
73         $chapter = $this->entities->chapter();
74         $page = $this->entities->page();
75         $this->assertFalse($page->template);
76
77         $this->asEditor()->put("/chapters/{$chapter->slug}", ['name' => $chapter->name, 'default_template_id' => $page->id]);
78         $this->assertDatabaseHas('chapters', ['id' => $chapter->id, 'default_template_id' => null]);
79     }
80
81
82     public function test_default_book_template_cannot_be_set_if_not_have_access()
83     {
84         $book = $this->entities->book();
85         $templatePage = $this->entities->templatePage();
86         $this->permissions->disableEntityInheritedPermissions($templatePage);
87
88         $this->asEditor()->put("/books/{$book->slug}", ['name' => $book->name, 'default_template_id' => $templatePage->id]);
89         $this->assertDatabaseHas('books', ['id' => $book->id, 'default_template_id' => null]);
90     }
91
92     public function test_default_chapter_template_cannot_be_set_if_not_have_access()
93     {
94         $chapter = $this->entities->chapter();
95         $templatePage = $this->entities->templatePage();
96         $this->permissions->disableEntityInheritedPermissions($templatePage);
97
98         $this->asEditor()->put("/chapters/{$chapter->slug}", ['name' => $chapter->name, 'default_template_id' => $templatePage->id]);
99         $this->assertDatabaseHas('chapters', ['id' => $chapter->id, 'default_template_id' => null]);
100     }
101
102     public function test_inaccessible_book_default_template_can_be_set_if_unchanged()
103     {
104         $templatePage = $this->entities->templatePage();
105         $book = $this->bookUsingDefaultTemplate($templatePage);
106         $this->permissions->disableEntityInheritedPermissions($templatePage);
107
108         $this->asEditor()->put("/books/{$book->slug}", ['name' => $book->name, 'default_template_id' => $templatePage->id]);
109         $this->assertDatabaseHas('books', ['id' => $book->id, 'default_template_id' => $templatePage->id]);
110     }
111
112     public function test_inaccessible_chapter_default_template_can_be_set_if_unchanged()
113     {
114         $templatePage = $this->entities->templatePage();
115         $chapter = $this->chapterUsingDefaultTemplate($templatePage);
116         $this->permissions->disableEntityInheritedPermissions($templatePage);
117
118         $this->asEditor()->put("/chapters/{$chapter->slug}", ['name' => $chapter->name, 'default_template_id' => $templatePage->id]);
119         $this->assertDatabaseHas('chapters', ['id' => $chapter->id, 'default_template_id' => $templatePage->id]);
120     }
121
122     public function test_default_page_template_option_shows_on_book_form()
123     {
124         $templatePage = $this->entities->templatePage();
125         $book = $this->bookUsingDefaultTemplate($templatePage);
126
127         $resp = $this->asEditor()->get($book->getUrl('/edit'));
128         $this->withHtml($resp)->assertElementExists('input[name="default_template_id"][value="' . $templatePage->id . '"]');
129     }
130
131     public function test_default_page_template_option_shows_on_chapter_form()
132     {
133         $templatePage = $this->entities->templatePage();
134         $chapter = $this->chapterUsingDefaultTemplate($templatePage);
135
136         $resp = $this->asEditor()->get($chapter->getUrl('/edit'));
137         $this->withHtml($resp)->assertElementExists('input[name="default_template_id"][value="' . $templatePage->id . '"]');
138     }
139
140     public function test_book_default_page_template_option_only_shows_template_name_if_visible()
141     {
142         $templatePage = $this->entities->templatePage();
143         $book = $this->bookUsingDefaultTemplate($templatePage);
144
145         $resp = $this->asEditor()->get($book->getUrl('/edit'));
146         $this->withHtml($resp)->assertElementContains('#template-control a.text-page', "#{$templatePage->id}, {$templatePage->name}");
147
148         $this->permissions->disableEntityInheritedPermissions($templatePage);
149
150         $resp = $this->asEditor()->get($book->getUrl('/edit'));
151         $this->withHtml($resp)->assertElementNotContains('#template-control a.text-page', "#{$templatePage->id}, {$templatePage->name}");
152         $this->withHtml($resp)->assertElementContains('#template-control a.text-page', "#{$templatePage->id}");
153     }
154
155     public function test_chapter_default_page_template_option_only_shows_template_name_if_visible()
156     {
157         $templatePage = $this->entities->templatePage();
158         $chapter = $this->chapterUsingDefaultTemplate($templatePage);
159
160         $resp = $this->asEditor()->get($chapter->getUrl('/edit'));
161         $this->withHtml($resp)->assertElementContains('#template-control a.text-page', "#{$templatePage->id}, {$templatePage->name}");
162
163         $this->permissions->disableEntityInheritedPermissions($templatePage);
164
165         $resp = $this->asEditor()->get($chapter->getUrl('/edit'));
166         $this->withHtml($resp)->assertElementNotContains('#template-control a.text-page', "#{$templatePage->id}, {$templatePage->name}");
167         $this->withHtml($resp)->assertElementContains('#template-control a.text-page', "#{$templatePage->id}");
168     }
169
170     public function test_creating_book_page_uses_book_default_template()
171     {
172         $templatePage = $this->entities->templatePage();
173         $templatePage->forceFill(['html' => '<p>My template page</p>', 'markdown' => '# My template page'])->save();
174         $book = $this->bookUsingDefaultTemplate($templatePage);
175
176         $this->asEditor()->get($book->getUrl('/create-page'));
177         $latestPage = $book->pages()
178             ->where('draft', '=', true)
179             ->where('template', '=', false)
180             ->latest()->first();
181
182         $this->assertEquals('<p>My template page</p>', $latestPage->html);
183         $this->assertEquals('# My template page', $latestPage->markdown);
184     }
185
186     public function test_creating_chapter_page_uses_chapter_default_template()
187     {
188         $templatePage = $this->entities->templatePage();
189         $templatePage->forceFill(['html' => '<p>My chapter template page</p>', 'markdown' => '# My chapter template page'])->save();
190         $chapter = $this->chapterUsingDefaultTemplate($templatePage);
191
192         $this->asEditor()->get($chapter->getUrl('/create-page'));
193         $latestPage = $chapter->pages()
194             ->where('draft', '=', true)
195             ->where('template', '=', false)
196             ->latest()->first();
197
198         $this->assertEquals('<p>My chapter template page</p>', $latestPage->html);
199         $this->assertEquals('# My chapter template page', $latestPage->markdown);
200     }
201
202     public function test_creating_chapter_page_uses_book_default_template_if_no_chapter_template_set()
203     {
204         $templatePage = $this->entities->templatePage();
205         $templatePage->forceFill(['html' => '<p>My template page in chapter</p>', 'markdown' => '# My template page in chapter'])->save();
206         $book = $this->bookUsingDefaultTemplate($templatePage);
207         $chapter = $book->chapters()->first();
208
209         $this->asEditor()->get($chapter->getUrl('/create-page'));
210         $latestPage = $chapter->pages()
211             ->where('draft', '=', true)
212             ->where('template', '=', false)
213             ->latest()->first();
214
215         $this->assertEquals('<p>My template page in chapter</p>', $latestPage->html);
216         $this->assertEquals('# My template page in chapter', $latestPage->markdown);
217     }
218
219     public function test_creating_chapter_page_uses_chapter_template_instead_of_book_template()
220     {
221         $bookTemplatePage = $this->entities->templatePage();
222         $bookTemplatePage->forceFill(['html' => '<p>My book template</p>', 'markdown' => '# My book template'])->save();
223         $book = $this->bookUsingDefaultTemplate($bookTemplatePage);
224
225         $chapterTemplatePage = $this->entities->templatePage();
226         $chapterTemplatePage->forceFill(['html' => '<p>My chapter template</p>', 'markdown' => '# My chapter template'])->save();
227         $chapter = $book->chapters()->first();
228         $chapter->default_template_id = $chapterTemplatePage->id;
229         $chapter->save();
230
231         $this->asEditor()->get($chapter->getUrl('/create-page'));
232         $latestPage = $chapter->pages()
233             ->where('draft', '=', true)
234             ->where('template', '=', false)
235             ->latest()->first();
236
237         $this->assertEquals('<p>My chapter template</p>', $latestPage->html);
238         $this->assertEquals('# My chapter template', $latestPage->markdown);
239     }
240
241     public function test_creating_page_as_guest_uses_default_template()
242     {
243         $templatePage = $this->entities->templatePage();
244         $templatePage->forceFill(['html' => '<p>My template page</p>', 'markdown' => '# My template page'])->save();
245         $book = $this->bookUsingDefaultTemplate($templatePage);
246         $chapter = $this->chapterUsingDefaultTemplate($templatePage);
247         $guest = $this->users->guest();
248
249         $this->permissions->makeAppPublic();
250         $this->permissions->grantUserRolePermissions($guest, ['page-create-all', 'page-update-all']);
251
252         $this->post($book->getUrl('/create-guest-page'), [
253             'name' => 'My guest page with template'
254         ]);
255         $latestBookPage = $book->pages()
256             ->where('draft', '=', false)
257             ->where('template', '=', false)
258             ->where('created_by', '=', $guest->id)
259             ->latest()->first();
260
261         $this->assertEquals('<p>My template page</p>', $latestBookPage->html);
262         $this->assertEquals('# My template page', $latestBookPage->markdown);
263
264         $this->post($chapter->getUrl('/create-guest-page'), [
265             'name' => 'My guest page with template'
266         ]);
267         $latestChapterPage = $chapter->pages()
268             ->where('draft', '=', false)
269             ->where('template', '=', false)
270             ->where('created_by', '=', $guest->id)
271             ->latest()->first();
272
273         $this->assertEquals('<p>My template page</p>', $latestChapterPage->html);
274         $this->assertEquals('# My template page', $latestChapterPage->markdown);
275     }
276
277     public function test_templates_not_used_if_not_visible()
278     {
279         $templatePage = $this->entities->templatePage();
280         $templatePage->forceFill(['html' => '<p>My template page</p>', 'markdown' => '# My template page'])->save();
281         $book = $this->bookUsingDefaultTemplate($templatePage);
282         $chapter = $this->chapterUsingDefaultTemplate($templatePage);
283
284         $this->permissions->disableEntityInheritedPermissions($templatePage);
285
286         $this->asEditor()->get($book->getUrl('/create-page'));
287         $latestBookPage = $book->pages()
288             ->where('draft', '=', true)
289             ->where('template', '=', false)
290             ->latest()->first();
291
292         $this->assertEquals('', $latestBookPage->html);
293         $this->assertEquals('', $latestBookPage->markdown);
294
295         $this->asEditor()->get($chapter->getUrl('/create-page'));
296         $latestChapterPage = $chapter->pages()
297             ->where('draft', '=', true)
298             ->where('template', '=', false)
299             ->latest()->first();
300
301         $this->assertEquals('', $latestChapterPage->html);
302         $this->assertEquals('', $latestChapterPage->markdown);
303     }
304
305     public function test_template_page_delete_removes_template_usage()
306     {
307         $templatePage = $this->entities->templatePage();
308         $book = $this->bookUsingDefaultTemplate($templatePage);
309         $chapter = $this->chapterUsingDefaultTemplate($templatePage);
310
311         $book->refresh();
312         $this->assertEquals($templatePage->id, $book->default_template_id);
313         $this->assertEquals($templatePage->id, $chapter->default_template_id);
314
315         $this->asEditor()->delete($templatePage->getUrl());
316         $this->asAdmin()->post('/settings/recycle-bin/empty');
317
318         $book->refresh();
319         $chapter->refresh();
320         $this->assertEquals(null, $book->default_template_id);
321         $this->assertEquals(null, $chapter->default_template_id);
322     }
323
324     protected function bookUsingDefaultTemplate(Page $page): Book
325     {
326         $book = $this->entities->book();
327         $book->default_template_id = $page->id;
328         $book->save();
329
330         return $book;
331     }
332
333     protected function chapterUsingDefaultTemplate(Page $page): Chapter
334     {
335         $chapter = $this->entities->chapter();
336         $chapter->default_template_id = $page->id;
337         $chapter->save();
338
339         return $chapter;
340     }
341 }