]> BookStack Code Mirror - bookstack/commitdiff
Merge pull request #3986 from BookStackApp/permission_testing
authorDan Brown <redacted>
Tue, 24 Jan 2023 21:37:28 +0000 (21:37 +0000)
committerGitHub <redacted>
Tue, 24 Jan 2023 21:37:28 +0000 (21:37 +0000)
Permission Testing & Alignment

1  2 
tests/Entity/ExportTest.php
tests/Entity/PageContentTest.php
tests/TestCase.php

index 68c70e6c0062f5132b2ee39b2682d5c3e4e73391,0f8d0f48cfb329c524406590d666541331bcd5ef..6ae8dcde313f27444bfbf3783920913ca4c6946c
@@@ -160,9 -160,9 +160,9 @@@ class ExportTest extends TestCas
          $page = $this->entities->page();
  
          $resp = $this->asEditor()->get($page->getUrl('/export/html'));
 -        $resp->assertSee($page->created_at->formatLocalized('%e %B %Y %H:%M:%S'));
 +        $resp->assertSee($page->created_at->isoFormat('D MMMM Y HH:mm:ss'));
          $resp->assertDontSee($page->created_at->diffForHumans());
 -        $resp->assertSee($page->updated_at->formatLocalized('%e %B %Y %H:%M:%S'));
 +        $resp->assertSee($page->updated_at->isoFormat('D MMMM Y HH:mm:ss'));
          $resp->assertDontSee($page->updated_at->diffForHumans());
      }
  
  
      public function test_page_export_with_deleted_creator_and_updater()
      {
-         $user = $this->getViewer(['name' => 'ExportWizardTheFifth']);
+         $user = $this->users->viewer(['name' => 'ExportWizardTheFifth']);
          $page = $this->entities->page();
          $page->created_by = $user->id;
          $page->updated_by = $user->id;
          $chapter = $book->chapters()->first();
          $page = $chapter->pages()->first();
          $entities = [$book, $chapter, $page];
-         $user = $this->getViewer();
+         $user = $this->users->viewer();
          $this->actingAs($user);
  
          foreach ($entities as $entity) {
              $resp->assertSee('/export/pdf');
          }
  
-         /** @var Role $role */
-         $this->removePermissionFromUser($user, 'content-export');
+         $this->permissions->removeUserRolePermissions($user, ['content-export']);
  
          foreach ($entities as $entity) {
              $resp = $this->get($entity->getUrl());
index 53107d14d19177cc6adb6ea408cb28714e952936,e24ee4fb5fa9cdd057ecb011680b6fe6c6dad311..e8838ae0bb0198b6da7cfe655644a3c33e42ee11
@@@ -310,7 -310,7 +310,7 @@@ class PageContentTest extends TestCas
      {
          $this->asEditor();
          $page = $this->entities->page();
 -        config()->push('app.allow_content_scripts', 'true');
 +        config()->set('app.allow_content_scripts', 'true');
  
          $script = 'abc123<script>console.log("hello-test")</script>abc123';
          $page->html = "no escape {$script}";
      {
          $this->asEditor();
          $page = $this->entities->page();
 -        config()->push('app.allow_content_scripts', 'true');
 +        config()->set('app.allow_content_scripts', 'true');
  
          $script = '<p onmouseenter="console.log(\'test\')">Hello</p>';
          $page->html = "escape {$script}";
      {
          $page = $this->entities->page();
  
-         $this->actingAs($this->getAdmin())
+         $this->actingAs($this->users->admin())
              ->put($page->getUrl(''), [
                  'name' => 'Testing',
                  'html' => '<p>&quot;Hello &amp; welcome&quot;</p>',
diff --combined tests/TestCase.php
index d9a614fc6d7c8bc09f6f88cb9b7ba07ef31724ce,a5d75655cb577dfb0eff09bff07d2c15e96e7f92..9e4b1df419e5a3e9cbe158716f0ac2a2faf93344
@@@ -2,11 -2,6 +2,6 @@@
  
  namespace Tests;
  
- use BookStack\Auth\Permissions\JointPermissionBuilder;
- use BookStack\Auth\Permissions\PermissionsRepo;
- use BookStack\Auth\Permissions\RolePermission;
- use BookStack\Auth\Role;
- use BookStack\Auth\User;
  use BookStack\Entities\Models\Entity;
  use BookStack\Settings\SettingService;
  use BookStack\Uploads\HttpFetcher;
@@@ -22,12 -17,15 +17,15 @@@ use Illuminate\Support\Env
  use Illuminate\Support\Facades\DB;
  use Illuminate\Support\Facades\Log;
  use Illuminate\Testing\Assert as PHPUnit;
+ use Mockery;
  use Monolog\Handler\TestHandler;
  use Monolog\Logger;
  use Psr\Http\Client\ClientInterface;
  use Ssddanbrown\AssertHtml\TestsHtml;
  use Tests\Helpers\EntityProvider;
+ use Tests\Helpers\PermissionsProvider;
  use Tests\Helpers\TestServiceProvider;
+ use Tests\Helpers\UserRoleProvider;
  
  abstract class TestCase extends BaseTestCase
  {
      use DatabaseTransactions;
      use TestsHtml;
  
-     protected ?User $admin = null;
-     protected ?User $editor = null;
      protected EntityProvider $entities;
+     protected UserRoleProvider $users;
+     protected PermissionsProvider $permissions;
  
      protected function setUp(): void
      {
          $this->entities = new EntityProvider();
+         $this->users = new UserRoleProvider();
+         $this->permissions = new PermissionsProvider($this->users);
          parent::setUp();
 +
 +        // We can uncomment the below to run tests with failings upon deprecations.
 +        // Can't leave on since some deprecations can only be fixed upstream.
 +         // $this->withoutDeprecationHandling();
      }
  
      /**
       */
      public function asAdmin()
      {
-         return $this->actingAs($this->getAdmin());
-     }
-     /**
-      * Get the current admin user.
-      */
-     public function getAdmin(): User
-     {
-         if (is_null($this->admin)) {
-             $adminRole = Role::getSystemRole('admin');
-             $this->admin = $adminRole->users->first();
-         }
-         return $this->admin;
+         return $this->actingAs($this->users->admin());
      }
  
      /**
       */
      public function asEditor()
      {
-         return $this->actingAs($this->getEditor());
-     }
-     /**
-      * Get a editor user.
-      */
-     protected function getEditor(): User
-     {
-         if ($this->editor === null) {
-             $editorRole = Role::getRole('editor');
-             $this->editor = $editorRole->users->first();
-         }
-         return $this->editor;
+         return $this->actingAs($this->users->editor());
      }
  
      /**
       */
      public function asViewer()
      {
-         return $this->actingAs($this->getViewer());
-     }
-     /**
-      * Get an instance of a user with 'viewer' permissions.
-      */
-     protected function getViewer(array $attributes = []): User
-     {
-         $user = Role::getRole('viewer')->users()->first();
-         if (!empty($attributes)) {
-             $user->forceFill($attributes)->save();
-         }
-         return $user;
-     }
-     /**
-      * Get a user that's not a system user such as the guest user.
-      */
-     public function getNormalUser(): User
-     {
-         return User::query()->where('system_name', '=', null)->get()->last();
+         return $this->actingAs($this->users->viewer());
      }
  
      /**
          }
      }
  
-     /**
-      * Give the given user some permissions.
-      */
-     protected function giveUserPermissions(User $user, array $permissions = []): void
-     {
-         $newRole = $this->createNewRole($permissions);
-         $user->attachRole($newRole);
-         $user->load('roles');
-         $user->clearPermissionCache();
-     }
-     /**
-      * Completely remove the given permission name from the given user.
-      */
-     protected function removePermissionFromUser(User $user, string $permissionName)
-     {
-         $permissionBuilder = app()->make(JointPermissionBuilder::class);
-         /** @var RolePermission $permission */
-         $permission = RolePermission::query()->where('name', '=', $permissionName)->firstOrFail();
-         $roles = $user->roles()->whereHas('permissions', function ($query) use ($permission) {
-             $query->where('id', '=', $permission->id);
-         })->get();
-         /** @var Role $role */
-         foreach ($roles as $role) {
-             $role->detachPermission($permission);
-             $permissionBuilder->rebuildForRole($role);
-         }
-         $user->clearPermissionCache();
-     }
-     /**
-      * Create a new basic role for testing purposes.
-      */
-     protected function createNewRole(array $permissions = []): Role
-     {
-         $permissionRepo = app(PermissionsRepo::class);
-         $roleData = Role::factory()->make()->toArray();
-         $roleData['permissions'] = array_flip($permissions);
-         return $permissionRepo->saveNewRole($roleData);
-     }
      /**
       * Mock the HttpFetcher service and return the given data on fetch.
       */
  
          DB::purge();
          config()->set('database.connections.mysql_testing.database', $database);
+         DB::beginTransaction();
  
          $callback();
  
+         DB::rollBack();
          if (is_null($originalVal)) {
              unset($_SERVER[$name]);
          } else {