X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/be4f3d62cd37c7b83eb86bbf5fffa00d20acf2ec..refs/pull/2393/head:/tests/Entity/BookShelfTest.php diff --git a/tests/Entity/BookShelfTest.php b/tests/Entity/BookShelfTest.php index 9071e3c06..9b3290370 100644 --- a/tests/Entity/BookShelfTest.php +++ b/tests/Entity/BookShelfTest.php @@ -1,11 +1,18 @@ -getViewer(); @@ -27,18 +34,53 @@ class BookShelfTest extends TestCase $resp->assertElementContains('header', 'Shelves'); } + public function test_shelves_shows_in_header_if_have_any_shelve_view_permission() + { + $user = factory(User::class)->create(); + $this->giveUserPermissions($user, ['image-create-all']); + $shelf = Bookshelf::first(); + $userRole = $user->roles()->first(); + + $resp = $this->actingAs($user)->get('/'); + $resp->assertElementNotContains('header', 'Shelves'); + + $this->setEntityRestrictions($shelf, ['view'], [$userRole]); + + $resp = $this->get('/'); + $resp->assertElementContains('header', 'Shelves'); + } + public function test_shelves_page_contains_create_link() { $resp = $this->asEditor()->get('/shelves'); - $resp->assertElementContains('a', 'Create New Shelf'); + $resp->assertElementContains('a', 'New Shelf'); + } + + public function test_book_not_visible_in_shelf_list_view_if_user_cant_view_shelf() + { + config()->set([ + 'app.views.bookshelves' => 'list', + ]); + $shelf = Bookshelf::query()->first(); + $book = $shelf->books()->first(); + + $resp = $this->asEditor()->get('/shelves'); + $resp->assertSee($book->name); + $resp->assertSee($book->getUrl()); + + $this->setEntityRestrictions($book, []); + + $resp = $this->asEditor()->get('/shelves'); + $resp->assertDontSee($book->name); + $resp->assertDontSee($book->getUrl()); } public function test_shelves_create() { $booksToInclude = Book::take(2)->get(); $shelfInfo = [ - 'name' => 'My test book' . str_random(4), - 'description' => 'Test book description ' . str_random(10) + 'name' => 'My test book' . Str::random(4), + 'description' => 'Test book description ' . Str::random(10) ]; $resp = $this->asEditor()->post('/shelves', array_merge($shelfInfo, [ 'books' => $booksToInclude->implode('id', ','), @@ -64,6 +106,26 @@ class BookShelfTest extends TestCase $this->assertDatabaseHas('bookshelves_books', ['bookshelf_id' => $shelf->id, 'book_id' => $booksToInclude[1]->id]); } + public function test_shelves_create_sets_cover_image() + { + $shelfInfo = [ + 'name' => 'My test book' . Str::random(4), + 'description' => 'Test book description ' . Str::random(10) + ]; + + $imageFile = $this->getTestImage('shelf-test.png'); + $resp = $this->asEditor()->call('POST', '/shelves', $shelfInfo, [], ['image' => $imageFile]); + $resp->assertRedirect(); + + $lastImage = Image::query()->orderByDesc('id')->firstOrFail(); + $shelf = Bookshelf::query()->where('name', '=', $shelfInfo['name'])->first(); + $this->assertDatabaseHas('bookshelves', [ + 'id' => $shelf->id, + 'image_id' => $lastImage->id, + ]); + $this->assertEquals($lastImage->id, $shelf->cover->id); + } + public function test_shelf_view() { $shelf = Bookshelf::first(); @@ -81,9 +143,11 @@ class BookShelfTest extends TestCase { $shelf = Bookshelf::first(); $resp = $this->asAdmin()->get($shelf->getUrl()); + $resp->assertSee($shelf->getUrl('/create-book')); $resp->assertSee($shelf->getUrl('/edit')); $resp->assertSee($shelf->getUrl('/permissions')); $resp->assertSee($shelf->getUrl('/delete')); + $resp->assertElementContains('a', 'New Book'); $resp->assertElementContains('a', 'Edit'); $resp->assertElementContains('a', 'Permissions'); $resp->assertElementContains('a', 'Delete'); @@ -100,8 +164,8 @@ class BookShelfTest extends TestCase $booksToInclude = Book::take(2)->get(); $shelfInfo = [ - 'name' => 'My test book' . str_random(4), - 'description' => 'Test book description ' . str_random(10) + 'name' => 'My test book' . Str::random(4), + 'description' => 'Test book description ' . Str::random(10) ]; $resp = $this->asEditor()->put($shelf->getUrl(), array_merge($shelfInfo, [ @@ -130,18 +194,53 @@ class BookShelfTest extends TestCase $this->assertDatabaseHas('bookshelves_books', ['bookshelf_id' => $shelf->id, 'book_id' => $booksToInclude[1]->id]); } - public function test_shelf_delete() + public function test_shelf_create_new_book() { $shelf = Bookshelf::first(); - $resp = $this->asEditor()->get($shelf->getUrl('/delete')); - $resp->assertSeeText('Delete Bookshelf'); - $resp->assertSee("action=\"{$shelf->getUrl()}\""); - - $resp = $this->delete($shelf->getUrl()); - $resp->assertRedirect('/shelves'); - $this->assertDatabaseMissing('bookshelves', ['id' => $shelf->id]); - $this->assertDatabaseMissing('bookshelves_books', ['bookshelf_id' => $shelf->id]); - $this->assertSessionHas('success'); + $resp = $this->asEditor()->get($shelf->getUrl('/create-book')); + + $resp->assertSee('Create New Book'); + $resp->assertSee($shelf->getShortName()); + + $testName = 'Test Book in Shelf Name'; + + $createBookResp = $this->asEditor()->post($shelf->getUrl('/create-book'), [ + 'name' => $testName, + 'description' => 'Book in shelf description' + ]); + $createBookResp->assertRedirect(); + + $newBook = Book::query()->orderBy('id', 'desc')->first(); + $this->assertDatabaseHas('bookshelves_books', [ + 'bookshelf_id' => $shelf->id, + 'book_id' => $newBook->id, + ]); + + $resp = $this->asEditor()->get($shelf->getUrl()); + $resp->assertSee($testName); + } + + public function test_shelf_delete() + { + $shelf = Bookshelf::query()->whereHas('books')->first(); + $this->assertNull($shelf->deleted_at); + $bookCount = $shelf->books()->count(); + + $deleteViewReq = $this->asEditor()->get($shelf->getUrl('/delete')); + $deleteViewReq->assertSeeText('Are you sure you want to delete this bookshelf?'); + + $deleteReq = $this->delete($shelf->getUrl()); + $deleteReq->assertRedirect(url('/shelves')); + $this->assertActivityExists('bookshelf_delete', $shelf); + + $shelf->refresh(); + $this->assertNotNull($shelf->deleted_at); + + $this->assertTrue($shelf->books()->count() === $bookCount); + $this->assertTrue($shelf->deletions()->count() === 1); + + $redirectReq = $this->get($deleteReq->baseResponse->headers->get('location')); + $redirectReq->assertNotificationContains('Bookshelf Successfully Deleted'); } public function test_shelf_copy_permissions() @@ -167,4 +266,58 @@ class BookShelfTest extends TestCase $this->assertDatabaseHas('entity_permissions', ['restrictable_id' => $child->id, 'action' => 'update', 'role_id' => $editorRole->id]); } + public function test_bookshelves_show_in_breadcrumbs_if_in_context() + { + $shelf = Bookshelf::first(); + $shelfBook = $shelf->books()->first(); + $shelfPage = $shelfBook->pages()->first(); + $this->asAdmin(); + + $bookVisit = $this->get($shelfBook->getUrl()); + $bookVisit->assertElementNotContains('.breadcrumbs', 'Shelves'); + $bookVisit->assertElementNotContains('.breadcrumbs', $shelf->getShortName()); + + $this->get($shelf->getUrl()); + $bookVisit = $this->get($shelfBook->getUrl()); + $bookVisit->assertElementContains('.breadcrumbs', 'Shelves'); + $bookVisit->assertElementContains('.breadcrumbs', $shelf->getShortName()); + + $pageVisit = $this->get($shelfPage->getUrl()); + $pageVisit->assertElementContains('.breadcrumbs', 'Shelves'); + $pageVisit->assertElementContains('.breadcrumbs', $shelf->getShortName()); + + $this->get('/books'); + $pageVisit = $this->get($shelfPage->getUrl()); + $pageVisit->assertElementNotContains('.breadcrumbs', 'Shelves'); + $pageVisit->assertElementNotContains('.breadcrumbs', $shelf->getShortName()); + } + + public function test_bookshelves_show_on_book() + { + // Create shelf + $shelfInfo = [ + 'name' => 'My test shelf' . Str::random(4), + 'description' => 'Test shelf description ' . Str::random(10) + ]; + + $this->asEditor()->post('/shelves', $shelfInfo); + $shelf = Bookshelf::where('name', '=', $shelfInfo['name'])->first(); + + // Create book and add to shelf + $this->asEditor()->post($shelf->getUrl('/create-book'), [ + 'name' => 'Test book name', + 'description' => 'Book in shelf description' + ]); + + $newBook = Book::query()->orderBy('id', 'desc')->first(); + + $resp = $this->asEditor()->get($newBook->getUrl()); + $resp->assertElementContains('.tri-layout-left-contents', $shelfInfo['name']); + + // Remove shelf + $this->delete($shelf->getUrl()); + + $resp = $this->asEditor()->get($newBook->getUrl()); + $resp->assertDontSee($shelfInfo['name']); + } }