1
0
mirror of https://github.com/BookStackApp/BookStack.git synced 2024-11-23 11:22:33 +01:00

Converted some tests from BrowserKit, Updated shared helpers

This commit is contained in:
Dan Brown 2021-03-03 22:11:00 +00:00
parent 382f155f76
commit 4d4a57d1bf
7 changed files with 170 additions and 192 deletions

View File

@ -30,6 +30,7 @@ use Illuminate\Support\Collection;
* @property int $image_id
* @property string $external_auth_id
* @property string $system_name
* @property Collection $roles
*/
class User extends Model implements AuthenticatableContract, CanResetPasswordContract, Loggable
{

View File

@ -18,13 +18,15 @@ class UserInviteTest extends TestCase
Notification::fake();
$admin = $this->getAdmin();
$this->actingAs($admin)->post('/settings/users/create', [
$email = Str::random(16) . '@example.com';
$resp = $this->actingAs($admin)->post('/settings/users/create', [
'name' => 'Barry',
'email' => 'tester@example.com',
'email' => $email,
'send_invite' => 'true',
]);
$resp->assertRedirect('/settings/users');
$newUser = User::query()->where('email', '=', 'tester@example.com')->orderBy('id', 'desc')->first();
$newUser = User::query()->where('email', '=', $email)->orderBy('id', 'desc')->first();
Notification::assertSentTo($newUser, UserInvite::class);
$this->assertDatabaseHas('user_invites', [

View File

@ -4,7 +4,6 @@ use BookStack\Auth\User;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Entity;
use BookStack\Auth\Role;
use BookStack\Auth\Permissions\PermissionService;
use BookStack\Entities\Models\Page;
use BookStack\Settings\SettingService;

View File

@ -91,19 +91,19 @@ class SortTest extends TestCase
public function test_page_move_requires_create_permissions_on_parent()
{
$page = Page::first();
$page = Page::query()->first();
$currentBook = $page->book;
$newBook = Book::where('id', '!=', $currentBook->id)->first();
$newBook = Book::query()->where('id', '!=', $currentBook->id)->first();
$editor = $this->getEditor();
$this->setEntityRestrictions($newBook, ['view', 'update', 'delete'], $editor->roles);
$this->setEntityRestrictions($newBook, ['view', 'update', 'delete'], $editor->roles->all());
$movePageResp = $this->actingAs($editor)->put($page->getUrl('/move'), [
'entity_selection' => 'book:' . $newBook->id
]);
$this->assertPermissionError($movePageResp);
$this->setEntityRestrictions($newBook, ['view', 'update', 'delete', 'create'], $editor->roles);
$this->setEntityRestrictions($newBook, ['view', 'update', 'delete', 'create'], $editor->roles->all());
$movePageResp = $this->put($page->getUrl('/move'), [
'entity_selection' => 'book:' . $newBook->id
]);
@ -121,8 +121,8 @@ class SortTest extends TestCase
$newBook = Book::where('id', '!=', $currentBook->id)->first();
$editor = $this->getEditor();
$this->setEntityRestrictions($newBook, ['view', 'update', 'create', 'delete'], $editor->roles);
$this->setEntityRestrictions($page, ['view', 'update', 'create'], $editor->roles);
$this->setEntityRestrictions($newBook, ['view', 'update', 'create', 'delete'], $editor->roles->all());
$this->setEntityRestrictions($page, ['view', 'update', 'create'], $editor->roles->all());
$movePageResp = $this->actingAs($editor)->put($page->getUrl('/move'), [
'entity_selection' => 'book:' . $newBook->id
@ -131,7 +131,7 @@ class SortTest extends TestCase
$pageView = $this->get($page->getUrl());
$pageView->assertDontSee($page->getUrl('/move'));
$this->setEntityRestrictions($page, ['view', 'update', 'create', 'delete'], $editor->roles);
$this->setEntityRestrictions($page, ['view', 'update', 'create', 'delete'], $editor->roles->all());
$movePageResp = $this->put($page->getUrl('/move'), [
'entity_selection' => 'book:' . $newBook->id
]);
@ -176,8 +176,8 @@ class SortTest extends TestCase
$newBook = Book::where('id', '!=', $currentBook->id)->first();
$editor = $this->getEditor();
$this->setEntityRestrictions($newBook, ['view', 'update', 'create', 'delete'], $editor->roles);
$this->setEntityRestrictions($chapter, ['view', 'update', 'create'], $editor->roles);
$this->setEntityRestrictions($newBook, ['view', 'update', 'create', 'delete'], $editor->roles->all());
$this->setEntityRestrictions($chapter, ['view', 'update', 'create'], $editor->roles->all());
$moveChapterResp = $this->actingAs($editor)->put($chapter->getUrl('/move'), [
'entity_selection' => 'book:' . $newBook->id
@ -186,7 +186,7 @@ class SortTest extends TestCase
$pageView = $this->get($chapter->getUrl());
$pageView->assertDontSee($chapter->getUrl('/move'));
$this->setEntityRestrictions($chapter, ['view', 'update', 'create', 'delete'], $editor->roles);
$this->setEntityRestrictions($chapter, ['view', 'update', 'create', 'delete'], $editor->roles->all());
$moveChapterResp = $this->put($chapter->getUrl('/move'), [
'entity_selection' => 'book:' . $newBook->id
]);

View File

@ -29,13 +29,13 @@ class EntityPermissionsTest extends BrowserKitTest
$this->viewer = $this->getViewer();
}
protected function setEntityRestrictions(Entity $entity, $actions = [], $roles = [])
protected function setRestrictionsForTestRoles(Entity $entity, array $actions = [])
{
$roles = [
$this->user->roles->first(),
$this->viewer->roles->first(),
];
parent::setEntityRestrictions($entity, $actions, $roles);
$this->setEntityRestrictions($entity, $actions, $roles);
}
public function test_bookshelf_view_restriction()
@ -46,12 +46,12 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($shelf->getUrl())
->seePageIs($shelf->getUrl());
$this->setEntityRestrictions($shelf, []);
$this->setRestrictionsForTestRoles($shelf, []);
$this->forceVisit($shelf->getUrl())
->see('Bookshelf not found');
$this->setEntityRestrictions($shelf, ['view']);
$this->setRestrictionsForTestRoles($shelf, ['view']);
$this->visit($shelf->getUrl())
->see($shelf->name);
@ -65,12 +65,12 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($shelf->getUrl('/edit'))
->see('Edit Book');
$this->setEntityRestrictions($shelf, ['view', 'delete']);
$this->setRestrictionsForTestRoles($shelf, ['view', 'delete']);
$this->forceVisit($shelf->getUrl('/edit'))
->see('You do not have permission')->seePageIs('/');
$this->setEntityRestrictions($shelf, ['view', 'update']);
$this->setRestrictionsForTestRoles($shelf, ['view', 'update']);
$this->visit($shelf->getUrl('/edit'))
->seePageIs($shelf->getUrl('/edit'));
@ -84,12 +84,12 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($shelf->getUrl('/delete'))
->see('Delete Book');
$this->setEntityRestrictions($shelf, ['view', 'update']);
$this->setRestrictionsForTestRoles($shelf, ['view', 'update']);
$this->forceVisit($shelf->getUrl('/delete'))
->see('You do not have permission')->seePageIs('/');
$this->setEntityRestrictions($shelf, ['view', 'delete']);
$this->setRestrictionsForTestRoles($shelf, ['view', 'delete']);
$this->visit($shelf->getUrl('/delete'))
->seePageIs($shelf->getUrl('/delete'))->see('Delete Book');
@ -106,7 +106,7 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($bookUrl)
->seePageIs($bookUrl);
$this->setEntityRestrictions($book, []);
$this->setRestrictionsForTestRoles($book, []);
$this->forceVisit($bookUrl)
->see('Book not found');
@ -115,7 +115,7 @@ class EntityPermissionsTest extends BrowserKitTest
$this->forceVisit($bookChapter->getUrl())
->see('Chapter not found');
$this->setEntityRestrictions($book, ['view']);
$this->setRestrictionsForTestRoles($book, ['view']);
$this->visit($bookUrl)
->see($book->name);
@ -139,7 +139,7 @@ class EntityPermissionsTest extends BrowserKitTest
->seeInElement('.actions', 'New Page')
->seeInElement('.actions', 'New Chapter');
$this->setEntityRestrictions($book, ['view', 'delete', 'update']);
$this->setRestrictionsForTestRoles($book, ['view', 'delete', 'update']);
$this->forceVisit($bookUrl . '/create-chapter')
->see('You do not have permission')->seePageIs('/');
@ -148,7 +148,7 @@ class EntityPermissionsTest extends BrowserKitTest
$this->visit($bookUrl)->dontSeeInElement('.actions', 'New Page')
->dontSeeInElement('.actions', 'New Chapter');
$this->setEntityRestrictions($book, ['view', 'create']);
$this->setRestrictionsForTestRoles($book, ['view', 'create']);
$this->visit($bookUrl . '/create-chapter')
->type('test chapter', 'name')
@ -175,7 +175,7 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($bookUrl . '/edit')
->see('Edit Book');
$this->setEntityRestrictions($book, ['view', 'delete']);
$this->setRestrictionsForTestRoles($book, ['view', 'delete']);
$this->forceVisit($bookUrl . '/edit')
->see('You do not have permission')->seePageIs('/');
@ -184,7 +184,7 @@ class EntityPermissionsTest extends BrowserKitTest
$this->forceVisit($bookChapter->getUrl() . '/edit')
->see('You do not have permission')->seePageIs('/');
$this->setEntityRestrictions($book, ['view', 'update']);
$this->setRestrictionsForTestRoles($book, ['view', 'update']);
$this->visit($bookUrl . '/edit')
->seePageIs($bookUrl . '/edit');
@ -205,7 +205,7 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($bookUrl . '/delete')
->see('Delete Book');
$this->setEntityRestrictions($book, ['view', 'update']);
$this->setRestrictionsForTestRoles($book, ['view', 'update']);
$this->forceVisit($bookUrl . '/delete')
->see('You do not have permission')->seePageIs('/');
@ -214,7 +214,7 @@ class EntityPermissionsTest extends BrowserKitTest
$this->forceVisit($bookChapter->getUrl() . '/delete')
->see('You do not have permission')->seePageIs('/');
$this->setEntityRestrictions($book, ['view', 'delete']);
$this->setRestrictionsForTestRoles($book, ['view', 'delete']);
$this->visit($bookUrl . '/delete')
->seePageIs($bookUrl . '/delete')->see('Delete Book');
@ -234,14 +234,14 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($chapterUrl)
->seePageIs($chapterUrl);
$this->setEntityRestrictions($chapter, []);
$this->setRestrictionsForTestRoles($chapter, []);
$this->forceVisit($chapterUrl)
->see('Chapter not found');
$this->forceVisit($chapterPage->getUrl())
->see('Page not found');
$this->setEntityRestrictions($chapter, ['view']);
$this->setRestrictionsForTestRoles($chapter, ['view']);
$this->visit($chapterUrl)
->see($chapter->name);
@ -258,13 +258,13 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($chapterUrl)
->seeInElement('.actions', 'New Page');
$this->setEntityRestrictions($chapter, ['view', 'delete', 'update']);
$this->setRestrictionsForTestRoles($chapter, ['view', 'delete', 'update']);
$this->forceVisit($chapterUrl . '/create-page')
->see('You do not have permission')->seePageIs('/');
$this->visit($chapterUrl)->dontSeeInElement('.actions', 'New Page');
$this->setEntityRestrictions($chapter, ['view', 'create']);
$this->setRestrictionsForTestRoles($chapter, ['view', 'create']);
$this->visit($chapterUrl . '/create-page')
@ -286,14 +286,14 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($chapterUrl . '/edit')
->see('Edit Chapter');
$this->setEntityRestrictions($chapter, ['view', 'delete']);
$this->setRestrictionsForTestRoles($chapter, ['view', 'delete']);
$this->forceVisit($chapterUrl . '/edit')
->see('You do not have permission')->seePageIs('/');
$this->forceVisit($chapterPage->getUrl() . '/edit')
->see('You do not have permission')->seePageIs('/');
$this->setEntityRestrictions($chapter, ['view', 'update']);
$this->setRestrictionsForTestRoles($chapter, ['view', 'update']);
$this->visit($chapterUrl . '/edit')
->seePageIs($chapterUrl . '/edit')->see('Edit Chapter');
@ -311,14 +311,14 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($chapterUrl . '/delete')
->see('Delete Chapter');
$this->setEntityRestrictions($chapter, ['view', 'update']);
$this->setRestrictionsForTestRoles($chapter, ['view', 'update']);
$this->forceVisit($chapterUrl . '/delete')
->see('You do not have permission')->seePageIs('/');
$this->forceVisit($chapterPage->getUrl() . '/delete')
->see('You do not have permission')->seePageIs('/');
$this->setEntityRestrictions($chapter, ['view', 'delete']);
$this->setRestrictionsForTestRoles($chapter, ['view', 'delete']);
$this->visit($chapterUrl . '/delete')
->seePageIs($chapterUrl . '/delete')->see('Delete Chapter');
@ -335,12 +335,12 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($pageUrl)
->seePageIs($pageUrl);
$this->setEntityRestrictions($page, ['update', 'delete']);
$this->setRestrictionsForTestRoles($page, ['update', 'delete']);
$this->forceVisit($pageUrl)
->see('Page not found');
$this->setEntityRestrictions($page, ['view']);
$this->setRestrictionsForTestRoles($page, ['view']);
$this->visit($pageUrl)
->see($page->name);
@ -355,12 +355,12 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($pageUrl . '/edit')
->seeInField('name', $page->name);
$this->setEntityRestrictions($page, ['view', 'delete']);
$this->setRestrictionsForTestRoles($page, ['view', 'delete']);
$this->forceVisit($pageUrl . '/edit')
->see('You do not have permission')->seePageIs('/');
$this->setEntityRestrictions($page, ['view', 'update']);
$this->setRestrictionsForTestRoles($page, ['view', 'update']);
$this->visit($pageUrl . '/edit')
->seePageIs($pageUrl . '/edit')->seeInField('name', $page->name);
@ -375,12 +375,12 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($pageUrl . '/delete')
->see('Delete Page');
$this->setEntityRestrictions($page, ['view', 'update']);
$this->setRestrictionsForTestRoles($page, ['view', 'update']);
$this->forceVisit($pageUrl . '/delete')
->see('You do not have permission')->seePageIs('/');
$this->setEntityRestrictions($page, ['view', 'delete']);
$this->setRestrictionsForTestRoles($page, ['view', 'delete']);
$this->visit($pageUrl . '/delete')
->seePageIs($pageUrl . '/delete')->see('Delete Page');
@ -460,7 +460,7 @@ class EntityPermissionsTest extends BrowserKitTest
$page = $chapter->pages->first();
$page2 = $chapter->pages[2];
$this->setEntityRestrictions($page, []);
$this->setRestrictionsForTestRoles($page, []);
$this->actingAs($this->user)
->visit($page2->getUrl())
@ -472,7 +472,7 @@ class EntityPermissionsTest extends BrowserKitTest
$chapter = Chapter::first();
$page = $chapter->pages->first();
$this->setEntityRestrictions($page, []);
$this->setRestrictionsForTestRoles($page, []);
$this->actingAs($this->user)
->visit($chapter->getUrl())
@ -484,7 +484,7 @@ class EntityPermissionsTest extends BrowserKitTest
$chapter = Chapter::first();
$page = $chapter->pages->first();
$this->setEntityRestrictions($page, []);
$this->setRestrictionsForTestRoles($page, []);
$this->actingAs($this->user)
->visit($chapter->getUrl())
@ -499,7 +499,7 @@ class EntityPermissionsTest extends BrowserKitTest
->see($chapter->pages->first()->name);
foreach ($chapter->pages as $page) {
$this->setEntityRestrictions($page, []);
$this->setRestrictionsForTestRoles($page, []);
}
$this->actingAs($this->user)
@ -515,12 +515,12 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($shelf->getUrl('/edit'))
->dontSee('Edit Book');
$this->setEntityRestrictions($shelf, ['view', 'delete']);
$this->setRestrictionsForTestRoles($shelf, ['view', 'delete']);
$this->forceVisit($shelf->getUrl('/edit'))
->see('You do not have permission')->seePageIs('/');
$this->setEntityRestrictions($shelf, ['view', 'update']);
$this->setRestrictionsForTestRoles($shelf, ['view', 'update']);
$this->visit($shelf->getUrl('/edit'))
->seePageIs($shelf->getUrl('/edit'));
@ -534,12 +534,12 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($shelf->getUrl('/delete'))
->dontSee('Delete Book');
$this->setEntityRestrictions($shelf, ['view', 'update']);
$this->setRestrictionsForTestRoles($shelf, ['view', 'update']);
$this->forceVisit($shelf->getUrl('/delete'))
->see('You do not have permission')->seePageIs('/');
$this->setEntityRestrictions($shelf, ['view', 'delete']);
$this->setRestrictionsForTestRoles($shelf, ['view', 'delete']);
$this->visit($shelf->getUrl('/delete'))
->seePageIs($shelf->getUrl('/delete'))->see('Delete Book');
@ -555,7 +555,7 @@ class EntityPermissionsTest extends BrowserKitTest
->dontSeeInElement('.actions', 'New Page')
->dontSeeInElement('.actions', 'New Chapter');
$this->setEntityRestrictions($book, ['view', 'delete', 'update']);
$this->setRestrictionsForTestRoles($book, ['view', 'delete', 'update']);
$this->forceVisit($bookUrl . '/create-chapter')
->see('You do not have permission')->seePageIs('/');
@ -564,7 +564,7 @@ class EntityPermissionsTest extends BrowserKitTest
$this->visit($bookUrl)->dontSeeInElement('.actions', 'New Page')
->dontSeeInElement('.actions', 'New Chapter');
$this->setEntityRestrictions($book, ['view', 'create']);
$this->setRestrictionsForTestRoles($book, ['view', 'create']);
$this->visit($bookUrl . '/create-chapter')
->type('test chapter', 'name')
@ -591,7 +591,7 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($bookUrl . '/edit')
->dontSee('Edit Book');
$this->setEntityRestrictions($book, ['view', 'delete']);
$this->setRestrictionsForTestRoles($book, ['view', 'delete']);
$this->forceVisit($bookUrl . '/edit')
->see('You do not have permission')->seePageIs('/');
@ -600,7 +600,7 @@ class EntityPermissionsTest extends BrowserKitTest
$this->forceVisit($bookChapter->getUrl() . '/edit')
->see('You do not have permission')->seePageIs('/');
$this->setEntityRestrictions($book, ['view', 'update']);
$this->setRestrictionsForTestRoles($book, ['view', 'update']);
$this->visit($bookUrl . '/edit')
->seePageIs($bookUrl . '/edit');
@ -621,7 +621,7 @@ class EntityPermissionsTest extends BrowserKitTest
->visit($bookUrl . '/delete')
->dontSee('Delete Book');
$this->setEntityRestrictions($book, ['view', 'update']);
$this->setRestrictionsForTestRoles($book, ['view', 'update']);
$this->forceVisit($bookUrl . '/delete')
->see('You do not have permission')->seePageIs('/');
@ -630,7 +630,7 @@ class EntityPermissionsTest extends BrowserKitTest
$this->forceVisit($bookChapter->getUrl() . '/delete')
->see('You do not have permission')->seePageIs('/');
$this->setEntityRestrictions($book, ['view', 'delete']);
$this->setRestrictionsForTestRoles($book, ['view', 'delete']);
$this->visit($bookUrl . '/delete')
->seePageIs($bookUrl . '/delete')->see('Delete Book');
@ -651,8 +651,8 @@ class EntityPermissionsTest extends BrowserKitTest
$entity->save();
}
$this->setEntityRestrictions($book, []);
$this->setEntityRestrictions($bookPage, ['view']);
$this->setRestrictionsForTestRoles($book, []);
$this->setRestrictionsForTestRoles($bookPage, ['view']);
$this->actingAs($this->viewer);
$this->get($bookPage->getUrl());
@ -667,8 +667,8 @@ class EntityPermissionsTest extends BrowserKitTest
$firstBook = Book::first();
$secondBook = Book::find(2);
$this->setEntityRestrictions($firstBook, ['view', 'update']);
$this->setEntityRestrictions($secondBook, ['view']);
$this->setRestrictionsForTestRoles($firstBook, ['view', 'update']);
$this->setRestrictionsForTestRoles($secondBook, ['view']);
// Test sort page visibility
$this->actingAs($this->user)->visit($secondBook->getUrl() . '/sort')
@ -683,8 +683,8 @@ class EntityPermissionsTest extends BrowserKitTest
$firstBook = Book::first();
$secondBook = Book::find(2);
$this->setEntityRestrictions($firstBook, ['view', 'update']);
$this->setEntityRestrictions($secondBook, ['view']);
$this->setRestrictionsForTestRoles($firstBook, ['view', 'update']);
$this->setRestrictionsForTestRoles($secondBook, ['view']);
$firstBookChapter = $this->newChapter(['name' => 'first book chapter'], $firstBook);
$secondBookChapter = $this->newChapter(['name' => 'second book chapter'], $secondBook);
@ -726,14 +726,14 @@ class EntityPermissionsTest extends BrowserKitTest
public function test_can_create_page_if_chapter_has_permissions_when_book_not_visible()
{
$book = Book::first();
$this->setEntityRestrictions($book, []);
$this->setRestrictionsForTestRoles($book, []);
$bookChapter = $book->chapters->first();
$this->setEntityRestrictions($bookChapter, ['view']);
$this->setRestrictionsForTestRoles($bookChapter, ['view']);
$this->actingAs($this->user)->visit($bookChapter->getUrl())
->dontSee('New Page');
$this->setEntityRestrictions($bookChapter, ['view', 'create']);
$this->setRestrictionsForTestRoles($bookChapter, ['view', 'create']);
$this->actingAs($this->user)->visit($bookChapter->getUrl())
->click('New Page')

View File

@ -9,71 +9,73 @@ use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page;
class PublicActionTest extends BrowserKitTest
class PublicActionTest extends TestCase
{
public function test_app_not_public()
{
$this->setSettings(['app-public' => 'false']);
$book = Book::orderBy('name', 'asc')->first();
$this->visit('/books')->seePageIs('/login');
$this->visit($book->getUrl())->seePageIs('/login');
$book = Book::query()->first();
$this->get('/books')->assertRedirect('/login');
$this->get($book->getUrl())->assertRedirect('/login');
$page = Page::first();
$this->visit($page->getUrl())->seePageIs('/login');
$page = Page::query()->first();
$this->get($page->getUrl())->assertRedirect('/login');
}
public function test_login_link_visible()
{
$this->setSettings(['app-public' => 'true']);
$this->visit('/')->see(url('/login'));
$this->get('/')->assertElementExists('a[href="'.url('/login').'"]');
}
public function test_register_link_visible_when_enabled()
{
$this->setSettings(['app-public' => 'true']);
$this->visit('/')->see(url('/login'));
$this->visit('/')->dontSee(url('/register'));
$home = $this->get('/');
$home->assertSee(url('/login'));
$home->assertDontSee(url('/register'));
$this->setSettings(['app-public' => 'true', 'registration-enabled' => 'true']);
$this->visit('/')->see(url('/login'));
$this->visit('/')->see(url('/register'));
$home = $this->get('/');
$home->assertSee(url('/login'));
$home->assertSee(url('/register'));
}
public function test_books_viewable()
{
$this->setSettings(['app-public' => 'true']);
$books = Book::orderBy('name', 'asc')->take(10)->get();
$books = Book::query()->orderBy('name', 'asc')->take(10)->get();
$bookToVisit = $books[1];
// Check books index page is showing
$this->visit('/books')
->seeStatusCode(200)
->see($books[0]->name)
// Check individual book page is showing and it's child contents are visible.
->click($bookToVisit->name)
->seePageIs($bookToVisit->getUrl())
->see($bookToVisit->name)
->see($bookToVisit->chapters()->first()->name);
$resp = $this->get('/books');
$resp->assertStatus(200);
$resp->assertSee($books[0]->name);
// Check individual book page is showing and it's child contents are visible.
$resp = $this->get($bookToVisit->getUrl());
$resp->assertSee($bookToVisit->name);
$resp->assertSee($bookToVisit->chapters()->first()->name);
}
public function test_chapters_viewable()
{
$this->setSettings(['app-public' => 'true']);
$chapterToVisit = Chapter::first();
/** @var Chapter $chapterToVisit */
$chapterToVisit = Chapter::query()->first();
$pageToVisit = $chapterToVisit->pages()->first();
// Check chapters index page is showing
$this->visit($chapterToVisit->getUrl())
->seeStatusCode(200)
->see($chapterToVisit->name)
// Check individual chapter page is showing and it's child contents are visible.
->see($pageToVisit->name)
->click($pageToVisit->name)
->see($chapterToVisit->book->name)
->see($chapterToVisit->name)
->seePageIs($pageToVisit->getUrl());
$resp = $this->get($chapterToVisit->getUrl());
$resp->assertStatus(200);
$resp->assertSee($chapterToVisit->name);
// Check individual chapter page is showing and it's child contents are visible.
$resp->assertSee($pageToVisit->name);
$resp = $this->get($pageToVisit->getUrl());
$resp->assertStatus(200);
$resp->assertSee($chapterToVisit->book->name);
$resp->assertSee($chapterToVisit->name);
}
public function test_public_page_creation()
@ -87,19 +89,22 @@ class PublicActionTest extends BrowserKitTest
}
$this->app[PermissionService::class]->buildJointPermissionForRole($publicRole);
$chapter = Chapter::first();
$this->visit($chapter->book->getUrl());
$this->visit($chapter->getUrl())
->click('New Page')
->see('New Page')
->seePageIs($chapter->getUrl('/create-page'));
/** @var Chapter $chapter */
$chapter = Chapter::query()->first();
$resp = $this->get($chapter->getUrl());
$resp->assertSee('New Page');
$resp->assertElementExists('a[href="'.$chapter->getUrl('/create-page').'"]');
$this->submitForm('Continue', [
'name' => 'My guest page'
])->seePageIs($chapter->book->getUrl('/page/my-guest-page/edit'));
$resp = $this->get($chapter->getUrl('/create-page'));
$resp->assertSee('Continue');
$resp->assertSee('Page Name');
$resp->assertElementExists('form[action="'.$chapter->getUrl('/create-guest-page').'"]');
$resp = $this->post($chapter->getUrl('/create-guest-page'), ['name' => 'My guest page']);
$resp->assertRedirect($chapter->book->getUrl('/page/my-guest-page/edit'));
$user = User::getDefault();
$this->seeInDatabase('pages', [
$this->assertDatabaseHas('pages', [
'name' => 'My guest page',
'chapter_id' => $chapter->id,
'created_by' => $user->id,
@ -109,75 +114,71 @@ class PublicActionTest extends BrowserKitTest
public function test_content_not_listed_on_404_for_public_users()
{
$page = Page::first();
$this->asAdmin()->visit($page->getUrl());
$page = Page::query()->first();
$this->asAdmin()->get($page->getUrl()); // Fake visit to show on recents
$resp = $this->get('/cats/dogs/hippos');
$resp->assertStatus(404);
$resp->assertSee($page->name);
Auth::logout();
view()->share('pageTitle', '');
$this->forceVisit('/cats/dogs/hippos');
$this->dontSee($page->name);
$resp = $this->get('/cats/dogs/hippos');
$resp->assertStatus(404);
$resp->assertDontSee($page->name);
}
public function test_robots_effected_by_public_status()
{
$this->visit('/robots.txt');
$this->seeText("User-agent: *\nDisallow: /");
$this->get('/robots.txt')->assertSee("User-agent: *\nDisallow: /");
$this->setSettings(['app-public' => 'true']);
$this->visit('/robots.txt');
$this->seeText("User-agent: *\nDisallow:");
$this->dontSeeText("Disallow: /");
$resp = $this->get('/robots.txt');
$resp->assertSee("User-agent: *\nDisallow:");
$resp->assertDontSee("Disallow: /");
}
public function test_robots_effected_by_setting()
{
$this->visit('/robots.txt');
$this->seeText("User-agent: *\nDisallow: /");
$this->get('/robots.txt')->assertSee("User-agent: *\nDisallow: /");
config()->set('app.allow_robots', true);
$this->visit('/robots.txt');
$this->seeText("User-agent: *\nDisallow:");
$this->dontSeeText("Disallow: /");
$resp = $this->get('/robots.txt');
$resp->assertSee("User-agent: *\nDisallow:");
$resp->assertDontSee("Disallow: /");
// Check config overrides app-public setting
config()->set('app.allow_robots', false);
$this->setSettings(['app-public' => 'true']);
$this->visit('/robots.txt');
$this->seeText("User-agent: *\nDisallow: /");
$this->get('/robots.txt')->assertSee("User-agent: *\nDisallow: /");
}
public function test_public_view_then_login_redirects_to_previous_content()
{
$this->setSettings(['app-public' => 'true']);
/** @var Book $book */
$book = Book::query()->first();
$this->visit($book->getUrl())
->see($book->name)
->visit('/login')
->type('admin@admin.com', '#email')
->type('password', '#password')
->press('Log In')
->seePageUrlIs($book->getUrl());
$resp = $this->get($book->getUrl());
$resp->assertSee($book->name);
$this->get('/login');
$resp = $this->post('/login', ['email' => 'admin@admin.com', 'password' => 'password']);
$resp->assertRedirect($book->getUrl());
}
public function test_access_hidden_content_then_login_redirects_to_intended_content()
{
$this->setSettings(['app-public' => 'true']);
/** @var Book $book */
$book = Book::query()->first();
$this->setEntityRestrictions($book);
try {
$this->visit($book->getUrl());
} catch (\Exception $exception) {}
$resp = $this->get($book->getUrl());
$resp->assertSee('Book not found');
$this->see('Book not found')
->dontSee($book->name)
->visit('/login')
->type('admin@admin.com', '#email')
->type('password', '#password')
->press('Log In')
->seePageUrlIs($book->getUrl())
->see($book->name);
$this->get('/login');
$resp = $this->post('/login', ['email' => 'admin@admin.com', 'password' => 'password']);
$resp->assertRedirect($book->getUrl());
$this->followRedirects($resp)->assertSee($book->name);
}
}

View File

@ -15,13 +15,11 @@ use BookStack\Auth\Permissions\PermissionService;
use BookStack\Entities\Repos\PageRepo;
use BookStack\Settings\SettingService;
use BookStack\Uploads\HttpFetcher;
use Illuminate\Http\Response;
use Illuminate\Support\Env;
use Illuminate\Support\Facades\Log;
use Mockery;
use Monolog\Handler\TestHandler;
use Monolog\Logger;
use Throwable;
use Illuminate\Foundation\Testing\Assert as PHPUnit;
trait SharedTestHelpers
@ -32,7 +30,6 @@ trait SharedTestHelpers
/**
* Set the current user context to be an admin.
* @return $this
*/
public function asAdmin()
{
@ -41,19 +38,19 @@ trait SharedTestHelpers
/**
* Get the current admin user.
* @return mixed
*/
public function getAdmin() {
if($this->admin === null) {
public function getAdmin(): User
{
if (is_null($this->admin)) {
$adminRole = Role::getSystemRole('admin');
$this->admin = $adminRole->users->first();
}
return $this->admin;
}
/**
* Set the current user context to be an editor.
* @return $this
*/
public function asEditor()
{
@ -63,10 +60,10 @@ trait SharedTestHelpers
/**
* Get a editor user.
* @return mixed
*/
protected function getEditor() {
if($this->editor === null) {
protected function getEditor(): User
{
if ($this->editor === null) {
$editorRole = Role::getRole('editor');
$this->editor = $editorRole->users->first();
}
@ -87,10 +84,8 @@ trait SharedTestHelpers
/**
* Regenerate the permission for an entity.
* @param Entity $entity
* @throws Throwable
*/
protected function regenEntityPermissions(Entity $entity)
protected function regenEntityPermissions(Entity $entity): void
{
$entity->rebuildPermissions();
$entity->load('jointPermissions');
@ -98,40 +93,34 @@ trait SharedTestHelpers
/**
* Create and return a new bookshelf.
* @param array $input
* @return Bookshelf
*/
public function newShelf($input = ['name' => 'test shelf', 'description' => 'My new test shelf']) {
public function newShelf(array $input = ['name' => 'test shelf', 'description' => 'My new test shelf']): Bookshelf
{
return app(BookshelfRepo::class)->create($input, []);
}
/**
* Create and return a new book.
* @param array $input
* @return Book
*/
public function newBook($input = ['name' => 'test book', 'description' => 'My new test book']) {
public function newBook(array $input = ['name' => 'test book', 'description' => 'My new test book']): Book
{
return app(BookRepo::class)->create($input);
}
/**
* Create and return a new test chapter
* @param array $input
* @param Book $book
* @return Chapter
*/
public function newChapter($input = ['name' => 'test chapter', 'description' => 'My new test chapter'], Book $book) {
public function newChapter(array $input = ['name' => 'test chapter', 'description' => 'My new test chapter'], Book $book): Chapter
{
return app(ChapterRepo::class)->create($input, $book);
}
/**
* Create and return a new test page
* @param array $input
* @return Page
* @throws Throwable
*/
public function newPage($input = ['name' => 'test page', 'html' => 'My new test page']) {
$book = Book::first();
public function newPage(array $input = ['name' => 'test page', 'html' => 'My new test page']): Page
{
$book = Book::query()->first();
$pageRepo = app(PageRepo::class);
$draftPage = $pageRepo->getNewDraftPage($book);
return $pageRepo->publishDraft($draftPage, $input);
@ -139,9 +128,8 @@ trait SharedTestHelpers
/**
* Quickly sets an array of settings.
* @param $settingsArray
*/
protected function setSettings($settingsArray)
protected function setSettings(array $settingsArray): void
{
$settings = app(SettingService::class);
foreach ($settingsArray as $key => $value) {
@ -151,11 +139,8 @@ trait SharedTestHelpers
/**
* Manually set some permissions on an entity.
* @param Entity $entity
* @param array $actions
* @param array $roles
*/
protected function setEntityRestrictions(Entity $entity, $actions = [], $roles = [])
protected function setEntityRestrictions(Entity $entity, array $actions = [], array $roles = []): void
{
$entity->restricted = true;
$entity->permissions()->delete();
@ -180,7 +165,7 @@ trait SharedTestHelpers
/**
* Give the given user some permissions.
*/
protected function giveUserPermissions(User $user, array $permissions = [])
protected function giveUserPermissions(User $user, array $permissions = []): void
{
$newRole = $this->createNewRole($permissions);
$user->attachRole($newRole);
@ -190,10 +175,8 @@ trait SharedTestHelpers
/**
* Create a new basic role for testing purposes.
* @param array $permissions
* @return Role
*/
protected function createNewRole($permissions = [])
protected function createNewRole(array $permissions = []): Role
{
$permissionRepo = app(PermissionsRepo::class);
$roleData = factory(Role::class)->make()->toArray();
@ -203,8 +186,6 @@ trait SharedTestHelpers
/**
* Mock the HttpFetcher service and return the given data on fetch.
* @param $returnData
* @param int $times
*/
protected function mockHttpFetch($returnData, int $times = 1)
{
@ -218,9 +199,6 @@ trait SharedTestHelpers
/**
* Run a set test with the given env variable.
* Remembers the original and resets the value after test.
* @param string $name
* @param $value
* @param callable $callback
*/
protected function runWithEnv(string $name, $value, callable $callback)
{
@ -246,11 +224,8 @@ trait SharedTestHelpers
/**
* Check the keys and properties in the given map to include
* exist, albeit not exclusively, within the map to check.
* @param array $mapToInclude
* @param array $mapToCheck
* @param string $message
*/
protected function assertArrayMapIncludes(array $mapToInclude, array $mapToCheck, string $message = '') : void
protected function assertArrayMapIncludes(array $mapToInclude, array $mapToCheck, string $message = ''): void
{
$passed = true;
@ -301,7 +276,7 @@ trait SharedTestHelpers
$testHandler = new TestHandler();
$monolog->pushHandler($testHandler);
Log::extend('testing', function() use ($monolog) {
Log::extend('testing', function () use ($monolog) {
return $monolog;
});
Log::setDefaultDriver('testing');