X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/be4f3d62cd37c7b83eb86bbf5fffa00d20acf2ec..refs/pull/5280/head:/tests/HomepageTest.php diff --git a/tests/HomepageTest.php b/tests/HomepageTest.php index 86cae7893..977ae5256 100644 --- a/tests/HomepageTest.php +++ b/tests/HomepageTest.php @@ -1,8 +1,12 @@ -asEditor(); @@ -18,7 +22,7 @@ class HomepageTest extends TestCase $this->asEditor(); $name = 'My custom homepage'; $content = str_repeat('This is the body content of my custom homepage.', 20); - $customPage = $this->newPage(['name' => $name, 'html' => $content]); + $customPage = $this->entities->newPage(['name' => $name, 'html' => $content]); $this->setSettings(['app-homepage' => $customPage->id]); $this->setSettings(['app-homepage-type' => 'page']); @@ -35,11 +39,15 @@ class HomepageTest extends TestCase $this->asEditor(); $name = 'My custom homepage'; $content = str_repeat('This is the body content of my custom homepage.', 20); - $customPage = $this->newPage(['name' => $name, 'html' => $content]); - $this->setSettings(['app-homepage' => $customPage->id]); + $customPage = $this->entities->newPage(['name' => $name, 'html' => $content]); + $this->setSettings([ + 'app-homepage' => $customPage->id, + 'app-homepage-type' => 'page', + ]); $homeVisit = $this->get('/'); $homeVisit->assertSee($name); + $this->withHtml($homeVisit)->assertElementNotExists('#home-default'); $pageDeleteReq = $this->delete($customPage->getUrl()); $pageDeleteReq->assertStatus(302); @@ -52,9 +60,61 @@ class HomepageTest extends TestCase $homeVisit->assertStatus(200); } + 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); + $customPage = $this->entities->newPage(['name' => $name, 'html' => $content]); + $this->setSettings([ + 'app-homepage' => $customPage->id, + 'app-homepage-type' => 'default', + ]); + + $pageDeleteReq = $this->delete($customPage->getUrl()); + $pageDeleteReq->assertStatus(302); + $pageDeleteReq->assertSessionHas('success'); + $pageDeleteReq->assertSessionMissing('error'); + } + + public function test_custom_homepage_cannot_be_deleted_from_parent_deletion() + { + $page = $this->entities->page(); + $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); + } + + public function test_custom_homepage_renders_includes() + { + $this->asEditor(); + $included = $this->entities->page(); + $content = str_repeat('This is the body content of my custom homepage.', 20); + $included->html = $content; + $included->save(); + + $name = 'My custom homepage'; + $customPage = $this->entities->newPage(['name' => $name, 'html' => '{{@' . $included->id . '}}']); + $this->setSettings(['app-homepage' => $customPage->id]); + $this->setSettings(['app-homepage-type' => 'page']); + + $homeVisit = $this->get('/'); + $homeVisit->assertSee($name); + $homeVisit->assertSee($content); + } + public function test_set_book_homepage() { - $editor = $this->getEditor(); + $editor = $this->users->editor(); setting()->putUser($editor, 'books_view_type', 'grid'); $this->setSettings(['app-homepage-type' => 'books']); @@ -62,31 +122,77 @@ class HomepageTest extends TestCase $this->asEditor(); $homeVisit = $this->get('/'); $homeVisit->assertSee('Books'); - $homeVisit->assertSee('book-grid-item grid-card'); + $homeVisit->assertSee('grid-card'); $homeVisit->assertSee('grid-card-content'); $homeVisit->assertSee('grid-card-footer'); $homeVisit->assertSee('featured-image-container'); - - $this->setSettings(['app-homepage-type' => false]); - $this->test_default_homepage_visible(); } public function test_set_bookshelves_homepage() { - $editor = $this->getEditor(); + $editor = $this->users->editor(); setting()->putUser($editor, 'bookshelves_view_type', 'grid'); + $shelf = $this->entities->shelf(); $this->setSettings(['app-homepage-type' => 'bookshelves']); $this->asEditor(); $homeVisit = $this->get('/'); $homeVisit->assertSee('Shelves'); - $homeVisit->assertSee('bookshelf-grid-item grid-card'); $homeVisit->assertSee('grid-card-content'); - $homeVisit->assertSee('grid-card-footer'); $homeVisit->assertSee('featured-image-container'); + $this->withHtml($homeVisit)->assertElementContains('.grid-card', $shelf->name); + } + + public function test_books_and_bookshelves_homepage_has_expected_actions() + { + $this->asEditor(); + + foreach (['bookshelves', 'books'] as $homepageType) { + $this->setSettings(['app-homepage-type' => $homepageType]); + + $html = $this->withHtml($this->get('/')); + $html->assertElementContains('.actions button', 'Dark Mode'); + $html->assertElementContains('.actions a[href$="/tags"]', 'View Tags'); + } + } + + public function test_shelves_list_homepage_adheres_to_book_visibility_permissions() + { + $editor = $this->users->editor(); + setting()->putUser($editor, 'bookshelves_view_type', 'list'); + $this->setSettings(['app-homepage-type' => 'bookshelves']); + $this->asEditor(); + + $shelf = $this->entities->shelf(); + $book = $shelf->books()->first(); + + // Ensure initially visible + $homeVisit = $this->get('/'); + $this->withHtml($homeVisit)->assertElementContains('.content-wrap', $shelf->name); + $this->withHtml($homeVisit)->assertElementContains('.content-wrap', $book->name); + + // Ensure book no longer visible without view permission + $editor->roles()->detach(); + $this->permissions->grantUserRolePermissions($editor, ['bookshelf-view-all']); + $homeVisit = $this->get('/'); + $this->withHtml($homeVisit)->assertElementContains('.content-wrap', $shelf->name); + $this->withHtml($homeVisit)->assertElementNotContains('.content-wrap', $book->name); + + // Ensure is visible again with entity-level view permission + $this->permissions->setEntityPermissions($book, ['view'], [$editor->roles()->first()]); + $homeVisit = $this->get('/'); + $this->withHtml($homeVisit)->assertElementContains('.content-wrap', $shelf->name); + $this->withHtml($homeVisit)->assertElementContains('.content-wrap', $book->name); + } + + public function test_new_users_dont_have_any_recently_viewed() + { + $user = User::factory()->create(); + $viewRole = Role::getRole('Viewer'); + $user->attachRole($viewRole); - $this->setSettings(['app-homepage-type' => false]); - $this->test_default_homepage_visible(); + $homeVisit = $this->actingAs($user)->get('/'); + $this->withHtml($homeVisit)->assertElementContains('#recently-viewed', 'You have not viewed any pages'); } }