| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Tests; | 
					
						
							| 
									
										
										
										
											2017-08-28 20:55:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Users\Models\Role; | 
					
						
							|  |  |  | use BookStack\Users\Models\User; | 
					
						
							| 
									
										
										
										
											2019-05-08 05:42:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-28 20:55:39 +08:00
										 |  |  | class HomepageTest extends TestCase | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public function test_default_homepage_visible() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |         $homeVisit = $this->get('/'); | 
					
						
							|  |  |  |         $homeVisit->assertSee('My Recently Viewed'); | 
					
						
							|  |  |  |         $homeVisit->assertSee('Recently Updated Pages'); | 
					
						
							|  |  |  |         $homeVisit->assertSee('Recent Activity'); | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         $homeVisit->assertSee('home-default'); | 
					
						
							| 
									
										
										
										
											2017-08-28 20:55:39 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 02:14:46 +08:00
										 |  |  |     public function test_custom_homepage() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-08-28 20:55:39 +08:00
										 |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |         $name = 'My custom homepage'; | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         $content = str_repeat('This is the body content of my custom homepage.', 20); | 
					
						
							| 
									
										
										
										
											2022-09-29 23:49:25 +08:00
										 |  |  |         $customPage = $this->entities->newPage(['name' => $name, 'html' => $content]); | 
					
						
							| 
									
										
										
										
											2017-08-28 20:55:39 +08:00
										 |  |  |         $this->setSettings(['app-homepage' => $customPage->id]); | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         $this->setSettings(['app-homepage-type' => 'page']); | 
					
						
							| 
									
										
										
										
											2017-08-28 20:55:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $homeVisit = $this->get('/'); | 
					
						
							|  |  |  |         $homeVisit->assertSee($name); | 
					
						
							|  |  |  |         $homeVisit->assertSee($content); | 
					
						
							|  |  |  |         $homeVisit->assertSee('My Recently Viewed'); | 
					
						
							|  |  |  |         $homeVisit->assertSee('Recently Updated Pages'); | 
					
						
							|  |  |  |         $homeVisit->assertSee('Recent Activity'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-10-16 02:14:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function test_delete_custom_homepage() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |         $name = 'My custom homepage'; | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         $content = str_repeat('This is the body content of my custom homepage.', 20); | 
					
						
							| 
									
										
										
										
											2022-09-29 23:49:25 +08:00
										 |  |  |         $customPage = $this->entities->newPage(['name' => $name, 'html' => $content]); | 
					
						
							| 
									
										
										
										
											2019-05-27 19:40:19 +08:00
										 |  |  |         $this->setSettings([ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'app-homepage'      => $customPage->id, | 
					
						
							|  |  |  |             'app-homepage-type' => 'page', | 
					
						
							| 
									
										
										
										
											2019-05-27 19:40:19 +08:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2017-10-16 02:14:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $homeVisit = $this->get('/'); | 
					
						
							|  |  |  |         $homeVisit->assertSee($name); | 
					
						
							| 
									
										
										
										
											2022-07-23 22:10:18 +08:00
										 |  |  |         $this->withHtml($homeVisit)->assertElementNotExists('#home-default'); | 
					
						
							| 
									
										
										
										
											2017-10-16 02:14:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $pageDeleteReq = $this->delete($customPage->getUrl()); | 
					
						
							|  |  |  |         $pageDeleteReq->assertStatus(302); | 
					
						
							|  |  |  |         $pageDeleteReq->assertRedirect($customPage->getUrl()); | 
					
						
							|  |  |  |         $pageDeleteReq->assertSessionHas('error'); | 
					
						
							|  |  |  |         $pageDeleteReq->assertSessionMissing('success'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $homeVisit = $this->get('/'); | 
					
						
							|  |  |  |         $homeVisit->assertSee($name); | 
					
						
							|  |  |  |         $homeVisit->assertStatus(200); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-05-12 15:37:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-27 19:40:19 +08:00
										 |  |  |     public function test_custom_homepage_can_be_deleted_once_custom_homepage_no_longer_used() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |         $name = 'My custom homepage'; | 
					
						
							|  |  |  |         $content = str_repeat('This is the body content of my custom homepage.', 20); | 
					
						
							| 
									
										
										
										
											2022-09-29 23:49:25 +08:00
										 |  |  |         $customPage = $this->entities->newPage(['name' => $name, 'html' => $content]); | 
					
						
							| 
									
										
										
										
											2019-05-27 19:40:19 +08:00
										 |  |  |         $this->setSettings([ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'app-homepage'      => $customPage->id, | 
					
						
							|  |  |  |             'app-homepage-type' => 'default', | 
					
						
							| 
									
										
										
										
											2019-05-27 19:40:19 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pageDeleteReq = $this->delete($customPage->getUrl()); | 
					
						
							|  |  |  |         $pageDeleteReq->assertStatus(302); | 
					
						
							|  |  |  |         $pageDeleteReq->assertSessionHas('success'); | 
					
						
							|  |  |  |         $pageDeleteReq->assertSessionMissing('error'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-11 01:04:01 +08:00
										 |  |  |     public function test_custom_homepage_cannot_be_deleted_from_parent_deletion() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-09-30 00:31:38 +08:00
										 |  |  |         $page = $this->entities->page(); | 
					
						
							| 
									
										
										
										
											2022-01-11 01:04:01 +08:00
										 |  |  |         $this->setSettings([ | 
					
						
							|  |  |  |             'app-homepage'      => $page->id, | 
					
						
							|  |  |  |             'app-homepage-type' => 'page', | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->asEditor()->delete($page->book->getUrl()); | 
					
						
							|  |  |  |         $this->assertSessionError('Cannot delete a page while it is set as a homepage'); | 
					
						
							|  |  |  |         $this->assertDatabaseMissing('deletions', ['deletable_id' => $page->book->id]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $page->refresh(); | 
					
						
							|  |  |  |         $this->assertNull($page->deleted_at); | 
					
						
							|  |  |  |         $this->assertNull($page->book->deleted_at); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-04 18:26:26 +08:00
										 |  |  |     public function test_custom_homepage_renders_includes() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							| 
									
										
										
										
											2022-09-30 05:11:16 +08:00
										 |  |  |         $included = $this->entities->page(); | 
					
						
							| 
									
										
										
										
											2021-10-04 18:26:26 +08:00
										 |  |  |         $content = str_repeat('This is the body content of my custom homepage.', 20); | 
					
						
							|  |  |  |         $included->html = $content; | 
					
						
							|  |  |  |         $included->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $name = 'My custom homepage'; | 
					
						
							| 
									
										
										
										
											2022-09-29 23:49:25 +08:00
										 |  |  |         $customPage = $this->entities->newPage(['name' => $name, 'html' => '{{@' . $included->id . '}}']); | 
					
						
							| 
									
										
										
										
											2021-10-04 18:26:26 +08:00
										 |  |  |         $this->setSettings(['app-homepage' => $customPage->id]); | 
					
						
							|  |  |  |         $this->setSettings(['app-homepage-type' => 'page']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $homeVisit = $this->get('/'); | 
					
						
							|  |  |  |         $homeVisit->assertSee($name); | 
					
						
							|  |  |  |         $homeVisit->assertSee($content); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-12 15:37:28 +08:00
										 |  |  |     public function test_set_book_homepage() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-01-21 19:08:34 +08:00
										 |  |  |         $editor = $this->users->editor(); | 
					
						
							| 
									
										
										
										
											2018-05-12 15:37:28 +08:00
										 |  |  |         setting()->putUser($editor, 'books_view_type', 'grid'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         $this->setSettings(['app-homepage-type' => 'books']); | 
					
						
							| 
									
										
										
										
											2018-05-12 15:37:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |         $homeVisit = $this->get('/'); | 
					
						
							|  |  |  |         $homeVisit->assertSee('Books'); | 
					
						
							| 
									
										
										
										
											2019-04-07 01:36:17 +08:00
										 |  |  |         $homeVisit->assertSee('grid-card'); | 
					
						
							| 
									
										
										
										
											2018-05-12 15:37:28 +08:00
										 |  |  |         $homeVisit->assertSee('grid-card-content'); | 
					
						
							|  |  |  |         $homeVisit->assertSee('grid-card-footer'); | 
					
						
							|  |  |  |         $homeVisit->assertSee('featured-image-container'); | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_set_bookshelves_homepage() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-01-21 19:08:34 +08:00
										 |  |  |         $editor = $this->users->editor(); | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         setting()->putUser($editor, 'bookshelves_view_type', 'grid'); | 
					
						
							| 
									
										
										
										
											2022-09-30 05:11:16 +08:00
										 |  |  |         $shelf = $this->entities->shelf(); | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->setSettings(['app-homepage-type' => 'bookshelves']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |         $homeVisit = $this->get('/'); | 
					
						
							|  |  |  |         $homeVisit->assertSee('Shelves'); | 
					
						
							|  |  |  |         $homeVisit->assertSee('grid-card-content'); | 
					
						
							|  |  |  |         $homeVisit->assertSee('featured-image-container'); | 
					
						
							| 
									
										
										
										
											2022-07-23 22:10:18 +08:00
										 |  |  |         $this->withHtml($homeVisit)->assertElementContains('.grid-card', $shelf->name); | 
					
						
							| 
									
										
										
										
											2023-09-24 16:31:44 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_books_and_bookshelves_homepage_has_expected_actions() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (['bookshelves', 'books'] as $homepageType) { | 
					
						
							|  |  |  |             $this->setSettings(['app-homepage-type' => $homepageType]); | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-24 16:31:44 +08:00
										 |  |  |             $html = $this->withHtml($this->get('/')); | 
					
						
							|  |  |  |             $html->assertElementContains('.actions button', 'Dark Mode'); | 
					
						
							|  |  |  |             $html->assertElementContains('.actions a[href$="/tags"]', 'View Tags'); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-05-12 15:37:28 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-05-08 05:42:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function test_shelves_list_homepage_adheres_to_book_visibility_permissions() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-01-21 19:08:34 +08:00
										 |  |  |         $editor = $this->users->editor(); | 
					
						
							| 
									
										
										
										
											2019-05-08 05:42:12 +08:00
										 |  |  |         setting()->putUser($editor, 'bookshelves_view_type', 'list'); | 
					
						
							|  |  |  |         $this->setSettings(['app-homepage-type' => 'bookshelves']); | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-30 00:31:38 +08:00
										 |  |  |         $shelf = $this->entities->shelf(); | 
					
						
							| 
									
										
										
										
											2019-05-08 05:42:12 +08:00
										 |  |  |         $book = $shelf->books()->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Ensure initially visible
 | 
					
						
							|  |  |  |         $homeVisit = $this->get('/'); | 
					
						
							| 
									
										
										
										
											2022-07-23 22:10:18 +08:00
										 |  |  |         $this->withHtml($homeVisit)->assertElementContains('.content-wrap', $shelf->name); | 
					
						
							|  |  |  |         $this->withHtml($homeVisit)->assertElementContains('.content-wrap', $book->name); | 
					
						
							| 
									
										
										
										
											2019-05-08 05:42:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Ensure book no longer visible without view permission
 | 
					
						
							|  |  |  |         $editor->roles()->detach(); | 
					
						
							| 
									
										
										
										
											2023-01-21 19:08:34 +08:00
										 |  |  |         $this->permissions->grantUserRolePermissions($editor, ['bookshelf-view-all']); | 
					
						
							| 
									
										
										
										
											2019-05-08 05:42:12 +08:00
										 |  |  |         $homeVisit = $this->get('/'); | 
					
						
							| 
									
										
										
										
											2022-07-23 22:10:18 +08:00
										 |  |  |         $this->withHtml($homeVisit)->assertElementContains('.content-wrap', $shelf->name); | 
					
						
							|  |  |  |         $this->withHtml($homeVisit)->assertElementNotContains('.content-wrap', $book->name); | 
					
						
							| 
									
										
										
										
											2019-05-08 05:42:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Ensure is visible again with entity-level view permission
 | 
					
						
							| 
									
										
										
										
											2023-01-21 19:08:34 +08:00
										 |  |  |         $this->permissions->setEntityPermissions($book, ['view'], [$editor->roles()->first()]); | 
					
						
							| 
									
										
										
										
											2019-05-08 05:42:12 +08:00
										 |  |  |         $homeVisit = $this->get('/'); | 
					
						
							| 
									
										
										
										
											2022-07-23 22:10:18 +08:00
										 |  |  |         $this->withHtml($homeVisit)->assertElementContains('.content-wrap', $shelf->name); | 
					
						
							|  |  |  |         $this->withHtml($homeVisit)->assertElementContains('.content-wrap', $book->name); | 
					
						
							| 
									
										
										
										
											2019-05-08 05:42:12 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-04-28 04:05:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function test_new_users_dont_have_any_recently_viewed() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-10-31 04:29:59 +08:00
										 |  |  |         $user = User::factory()->create(); | 
					
						
							| 
									
										
										
										
											2021-04-28 04:05:01 +08:00
										 |  |  |         $viewRole = Role::getRole('Viewer'); | 
					
						
							|  |  |  |         $user->attachRole($viewRole); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $homeVisit = $this->actingAs($user)->get('/'); | 
					
						
							| 
									
										
										
										
											2022-07-23 22:10:18 +08:00
										 |  |  |         $this->withHtml($homeVisit)->assertElementContains('#recently-viewed', 'You have not viewed any pages'); | 
					
						
							| 
									
										
										
										
											2021-04-28 04:05:01 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-08-28 20:55:39 +08:00
										 |  |  | } |