2017-02-26 17:14:18 +08:00
< ? php namespace Tests ;
2018-09-25 19:30:50 +08:00
use BookStack\Auth\Permissions\JointPermission ;
2019-12-12 05:21:19 +08:00
use BookStack\Entities\Bookshelf ;
2018-09-25 19:30:50 +08:00
use BookStack\Entities\Page ;
use BookStack\Auth\User ;
2018-10-13 18:27:55 +08:00
use BookStack\Entities\Repos\PageRepo ;
2017-02-26 17:14:18 +08:00
class CommandsTest extends TestCase
{
public function test_clear_views_command ()
{
$this -> asEditor ();
$page = Page :: first ();
$this -> get ( $page -> getUrl ());
$this -> assertDatabaseHas ( 'views' , [
'user_id' => $this -> getEditor () -> id ,
'viewable_id' => $page -> id ,
'views' => 1
]);
$exitCode = \Artisan :: call ( 'bookstack:clear-views' );
$this -> assertTrue ( $exitCode === 0 , 'Command executed successfully' );
$this -> assertDatabaseMissing ( 'views' , [
'user_id' => $this -> getEditor () -> id
]);
}
public function test_clear_activity_command ()
{
$this -> asEditor ();
$page = Page :: first ();
\Activity :: add ( $page , 'page_update' , $page -> book -> id );
$this -> assertDatabaseHas ( 'activities' , [
'key' => 'page_update' ,
'entity_id' => $page -> id ,
'user_id' => $this -> getEditor () -> id
]);
$exitCode = \Artisan :: call ( 'bookstack:clear-activity' );
$this -> assertTrue ( $exitCode === 0 , 'Command executed successfully' );
$this -> assertDatabaseMissing ( 'activities' , [
'key' => 'page_update'
]);
}
public function test_clear_revisions_command ()
{
$this -> asEditor ();
2018-10-13 18:27:55 +08:00
$pageRepo = app ( PageRepo :: class );
2017-02-26 17:14:18 +08:00
$page = Page :: first ();
2019-10-05 19:55:01 +08:00
$pageRepo -> update ( $page , [ 'name' => 'updated page' , 'html' => '<p>new content</p>' , 'summary' => 'page revision testing' ]);
2018-10-13 18:27:55 +08:00
$pageRepo -> updatePageDraft ( $page , [ 'name' => 'updated page' , 'html' => '<p>new content in draft</p>' , 'summary' => 'page revision testing' ]);
2017-02-26 17:14:18 +08:00
$this -> assertDatabaseHas ( 'page_revisions' , [
'page_id' => $page -> id ,
'type' => 'version'
]);
$this -> assertDatabaseHas ( 'page_revisions' , [
'page_id' => $page -> id ,
'type' => 'update_draft'
]);
$exitCode = \Artisan :: call ( 'bookstack:clear-revisions' );
$this -> assertTrue ( $exitCode === 0 , 'Command executed successfully' );
$this -> assertDatabaseMissing ( 'page_revisions' , [
'page_id' => $page -> id ,
'type' => 'version'
]);
$this -> assertDatabaseHas ( 'page_revisions' , [
'page_id' => $page -> id ,
'type' => 'update_draft'
]);
$exitCode = \Artisan :: call ( 'bookstack:clear-revisions' , [ '--all' => true ]);
$this -> assertTrue ( $exitCode === 0 , 'Command executed successfully' );
$this -> assertDatabaseMissing ( 'page_revisions' , [
'page_id' => $page -> id ,
'type' => 'update_draft'
]);
}
public function test_regen_permissions_command ()
{
JointPermission :: query () -> truncate ();
$page = Page :: first ();
$this -> assertDatabaseMissing ( 'joint_permissions' , [ 'entity_id' => $page -> id ]);
$exitCode = \Artisan :: call ( 'bookstack:regenerate-permissions' );
$this -> assertTrue ( $exitCode === 0 , 'Command executed successfully' );
$this -> assertDatabaseHas ( 'joint_permissions' , [ 'entity_id' => $page -> id ]);
}
2018-01-29 02:09:26 +08:00
public function test_add_admin_command ()
{
$exitCode = \Artisan :: call ( 'bookstack:create-admin' , [
'--email' => 'admintest@example.com' ,
'--name' => 'Admin Test' ,
'--password' => 'testing-4' ,
]);
$this -> assertTrue ( $exitCode === 0 , 'Command executed successfully' );
$this -> assertDatabaseHas ( 'users' , [
'email' => 'admintest@example.com' ,
'name' => 'Admin Test'
]);
$this -> assertTrue ( User :: where ( 'email' , '=' , 'admintest@example.com' ) -> first () -> hasSystemRole ( 'admin' ), 'User has admin role as expected' );
$this -> assertTrue ( \Auth :: attempt ([ 'email' => 'admintest@example.com' , 'password' => 'testing-4' ]), 'Password stored as expected' );
}
2019-12-12 05:21:19 +08:00
public function test_copy_shelf_permissions_command_shows_error_when_no_required_option_given ()
{
$this -> artisan ( 'bookstack:copy-shelf-permissions' )
-> expectsOutput ( 'Either a --slug or --all option must be provided.' )
-> assertExitCode ( 0 );
}
public function test_copy_shelf_permissions_command_using_slug ()
{
$shelf = Bookshelf :: first ();
$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 ]);
$this -> artisan ( 'bookstack:copy-shelf-permissions' , [
'--slug' => $shelf -> slug ,
]);
$child = $shelf -> books () -> first ();
$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_copy_shelf_permissions_command_using_all ()
{
$shelf = Bookshelf :: query () -> first ();
Bookshelf :: query () -> where ( 'id' , '!=' , $shelf -> id ) -> delete ();
$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 ]);
$this -> artisan ( 'bookstack:copy-shelf-permissions --all' )
-> expectsQuestion ( 'Permission settings for all shelves will be cascaded. Books assigned to multiple shelves will receive only the permissions of it\'s last processed shelf. Are you sure you want to proceed?' , 'y' );
$child = $shelf -> books () -> first ();
$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 ]);
}
2017-02-26 17:14:18 +08:00
}