getViewer(); $resp = $this->actingAs($viewer)->get('/'); $resp->assertElementContains('header', 'Shelves'); $viewer->roles()->delete(); $this->giveUserPermissions($viewer); $resp = $this->actingAs($viewer)->get('/'); $resp->assertElementNotContains('header', 'Shelves'); $this->giveUserPermissions($viewer, ['bookshelf-view-all']); $resp = $this->actingAs($viewer)->get('/'); $resp->assertElementContains('header', 'Shelves'); $viewer->roles()->delete(); $this->giveUserPermissions($viewer, ['bookshelf-view-own']); $resp = $this->actingAs($viewer)->get('/'); $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', '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) ]; $resp = $this->asEditor()->post('/shelves', array_merge($shelfInfo, [ 'books' => $booksToInclude->implode('id', ','), 'tags' => [ [ 'name' => 'Test Category', 'value' => 'Test Tag Value', ] ], ])); $resp->assertRedirect(); $editorId = $this->getEditor()->id; $this->assertDatabaseHas('bookshelves', array_merge($shelfInfo, ['created_by' => $editorId, 'updated_by' => $editorId])); $shelf = Bookshelf::where('name', '=', $shelfInfo['name'])->first(); $shelfPage = $this->get($shelf->getUrl()); $shelfPage->assertSee($shelfInfo['name']); $shelfPage->assertSee($shelfInfo['description']); $shelfPage->assertElementContains('.tag-item', 'Test Category'); $shelfPage->assertElementContains('.tag-item', 'Test Tag Value'); $this->assertDatabaseHas('bookshelves_books', ['bookshelf_id' => $shelf->id, 'book_id' => $booksToInclude[0]->id]); $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(); $resp = $this->asEditor()->get($shelf->getUrl()); $resp->assertStatus(200); $resp->assertSeeText($shelf->name); $resp->assertSeeText($shelf->description); foreach ($shelf->books as $book) { $resp->assertSee($book->name); } } public function test_shelf_view_shows_action_buttons() { $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'); $resp = $this->asEditor()->get($shelf->getUrl()); $resp->assertDontSee($shelf->getUrl('/permissions')); } public function test_shelf_edit() { $shelf = Bookshelf::first(); $resp = $this->asEditor()->get($shelf->getUrl('/edit')); $resp->assertSeeText('Edit Bookshelf'); $booksToInclude = Book::take(2)->get(); $shelfInfo = [ 'name' => 'My test book' . Str::random(4), 'description' => 'Test book description ' . Str::random(10) ]; $resp = $this->asEditor()->put($shelf->getUrl(), array_merge($shelfInfo, [ 'books' => $booksToInclude->implode('id', ','), 'tags' => [ [ 'name' => 'Test Category', 'value' => 'Test Tag Value', ] ], ])); $shelf = Bookshelf::find($shelf->id); $resp->assertRedirect($shelf->getUrl()); $this->assertSessionHas('success'); $editorId = $this->getEditor()->id; $this->assertDatabaseHas('bookshelves', array_merge($shelfInfo, ['id' => $shelf->id, 'created_by' => $editorId, 'updated_by' => $editorId])); $shelfPage = $this->get($shelf->getUrl()); $shelfPage->assertSee($shelfInfo['name']); $shelfPage->assertSee($shelfInfo['description']); $shelfPage->assertElementContains('.tag-item', 'Test Category'); $shelfPage->assertElementContains('.tag-item', 'Test Tag Value'); $this->assertDatabaseHas('bookshelves_books', ['bookshelf_id' => $shelf->id, 'book_id' => $booksToInclude[0]->id]); $this->assertDatabaseHas('bookshelves_books', ['bookshelf_id' => $shelf->id, 'book_id' => $booksToInclude[1]->id]); } public function test_shelf_create_new_book() { $shelf = Bookshelf::first(); $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() { $shelf = Bookshelf::first(); $resp = $this->asAdmin()->get($shelf->getUrl('/permissions')); $resp->assertSeeText('Copy Permissions'); $resp->assertSee("action=\"{$shelf->getUrl('/copy-permissions')}\""); $child = $shelf->books()->first(); $editorRole = $this->getEditor()->roles()->first(); $this->assertFalse(boolval($child->restricted), "Child book should not be restricted by default"); $this->assertTrue($child->permissions()->count() === 0, "Child book should have no permissions by default"); $this->setEntityRestrictions($shelf, ['view', 'update'], [$editorRole]); $resp = $this->post($shelf->getUrl('/copy-permissions')); $child = $shelf->books()->first(); $resp->assertRedirect($shelf->getUrl()); $this->assertTrue(boolval($child->restricted), "Child book should now be restricted"); $this->assertTrue($child->permissions()->count() === 2, "Child book should have copied permissions"); $this->assertDatabaseHas('entity_permissions', ['restrictable_id' => $child->id, 'action' => 'view', 'role_id' => $editorRole->id]); $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']); } }