]> BookStack Code Mirror - bookstack/blobdiff - tests/Api/RecycleBinApiTest.php
Added 'Sort Book' action to chapters
[bookstack] / tests / Api / RecycleBinApiTest.php
index 9371e06e81841131a97001cdd34e605e7af1afb1..83cd82480310a137c5e7313c2eab41f6320ca6d2 100644 (file)
@@ -3,24 +3,21 @@
 namespace Tests\Api;
 
 use BookStack\Entities\Models\Book;
-use BookStack\Entities\Models\Chapter;
 use BookStack\Entities\Models\Deletion;
 use BookStack\Entities\Models\Page;
-use Carbon\Carbon;
 use Illuminate\Support\Collection;
-use Illuminate\Support\Facades\DB;
 use Tests\TestCase;
 
 class RecycleBinApiTest extends TestCase
 {
     use TestsApi;
 
-    protected string $baseEndpoint = '/api/recycle_bin';
+    protected string $baseEndpoint = '/api/recycle-bin';
 
     protected array $endpointMap = [
-        ['get', '/api/recycle_bin'],
-        ['put', '/api/recycle_bin/1'],
-        ['delete', '/api/recycle_bin/1'],
+        ['get', '/api/recycle-bin'],
+        ['put', '/api/recycle-bin/1'],
+        ['delete', '/api/recycle-bin/1'],
     ];
 
     public function test_settings_manage_permission_needed_for_all_endpoints()
@@ -36,12 +33,12 @@ class RecycleBinApiTest extends TestCase
         }
     }
 
