-<?php namespace Tests\Entity;
+<?php
+
+namespace Tests\Entity;
use BookStack\Auth\User;
use BookStack\Entities\Models\Book;
class BookShelfTest extends TestCase
{
-
use UsesImages;
public function test_shelves_shows_in_header_if_have_view_permissions()
public function test_book_not_visible_in_shelf_list_view_if_user_cant_view_shelf()
{
config()->set([
- 'app.views.bookshelves' => 'list',
+ 'setting-defaults.user.bookshelves_view_type' => 'list',
]);
$shelf = Bookshelf::query()->first();
$book = $shelf->books()->first();
{
$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', ','),
- 'tags' => [
+ 'tags' => [
[
- 'name' => 'Test Category',
+ 'name' => 'Test Category',
'value' => 'Test Tag Value',
- ]
+ ],
],
]));
$resp->assertRedirect();
public function test_shelves_create_sets_cover_image()
{
$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),
];
$imageFile = $this->getTestImage('shelf-test.png');
$lastImage = Image::query()->orderByDesc('id')->firstOrFail();
$shelf = Bookshelf::query()->where('name', '=', $shelfInfo['name'])->first();
$this->assertDatabaseHas('bookshelves', [
- 'id' => $shelf->id,
+ 'id' => $shelf->id,
'image_id' => $lastImage->id,
]);
$this->assertEquals($lastImage->id, $shelf->cover->id);
$resp->assertDontSee($shelf->getUrl('/permissions'));
}
+ public function test_shelf_view_has_sort_control_that_defaults_to_default()
+ {
+ $shelf = Bookshelf::query()->first();
+ $resp = $this->asAdmin()->get($shelf->getUrl());
+ $resp->assertElementExists('form[action$="change-sort/shelf_books"]');
+ $resp->assertElementContains('form[action$="change-sort/shelf_books"] [aria-haspopup="true"]', 'Default');
+ }
+
+ public function test_shelf_view_sort_takes_action()
+ {
+ $shelf = Bookshelf::query()->whereHas('books')->with('books')->first();
+ $books = Book::query()->take(3)->get(['id', 'name']);
+ $books[0]->fill(['name' => 'bsfsdfsdfsd'])->save();
+ $books[1]->fill(['name' => 'adsfsdfsdfsd'])->save();
+ $books[2]->fill(['name' => 'hdgfgdfg'])->save();
+
+ // Set book ordering
+ $this->asAdmin()->put($shelf->getUrl(), [
+ 'books' => $books->implode('id', ','),
+ 'tags' => [], 'description' => 'abc', 'name' => 'abc',
+ ]);
+ $this->assertEquals(3, $shelf->books()->count());
+ $shelf->refresh();
+
+ $resp = $this->asEditor()->get($shelf->getUrl());
+ $resp->assertElementContains('.book-content a.grid-card', $books[0]->name, 1);
+ $resp->assertElementNotContains('.book-content a.grid-card', $books[0]->name, 3);
+
+ setting()->putUser($this->getEditor(), 'shelf_books_sort_order', 'desc');
+ $resp = $this->asEditor()->get($shelf->getUrl());
+ $resp->assertElementNotContains('.book-content a.grid-card', $books[0]->name, 1);
+ $resp->assertElementContains('.book-content a.grid-card', $books[0]->name, 3);
+
+ setting()->putUser($this->getEditor(), 'shelf_books_sort_order', 'desc');
+ setting()->putUser($this->getEditor(), 'shelf_books_sort', 'name');
+ $resp = $this->asEditor()->get($shelf->getUrl());
+ $resp->assertElementContains('.book-content a.grid-card', 'hdgfgdfg', 1);
+ $resp->assertElementContains('.book-content a.grid-card', 'bsfsdfsdfsd', 2);
+ $resp->assertElementContains('.book-content a.grid-card', 'adsfsdfsdfsd', 3);
+ }
+
public function test_shelf_edit()
{
$shelf = Bookshelf::first();
$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, [
'books' => $booksToInclude->implode('id', ','),
- 'tags' => [
+ 'tags' => [
[
- 'name' => 'Test Category',
+ 'name' => 'Test Category',
'value' => 'Test Tag Value',
- ]
+ ],
],
]));
$shelf = Bookshelf::find($shelf->id);
$testName = 'Test Book in Shelf Name';
$createBookResp = $this->asEditor()->post($shelf->getUrl('/create-book'), [
- 'name' => $testName,
- 'description' => 'Book in shelf description'
+ '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,
+ 'book_id' => $newBook->id,
]);
$resp = $this->asEditor()->get($shelf->getUrl());
$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->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->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_permission_page_has_a_warning_about_no_cascading()
+ {
+ $shelf = Bookshelf::first();
+ $resp = $this->asAdmin()->get($shelf->getUrl('/permissions'));
+ $resp->assertSeeText('Permissions on bookshelves do not automatically cascade to contained books.');
+ }
+
public function test_bookshelves_show_in_breadcrumbs_if_in_context()
{
$shelf = Bookshelf::first();
{
// Create shelf
$shelfInfo = [
- 'name' => 'My test shelf' . Str::random(4),
- 'description' => 'Test shelf description ' . Str::random(10)
+ 'name' => 'My test shelf' . Str::random(4),
+ 'description' => 'Test shelf description ' . Str::random(10),
];
$this->asEditor()->post('/shelves', $shelfInfo);
// Create book and add to shelf
$this->asEditor()->post($shelf->getUrl('/create-book'), [
- 'name' => 'Test book name',
- 'description' => 'Book in shelf description'
+ 'name' => 'Test book name',
+ 'description' => 'Book in shelf description',
]);
$newBook = Book::query()->orderBy('id', 'desc')->first();
$resp = $this->asEditor()->get($newBook->getUrl());
$resp->assertDontSee($shelfInfo['name']);
}
+
+ public function test_cancel_on_child_book_creation_returns_to_original_shelf()
+ {
+ /** @var Bookshelf $shelf */
+ $shelf = Bookshelf::query()->first();
+ $resp = $this->asEditor()->get($shelf->getUrl('/create-book'));
+ $resp->assertElementContains('form a[href="' . $shelf->getUrl() . '"]', 'Cancel');
+ }
}