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:
parent
382f155f76
commit
4d4a57d1bf
@ -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
|
||||
{
|
||||
|
@ -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', [
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
]);
|
||||
|
@ -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')
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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');
|
||||
|
Loading…
Reference in New Issue
Block a user