-    public function test_restrictions_manage_all_permission_neeed_for_all_endpoints()
+    public function test_restrictions_manage_all_permission_needed_for_all_endpoints()
     {
         $editor = $this->getEditor();
         $this->giveUserPermissions($editor, ['restrictions-manage-all']);
         $this->actingAs($editor);
-        
+
         foreach ($this->endpointMap as [$method, $uri]) {
             $resp = $this->json($method, $uri);
             $resp->assertStatus(403);
@@ -51,13 +48,12 @@ class RecycleBinApiTest extends TestCase
 
     public function test_index_endpoint_returns_expected_page()
     {
-        $this->actingAsAuthorizedUser();
-        
+        $admin = $this->getAdmin();
+
         $page = Page::query()->first();
-        $book = Book::query()->whereHas('pages')->whereHas('chapters')->withCount(['pages', 'chapters'])->first();
-        $editor = $this->getEditor();
-        $this->actingAs($editor)->delete($page->getUrl());
-        $this->actingAs($editor)->delete($book->getUrl());
+        $book = Book::query()->first();
+        $this->actingAs($admin)->delete($page->getUrl());
+        $this->delete($book->getUrl());
 
         $deletions = Deletion::query()->orderBy('id')->get();
 
@@ -65,72 +61,124 @@ class RecycleBinApiTest extends TestCase
 
         $expectedData = $deletions
             ->zip([$page, $book])
-            ->map(function (Collection $data) use ($editor) {
+            ->map(function (Collection $data) use ($admin) {
                 return [
                     'id'                => $data[0]->id,
-                    'deleted_by'        => $editor->getKey(),
+                    'deleted_by'        => $admin->id,
                     'created_at'        => $data[0]->created_at->toJson(),
                     'updated_at'        => $data[0]->updated_at->toJson(),
                     'deletable_type'    => $data[1]->getMorphClass(),
-                    'deletable_id'      => $data[1]->getKey()
+                    'deletable_id'      => $data[1]->id,
+                    'deletable'         => [
+                        'name' => $data[1]->name,
+                    ],
                 ];
             });
 
         $resp->assertJson([
-            'data' => $expectedData->values()->all(), 
-            'total' => 2
+            'data'  => $expectedData->values()->all(),
+            'total' => 2,
+        ]);
+    }
+
+    public function test_index_endpoint_returns_children_count()
+    {
+        $admin = $this->getAdmin();
+
+        $book = Book::query()->whereHas('pages')->whereHas('chapters')->withCount(['pages', 'chapters'])->first();
+        $this->actingAs($admin)->delete($book->getUrl());
+
+        $deletion = Deletion::query()->orderBy('id')->first();
+
+        $resp = $this->getJson($this->baseEndpoint);
+
+        $expectedData = [
+            [
+                'id'             => $deletion->id,
+                'deletable'      => [
+                    'pages_count'    => $book->pages_count,
+                    'chapters_count' => $book->chapters_count,
+                ],
+            ],
+        ];
+
+        $resp->assertJson([
+            'data'  => $expectedData,
+            'total' => 1,
+        ]);
+    }
+
+    public function test_index_endpoint_returns_parent()
+    {
+        $admin = $this->getAdmin();
+        $page = Page::query()->whereHas('chapter')->with('chapter')->first();
+
+        $this->actingAs($admin)->delete($page->getUrl());
+        $deletion = Deletion::query()->orderBy('id')->first();
+
+        $resp = $this->getJson($this->baseEndpoint);
+
+        $expectedData = [
+            [
+                'id'             => $deletion->id,
+                'deletable'      => [
+                    'parent' => [
+                        'id'   => $page->chapter->id,
+                        'name' => $page->chapter->name,
+                        'type' => 'chapter',
+                    ],
+                ],
+            ],
+        ];
+
+        $resp->assertJson([
+            'data'  => $expectedData,
+            'total' => 1,
         ]);
     }
 
     public function test_restore_endpoint()
     {
-        $this->actingAsAuthorizedUser();
-        
         $page = Page::query()->first();
-        $editor = $this->getEditor();
-        $this->actingAs($editor)->delete($page->getUrl());
+        $this->asAdmin()->delete($page->getUrl());
         $page->refresh();
 
         $deletion = Deletion::query()->orderBy('id')->first();
 
         $this->assertDatabaseHas('pages', [
-            'id' => $page->getKey(),
-            'deleted_at' => $page->deleted_at
+            'id'            => $page->id,
+            'deleted_at'    => $page->deleted_at,
         ]);
 
-        $this->putJson($this->baseEndpoint . '/' . $deletion->getKey());
+        $resp = $this->putJson($this->baseEndpoint . '/' . $deletion->id);
+        $resp->assertJson([
+            'restore_count' => 1,
+        ]);
 
         $this->assertDatabaseHas('pages', [
-            'id' => $page->getKey(),
-            'deleted_at' => null
+            'id'            => $page->id,
+            'deleted_at'    => null,
         ]);
     }
 
     public function test_destroy_endpoint()
     {
-        $this->actingAsAuthorizedUser();
-        
         $page = Page::query()->first();
-        $editor = $this->getEditor();
-        $this->actingAs($editor)->delete($page->getUrl());
+        $this->asAdmin()->delete($page->getUrl());
         $page->refresh();
 
         $deletion = Deletion::query()->orderBy('id')->first();
 
         $this->assertDatabaseHas('pages', [
-            'id' => $page->getKey(),
-            'deleted_at' => $page->deleted_at
+            'id'            => $page->id,
+            'deleted_at'    => $page->deleted_at,
         ]);
 
-        $this->deleteJson($this->baseEndpoint . '/' . $deletion->getKey());
-        $this->assertDatabaseMissing('pages', ['id' => $page->getKey()]);
-    }
+        $resp = $this->deleteJson($this->baseEndpoint . '/' . $deletion->id);
+        $resp->assertJson([
+            'delete_count' => 1,
+        ]);
 
-    private function actingAsAuthorizedUser()
-    {
-        $editor = $this->getEditor();
-        $this->giveUserPermissions($editor, ['restrictions-manage-all']);
-        $this->giveUserPermissions($editor, ['settings-manage']);
-        $this->actingAs($editor);
+        $this->assertDatabaseMissing('pages', ['id' => $page->id]);
     }
 }