]> BookStack Code Mirror - bookstack/commitdiff
Added in attachment tests
authorDan Brown <redacted>
Sun, 23 Oct 2016 14:25:04 +0000 (15:25 +0100)
committerDan Brown <redacted>
Sun, 23 Oct 2016 14:25:04 +0000 (15:25 +0100)
app/Http/Controllers/FileController.php
resources/assets/js/controllers.js
resources/views/pages/sidebar-tree-list.blade.php
tests/AttachmentTest.php [new file with mode: 0644]
tests/ImageTest.php
tests/test-data/test-file.txt [new file with mode: 0644]
tests/test-data/test-image.jpg [moved from tests/test-image.jpg with 100% similarity]

index 2518d6cd31004130f1f34644018c87ca8d02b1e0..88200ae65ddbe7951da8f8958e98a4a22b72ef13 100644 (file)
@@ -34,7 +34,6 @@ class FileController extends Controller
      */
     public function upload(Request $request)
     {
-        // TODO - ensure uploads are deleted on page delete.
         $this->validate($request, [
             'uploaded_to' => 'required|integer|exists:pages,id',
             'file' => 'required|file'
index 78b3684d6e21817d1dc51322e49c5a760d6ade39..f098e01306a9950ee2dd194cc3f2ef2677d451bd 100644 (file)
@@ -639,6 +639,7 @@ module.exports = function (ngApp, events) {
              * @param fileLink
              */
             $scope.attachLinkSubmit = function(file) {
+                file.uploaded_to = pageId;
                 $http.post('/files/link', file).then(resp => {
                     $scope.files.unshift(resp.data);
                     events.emit('success', 'Link attached');
index bf0e5761a892b236d4a556d289dc60c22fbcc13a..f6b834f07553042e0012c7f9327ece56c93f3678 100644 (file)
@@ -1,7 +1,7 @@
 
 <div class="book-tree" ng-non-bindable>
 
-    @if ($page->files->count() > 0)
+    @if (isset($page) && $page->files->count() > 0)
         <h6 class="text-muted">Attachments</h6>
         @foreach($page->files as $file)
             <div class="attachment">
diff --git a/tests/AttachmentTest.php b/tests/AttachmentTest.php
new file mode 100644 (file)
index 0000000..f22faa7
--- /dev/null
@@ -0,0 +1,201 @@
+<?php
+
+class AttachmentTest extends TestCase
+{
+    /**
+     * Get a test file that can be uploaded
+     * @param $fileName
+     * @return \Illuminate\Http\UploadedFile
+     */
+    protected function getTestFile($fileName)
+    {
+        return new \Illuminate\Http\UploadedFile(base_path('tests/test-data/test-file.txt'), $fileName, 'text/plain', 55, null, true);
+    }
+
+    /**
+     * Uploads a file with the given name.
+     * @param $name
+     * @param int $uploadedTo
+     * @return string
+     */
+    protected function uploadFile($name, $uploadedTo = 0)
+    {
+        $file = $this->getTestFile($name);
+        return $this->call('POST', '/files/upload', ['uploaded_to' => $uploadedTo], [], ['file' => $file], []);
+    }
+
+    /**
+     * Get the expected upload path for a file.
+     * @param $fileName
+     * @return string
+     */
+    protected function getUploadPath($fileName)
+    {
+        return 'uploads/files/' . Date('Y-m-M') . '/' . $fileName;
+    }
+
+    /**
+     * Delete all uploaded files.
+     * To assist with cleanup.
+     */
+    protected function deleteUploads()
+    {
+        $fileService = $this->app->make(\BookStack\Services\FileService::class);
+        foreach (\BookStack\File::all() as $file) {
+            $fileService->deleteFile($file);
+        }
+    }
+
+    public function test_file_upload()
+    {
+        $page = \BookStack\Page::first();
+        $this->asAdmin();
+        $admin = $this->getAdmin();
+        $fileName = 'upload_test_file.txt';
+
+        $expectedResp = [
+            'name' => $fileName,
+            'uploaded_to'=> $page->id,
+            'extension' => 'txt',
+            'order' => 1,
+            'created_by' => $admin->id,
+            'updated_by' => $admin->id,
+            'path' => $this->getUploadPath($fileName)
+        ];
+
+        $this->uploadFile($fileName, $page->id);
+        $this->assertResponseOk();
+        $this->seeJsonContains($expectedResp);
+        $this->seeInDatabase('files', $expectedResp);
+
+        $this->deleteUploads();
+    }
+
+    public function test_file_display_and_access()
+    {
+        $page = \BookStack\Page::first();
+        $this->asAdmin();
+        $admin = $this->getAdmin();
+        $fileName = 'upload_test_file.txt';
+
+        $this->uploadFile($fileName, $page->id);
+        $this->assertResponseOk();
+        $this->visit($page->getUrl())
+            ->seeLink($fileName)
+            ->click($fileName)
+            ->see('Hi, This is a test file for testing the upload process.');
+
+        $this->deleteUploads();
+    }
+
+    public function test_attaching_link_to_page()
+    {
+        $page = \BookStack\Page::first();
+        $admin = $this->getAdmin();
+        $this->asAdmin();
+
+        $this->call('POST', 'files/link', [
+            'link' => 'https://example.com',
+            'name' => 'Example Attachment Link',
+            'uploaded_to' => $page->id,
+        ]);
+
+        $expectedResp = [
+            'path' => 'https://example.com',
+            'name' => 'Example Attachment Link',
+            'uploaded_to' => $page->id,
+            'created_by' => $admin->id,
+            'updated_by' => $admin->id,
+            'external' => true,
+            'order' => 1,
+            'extension' => ''
+        ];
+
+        $this->assertResponseOk();
+        $this->seeJsonContains($expectedResp);
+        $this->seeInDatabase('files', $expectedResp);
+
+        $this->visit($page->getUrl())->seeLink('Example Attachment Link')
+            ->click('Example Attachment Link')->seePageIs('https://example.com');
+
+        $this->deleteUploads();
+    }
+
+    public function test_attachment_updating()
+    {
+        $page = \BookStack\Page::first();
+        $this->asAdmin();
+
+        $this->call('POST', 'files/link', [
+            'link' => 'https://example.com',
+            'name' => 'Example Attachment Link',
+            'uploaded_to' => $page->id,
+        ]);
+
+        $attachmentId = \BookStack\File::first()->id;
+
+        $this->call('PUT', 'files/' . $attachmentId, [
+            'uploaded_to' => $page->id,
+            'name' => 'My new attachment name',
+            'link' => 'https://test.example.com'
+        ]);
+
+        $expectedResp = [
+            'path' => 'https://test.example.com',
+            'name' => 'My new attachment name',
+            'uploaded_to' => $page->id
+        ];
+
+        $this->assertResponseOk();
+        $this->seeJsonContains($expectedResp);
+        $this->seeInDatabase('files', $expectedResp);
+
+        $this->deleteUploads();
+    }
+
+    public function test_file_deletion()
+    {
+        $page = \BookStack\Page::first();
+        $this->asAdmin();
+        $fileName = 'deletion_test.txt';
+        $this->uploadFile($fileName, $page->id);
+
+        $filePath = base_path('storage/' . $this->getUploadPath($fileName));
+
+        $this->assertTrue(file_exists($filePath), 'File at path ' . $filePath . ' does not exist');
+
+        $attachmentId = \BookStack\File::first()->id;
+        $this->call('DELETE', 'files/' . $attachmentId);
+
+        $this->dontSeeInDatabase('files', [
+            'name' => $fileName
+        ]);
+        $this->assertFalse(file_exists($filePath), 'File at path ' . $filePath . ' was not deleted as expected');
+
+        $this->deleteUploads();
+    }
+
+    public function test_attachment_deletion_on_page_deletion()
+    {
+        $page = \BookStack\Page::first();
+        $this->asAdmin();
+        $fileName = 'deletion_test.txt';
+        $this->uploadFile($fileName, $page->id);
+
+        $filePath = base_path('storage/' . $this->getUploadPath($fileName));
+
+        $this->assertTrue(file_exists($filePath), 'File at path ' . $filePath . ' does not exist');
+        $this->seeInDatabase('files', [
+            'name' => $fileName
+        ]);
+
+        $this->call('DELETE', $page->getUrl());
+
+        $this->dontSeeInDatabase('files', [
+            'name' => $fileName
+        ]);
+        $this->assertFalse(file_exists($filePath), 'File at path ' . $filePath . ' was not deleted as expected');
+
+        $this->deleteUploads();
+    }
+}
index d9acd4b71b8efbdf573bd7f0ccba48e3c5cd2f9a..234988ba402c18da448ac0d5714c86f4b88edc50 100644 (file)
@@ -10,7 +10,7 @@ class ImageTest extends TestCase
      */
     protected function getTestImage($fileName)
     {
-        return new \Illuminate\Http\UploadedFile(base_path('tests/test-image.jpg'), $fileName, 'image/jpeg', 5238);
+        return new \Illuminate\Http\UploadedFile(base_path('tests/test-data/test-image.jpg'), $fileName, 'image/jpeg', 5238);
     }
 
     /**
diff --git a/tests/test-data/test-file.txt b/tests/test-data/test-file.txt
new file mode 100644 (file)
index 0000000..4c1f41a
--- /dev/null
@@ -0,0 +1 @@
+Hi, This is a test file for testing the upload process.
\ No newline at end of file