3 namespace Tests\Entity;
5 use BookStack\Entities\Models\Book;
6 use BookStack\Entities\Models\Chapter;
7 use BookStack\Entities\Models\Page;
10 class DefaultTemplateTest extends TestCase
12 public function test_creating_book_with_default_template()
14 $templatePage = $this->entities->templatePage();
16 'name' => 'My book with default template',
17 'default_template_id' => $templatePage->id,
20 $this->asEditor()->post('/books', $details);
21 $this->assertDatabaseHas('books', $details);
24 public function test_creating_chapter_with_default_template()
26 $templatePage = $this->entities->templatePage();
27 $book = $this->entities->book();
29 'name' => 'My chapter with default template',
30 'default_template_id' => $templatePage->id,
33 $this->asEditor()->post($book->getUrl('/create-chapter'), $details);
34 $this->assertDatabaseHas('chapters', $details);
37 public function test_updating_book_with_default_template()
39 $book = $this->entities->book();
40 $templatePage = $this->entities->templatePage();
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]);
45 $this->asEditor()->put($book->getUrl(), ['name' => $book->name, 'default_template_id' => '']);
46 $this->assertDatabaseHas('books', ['id' => $book->id, 'default_template_id' => null]);
49 public function test_updating_chapter_with_default_template()
51 $chapter = $this->entities->chapter();
52 $templatePage = $this->entities->templatePage();
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]);
57 $this->asEditor()->put($chapter->getUrl(), ['name' => $chapter->name, 'default_template_id' => '']);
58 $this->assertDatabaseHas('chapters', ['id' => $chapter->id, 'default_template_id' => null]);
61 public function test_default_book_template_cannot_be_set_if_not_a_template()
63 $book = $this->entities->book();
64 $page = $this->entities->page();
65 $this->assertFalse($page->template);
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]);
71 public function test_default_chapter_template_cannot_be_set_if_not_a_template()
73 $chapter = $this->entities->chapter();
74 $page = $this->entities->page();
75 $this->assertFalse($page->template);
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]);
82 public function test_default_book_template_cannot_be_set_if_not_have_access()
84 $book = $this->entities->book();
85 $templatePage = $this->entities->templatePage();
86 $this->permissions->disableEntityInheritedPermissions($templatePage);
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]);
92 public function test_default_chapter_template_cannot_be_set_if_not_have_access()
94 $chapter = $this->entities->chapter();
95 $templatePage = $this->entities->templatePage();
96 $this->permissions->disableEntityInheritedPermissions($templatePage);
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]);
102 public function test_inaccessible_book_default_template_can_be_set_if_unchanged()
104 $templatePage = $this->entities->templatePage();
105 $book = $this->bookUsingDefaultTemplate($templatePage);
106 $this->permissions->disableEntityInheritedPermissions($templatePage);
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]);
112 public function test_inaccessible_chapter_default_template_can_be_set_if_unchanged()
114 $templatePage = $this->entities->templatePage();
115 $chapter = $this->chapterUsingDefaultTemplate($templatePage);
116 $this->permissions->disableEntityInheritedPermissions($templatePage);
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]);
122 public function test_default_page_template_option_shows_on_book_form()
124 $templatePage = $this->entities->templatePage();
125 $book = $this->bookUsingDefaultTemplate($templatePage);
127 $resp = $this->asEditor()->get($book->getUrl('/edit'));
128 $this->withHtml($resp)->assertElementExists('input[name="default_template_id"][value="' . $templatePage->id . '"]');
131 public function test_default_page_template_option_shows_on_chapter_form()
133 $templatePage = $this->entities->templatePage();
134 $chapter = $this->chapterUsingDefaultTemplate($templatePage);
136 $resp = $this->asEditor()->get($chapter->getUrl('/edit'));
137 $this->withHtml($resp)->assertElementExists('input[name="default_template_id"][value="' . $templatePage->id . '"]');
140 public function test_book_default_page_template_option_only_shows_template_name_if_visible()
142 $templatePage = $this->entities->templatePage();
143 $book = $this->bookUsingDefaultTemplate($templatePage);
145 $resp = $this->asEditor()->get($book->getUrl('/edit'));
146 $this->withHtml($resp)->assertElementContains('#template-control a.text-page', "#{$templatePage->id}, {$templatePage->name}");
148 $this->permissions->disableEntityInheritedPermissions($templatePage);
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}");
155 public function test_chapter_default_page_template_option_only_shows_template_name_if_visible()
157 $templatePage = $this->entities->templatePage();
158 $chapter = $this->chapterUsingDefaultTemplate($templatePage);
160 $resp = $this->asEditor()->get($chapter->getUrl('/edit'));
161 $this->withHtml($resp)->assertElementContains('#template-control a.text-page', "#{$templatePage->id}, {$templatePage->name}");
163 $this->permissions->disableEntityInheritedPermissions($templatePage);
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}");
170 public function test_creating_book_page_uses_book_default_template()
172 $templatePage = $this->entities->templatePage();
173 $templatePage->forceFill(['html' => '<p>My template page</p>', 'markdown' => '# My template page'])->save();
174 $book = $this->bookUsingDefaultTemplate($templatePage);
176 $this->asEditor()->get($book->getUrl('/create-page'));
177 $latestPage = $book->pages()
178 ->where('draft', '=', true)
179 ->where('template', '=', false)
182 $this->assertEquals('<p>My template page</p>', $latestPage->html);
183 $this->assertEquals('# My template page', $latestPage->markdown);
186 public function test_creating_chapter_page_uses_chapter_default_template()
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);
192 $this->asEditor()->get($chapter->getUrl('/create-page'));
193 $latestPage = $chapter->pages()
194 ->where('draft', '=', true)
195 ->where('template', '=', false)
198 $this->assertEquals('<p>My chapter template page</p>', $latestPage->html);
199 $this->assertEquals('# My chapter template page', $latestPage->markdown);
202 public function test_creating_chapter_page_uses_book_default_template_if_no_chapter_template_set()
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();
209 $this->asEditor()->get($chapter->getUrl('/create-page'));
210 $latestPage = $chapter->pages()
211 ->where('draft', '=', true)
212 ->where('template', '=', false)
215 $this->assertEquals('<p>My template page in chapter</p>', $latestPage->html);
216 $this->assertEquals('# My template page in chapter', $latestPage->markdown);
219 public function test_creating_chapter_page_uses_chapter_template_instead_of_book_template()
221 $bookTemplatePage = $this->entities->templatePage();
222 $bookTemplatePage->forceFill(['html' => '<p>My book template</p>', 'markdown' => '# My book template'])->save();
223 $book = $this->bookUsingDefaultTemplate($bookTemplatePage);
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;
231 $this->asEditor()->get($chapter->getUrl('/create-page'));
232 $latestPage = $chapter->pages()
233 ->where('draft', '=', true)
234 ->where('template', '=', false)
237 $this->assertEquals('<p>My chapter template</p>', $latestPage->html);
238 $this->assertEquals('# My chapter template', $latestPage->markdown);
241 public function test_creating_page_as_guest_uses_default_template()
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();
249 $this->permissions->makeAppPublic();
250 $this->permissions->grantUserRolePermissions($guest, ['page-create-all', 'page-update-all']);
252 $this->post($book->getUrl('/create-guest-page'), [
253 'name' => 'My guest page with template'
255 $latestBookPage = $book->pages()
256 ->where('draft', '=', false)
257 ->where('template', '=', false)
258 ->where('created_by', '=', $guest->id)
261 $this->assertEquals('<p>My template page</p>', $latestBookPage->html);
262 $this->assertEquals('# My template page', $latestBookPage->markdown);
264 $this->post($chapter->getUrl('/create-guest-page'), [
265 'name' => 'My guest page with template'
267 $latestChapterPage = $chapter->pages()
268 ->where('draft', '=', false)
269 ->where('template', '=', false)
270 ->where('created_by', '=', $guest->id)
273 $this->assertEquals('<p>My template page</p>', $latestChapterPage->html);
274 $this->assertEquals('# My template page', $latestChapterPage->markdown);
277 public function test_templates_not_used_if_not_visible()
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);
284 $this->permissions->disableEntityInheritedPermissions($templatePage);
286 $this->asEditor()->get($book->getUrl('/create-page'));
287 $latestBookPage = $book->pages()
288 ->where('draft', '=', true)
289 ->where('template', '=', false)
292 $this->assertEquals('', $latestBookPage->html);
293 $this->assertEquals('', $latestBookPage->markdown);
295 $this->asEditor()->get($chapter->getUrl('/create-page'));
296 $latestChapterPage = $chapter->pages()
297 ->where('draft', '=', true)
298 ->where('template', '=', false)
301 $this->assertEquals('', $latestChapterPage->html);
302 $this->assertEquals('', $latestChapterPage->markdown);
305 public function test_template_page_delete_removes_template_usage()
307 $templatePage = $this->entities->templatePage();
308 $book = $this->bookUsingDefaultTemplate($templatePage);
309 $chapter = $this->chapterUsingDefaultTemplate($templatePage);
312 $this->assertEquals($templatePage->id, $book->default_template_id);
313 $this->assertEquals($templatePage->id, $chapter->default_template_id);
315 $this->asEditor()->delete($templatePage->getUrl());
316 $this->asAdmin()->post('/settings/recycle-bin/empty');
320 $this->assertEquals(null, $book->default_template_id);
321 $this->assertEquals(null, $chapter->default_template_id);
324 protected function bookUsingDefaultTemplate(Page $page): Book
326 $book = $this->entities->book();
327 $book->default_template_id = $page->id;
333 protected function chapterUsingDefaultTemplate(Page $page): Chapter
335 $chapter = $this->entities->chapter();
336 $chapter->default_template_id = $page->id;