| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  | <?php namespace Tests\Uploads; | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-13 18:27:55 +08:00
										 |  |  | use BookStack\Entities\Repos\PageRepo; | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | use BookStack\Uploads\Image; | 
					
						
							|  |  |  | use BookStack\Entities\Page; | 
					
						
							|  |  |  | use BookStack\Uploads\ImageService; | 
					
						
							| 
									
										
										
										
											2019-09-14 06:58:40 +08:00
										 |  |  | use Illuminate\Support\Str; | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  | use Tests\TestCase; | 
					
						
							| 
									
										
										
										
											2018-01-28 21:18:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ImageTest extends TestCase | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     use UsesImages; | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function test_image_upload() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-01-28 21:18:28 +08:00
										 |  |  |         $page = Page::first(); | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  |         $admin = $this->getAdmin(); | 
					
						
							| 
									
										
										
										
											2018-01-28 21:27:41 +08:00
										 |  |  |         $this->actingAs($admin); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $imgDetails = $this->uploadGalleryImage($page); | 
					
						
							|  |  |  |         $relPath = $imgDetails['path']; | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $this->assertTrue(file_exists(public_path($relPath)), 'Uploaded image found at path: '. public_path($relPath)); | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-18 01:22:04 +08:00
										 |  |  |         $this->deleteImage($relPath); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-28 21:18:28 +08:00
										 |  |  |         $this->assertDatabaseHas('images', [ | 
					
						
							| 
									
										
										
										
											2016-09-18 01:22:04 +08:00
										 |  |  |             'url' => $this->baseUrl . $relPath, | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  |             'type' => 'gallery', | 
					
						
							|  |  |  |             'uploaded_to' => $page->id, | 
					
						
							|  |  |  |             'path' => $relPath, | 
					
						
							|  |  |  |             'created_by' => $admin->id, | 
					
						
							|  |  |  |             'updated_by' => $admin->id, | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |             'name' => $imgDetails['name'], | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-22 20:44:49 +08:00
										 |  |  |     public function test_image_display_thumbnail_generation_does_not_increase_image_size() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = Page::first(); | 
					
						
							|  |  |  |         $admin = $this->getAdmin(); | 
					
						
							|  |  |  |         $this->actingAs($admin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $originalFile = $this->getTestImageFilePath('compressed.png'); | 
					
						
							|  |  |  |         $originalFileSize = filesize($originalFile); | 
					
						
							|  |  |  |         $imgDetails = $this->uploadGalleryImage($page, 'compressed.png'); | 
					
						
							|  |  |  |         $relPath = $imgDetails['path']; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertTrue(file_exists(public_path($relPath)), 'Uploaded image found at path: '. public_path($relPath)); | 
					
						
							|  |  |  |         $displayImage = $imgDetails['response']->thumbs->display; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $displayImageRelPath = implode('/', array_slice(explode('/', $displayImage), 3)); | 
					
						
							|  |  |  |         $displayImagePath = public_path($displayImageRelPath); | 
					
						
							|  |  |  |         $displayFileSize = filesize($displayImagePath); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->deleteImage($relPath); | 
					
						
							|  |  |  |         $this->deleteImage($displayImageRelPath); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertEquals($originalFileSize, $displayFileSize, 'Display thumbnail generation should not increase image size'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |     public function test_image_edit() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $editor = $this->getEditor(); | 
					
						
							|  |  |  |         $this->actingAs($editor); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $imgDetails = $this->uploadGalleryImage(); | 
					
						
							|  |  |  |         $image = Image::query()->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-14 06:58:40 +08:00
										 |  |  |         $newName = Str::random(); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $update = $this->put('/images/' . $image->id, ['name' => $newName]); | 
					
						
							|  |  |  |         $update->assertSuccessful(); | 
					
						
							|  |  |  |         $update->assertJson([ | 
					
						
							|  |  |  |             'id' => $image->id, | 
					
						
							|  |  |  |             'name' => $newName, | 
					
						
							|  |  |  |             'type' => 'gallery', | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->deleteImage($imgDetails['path']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertDatabaseHas('images', [ | 
					
						
							|  |  |  |             'type' => 'gallery', | 
					
						
							|  |  |  |             'name' => $newName | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2018-03-25 19:41:52 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-18 01:22:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |     public function test_gallery_get_list_format() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $imgDetails = $this->uploadGalleryImage(); | 
					
						
							|  |  |  |         $image = Image::query()->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $emptyJson = ['images' => [], 'has_more' => false]; | 
					
						
							|  |  |  |         $resultJson = [ | 
					
						
							|  |  |  |             'images' => [ | 
					
						
							|  |  |  |                 [ | 
					
						
							|  |  |  |                     'id' => $image->id, | 
					
						
							|  |  |  |                     'name' => $imgDetails['name'], | 
					
						
							|  |  |  |                 ] | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |             'has_more' => false, | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pageId = $imgDetails['page']->id; | 
					
						
							|  |  |  |         $firstPageRequest = $this->get("/images/gallery?page=1&uploaded_to={$pageId}"); | 
					
						
							|  |  |  |         $firstPageRequest->assertSuccessful()->assertJson($resultJson); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $secondPageRequest = $this->get("/images/gallery?page=2&uploaded_to={$pageId}"); | 
					
						
							|  |  |  |         $secondPageRequest->assertSuccessful()->assertExactJson($emptyJson); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $namePartial = substr($imgDetails['name'], 0, 3); | 
					
						
							|  |  |  |         $searchHitRequest = $this->get("/images/gallery?page=1&uploaded_to={$pageId}&search={$namePartial}"); | 
					
						
							|  |  |  |         $searchHitRequest->assertSuccessful()->assertJson($resultJson); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-14 06:58:40 +08:00
										 |  |  |         $namePartial = Str::random(16); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $searchHitRequest = $this->get("/images/gallery?page=1&uploaded_to={$pageId}&search={$namePartial}"); | 
					
						
							|  |  |  |         $searchHitRequest->assertSuccessful()->assertExactJson($emptyJson); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_image_usage() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = Page::first(); | 
					
						
							|  |  |  |         $editor = $this->getEditor(); | 
					
						
							|  |  |  |         $this->actingAs($editor); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $imgDetails = $this->uploadGalleryImage($page); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $image = Image::query()->first(); | 
					
						
							|  |  |  |         $page->html = '<img src="'.$image->url.'">'; | 
					
						
							|  |  |  |         $page->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $usage = $this->get('/images/usage/' . $image->id); | 
					
						
							|  |  |  |         $usage->assertSuccessful(); | 
					
						
							|  |  |  |         $usage->assertJson([ | 
					
						
							|  |  |  |             [ | 
					
						
							|  |  |  |                 'id' => $page->id, | 
					
						
							|  |  |  |                 'name' => $page->name | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->deleteImage($imgDetails['path']); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-21 07:59:55 +08:00
										 |  |  |     public function test_php_files_cannot_be_uploaded() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = Page::first(); | 
					
						
							|  |  |  |         $admin = $this->getAdmin(); | 
					
						
							|  |  |  |         $this->actingAs($admin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $fileName = 'bad.php'; | 
					
						
							|  |  |  |         $relPath = $this->getTestImagePath('gallery', $fileName); | 
					
						
							|  |  |  |         $this->deleteImage($relPath); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $file = $this->getTestImage($fileName); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $upload = $this->withHeader('Content-Type', 'image/jpeg')->call('POST', '/images/gallery', ['uploaded_to' => $page->id], [], ['file' => $file], []); | 
					
						
							| 
									
										
										
										
											2019-03-21 07:59:55 +08:00
										 |  |  |         $upload->assertStatus(302); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertFalse(file_exists(public_path($relPath)), 'Uploaded php file was uploaded but should have been stopped'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertDatabaseMissing('images', [ | 
					
						
							|  |  |  |             'type' => 'gallery', | 
					
						
							|  |  |  |             'name' => $fileName | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-22 03:43:15 +08:00
										 |  |  |     public function test_php_like_files_cannot_be_uploaded() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = Page::first(); | 
					
						
							|  |  |  |         $admin = $this->getAdmin(); | 
					
						
							|  |  |  |         $this->actingAs($admin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $fileName = 'bad.phtml'; | 
					
						
							|  |  |  |         $relPath = $this->getTestImagePath('gallery', $fileName); | 
					
						
							|  |  |  |         $this->deleteImage($relPath); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $file = $this->getTestImage($fileName); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $upload = $this->withHeader('Content-Type', 'image/jpeg')->call('POST', '/images/gallery', ['uploaded_to' => $page->id], [], ['file' => $file], []); | 
					
						
							| 
									
										
										
										
											2019-03-22 03:43:15 +08:00
										 |  |  |         $upload->assertStatus(302); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertFalse(file_exists(public_path($relPath)), 'Uploaded php file was uploaded but should have been stopped'); | 
					
						
							| 
									
										
										
										
											2019-03-25 03:07:18 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-03-22 03:43:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-25 03:07:18 +08:00
										 |  |  |     public function test_files_with_double_extensions_cannot_be_uploaded() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = Page::first(); | 
					
						
							|  |  |  |         $admin = $this->getAdmin(); | 
					
						
							|  |  |  |         $this->actingAs($admin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $fileName = 'bad.phtml.png'; | 
					
						
							|  |  |  |         $relPath = $this->getTestImagePath('gallery', $fileName); | 
					
						
							|  |  |  |         $this->deleteImage($relPath); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $file = $this->getTestImage($fileName); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $upload = $this->withHeader('Content-Type', 'image/png')->call('POST', '/images/gallery', ['uploaded_to' => $page->id], [], ['file' => $file], []); | 
					
						
							| 
									
										
										
										
											2019-03-25 03:07:18 +08:00
										 |  |  |         $upload->assertStatus(302); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertFalse(file_exists(public_path($relPath)), 'Uploaded double extension file was uploaded but should have been stopped'); | 
					
						
							| 
									
										
										
										
											2019-03-22 03:43:15 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 19:41:52 +08:00
										 |  |  |     public function test_secure_images_uploads_to_correct_place() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-06-23 23:01:15 +08:00
										 |  |  |         config()->set('filesystems.images', 'local_secure'); | 
					
						
							| 
									
										
										
										
											2018-03-25 19:41:52 +08:00
										 |  |  |         $this->asEditor(); | 
					
						
							| 
									
										
										
										
											2019-03-22 03:43:15 +08:00
										 |  |  |         $galleryFile = $this->getTestImage('my-secure-test-upload.png'); | 
					
						
							| 
									
										
										
										
											2018-03-25 19:41:52 +08:00
										 |  |  |         $page = Page::first(); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $expectedPath = storage_path('uploads/images/gallery/' . Date('Y-m') . '/my-secure-test-upload.png'); | 
					
						
							| 
									
										
										
										
											2018-03-25 19:41:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $upload = $this->call('POST', '/images/gallery', ['uploaded_to' => $page->id], [], ['file' => $galleryFile], []); | 
					
						
							| 
									
										
										
										
											2018-03-25 19:41:52 +08:00
										 |  |  |         $upload->assertStatus(200); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertTrue(file_exists($expectedPath), 'Uploaded image not found at path: '. $expectedPath); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (file_exists($expectedPath)) { | 
					
						
							|  |  |  |             unlink($expectedPath); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 19:23:43 +08:00
										 |  |  |     public function test_secure_images_included_in_exports() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-06-23 23:01:15 +08:00
										 |  |  |         config()->set('filesystems.images', 'local_secure'); | 
					
						
							| 
									
										
										
										
											2018-04-22 19:23:43 +08:00
										 |  |  |         $this->asEditor(); | 
					
						
							| 
									
										
										
										
											2019-03-22 03:43:15 +08:00
										 |  |  |         $galleryFile = $this->getTestImage('my-secure-test-upload.png'); | 
					
						
							| 
									
										
										
										
											2018-04-22 19:23:43 +08:00
										 |  |  |         $page = Page::first(); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $expectedPath = storage_path('uploads/images/gallery/' . Date('Y-m') . '/my-secure-test-upload.png'); | 
					
						
							| 
									
										
										
										
											2018-04-22 19:23:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $upload = $this->call('POST', '/images/gallery', ['uploaded_to' => $page->id], [], ['file' => $galleryFile], []); | 
					
						
							| 
									
										
										
										
											2018-04-22 19:23:43 +08:00
										 |  |  |         $imageUrl = json_decode($upload->getContent(), true)['url']; | 
					
						
							|  |  |  |         $page->html .= "<img src=\"{$imageUrl}\">"; | 
					
						
							|  |  |  |         $page->save(); | 
					
						
							|  |  |  |         $upload->assertStatus(200); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $encodedImageContent = base64_encode(file_get_contents($expectedPath)); | 
					
						
							|  |  |  |         $export = $this->get($page->getUrl('/export/html')); | 
					
						
							| 
									
										
										
										
											2019-09-14 06:58:40 +08:00
										 |  |  |         $this->assertTrue(strpos($export->getContent(), $encodedImageContent) !== false, 'Uploaded image in export content'); | 
					
						
							| 
									
										
										
										
											2018-04-22 19:23:43 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (file_exists($expectedPath)) { | 
					
						
							|  |  |  |             unlink($expectedPath); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 19:41:52 +08:00
										 |  |  |     public function test_system_images_remain_public() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-06-23 23:01:15 +08:00
										 |  |  |         config()->set('filesystems.images', 'local_secure'); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $this->asAdmin(); | 
					
						
							| 
									
										
										
										
											2019-03-22 03:43:15 +08:00
										 |  |  |         $galleryFile = $this->getTestImage('my-system-test-upload.png'); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $expectedPath = public_path('uploads/images/system/' . Date('Y-m') . '/my-system-test-upload.png'); | 
					
						
							| 
									
										
										
										
											2018-03-25 19:41:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $upload = $this->call('POST', '/settings', [], [], ['app_logo' => $galleryFile], []); | 
					
						
							|  |  |  |         $upload->assertRedirect('/settings'); | 
					
						
							| 
									
										
										
										
											2018-03-25 19:41:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->assertTrue(file_exists($expectedPath), 'Uploaded image not found at path: '. $expectedPath); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (file_exists($expectedPath)) { | 
					
						
							|  |  |  |             unlink($expectedPath); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_image_delete() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-01-28 21:18:28 +08:00
										 |  |  |         $page = Page::first(); | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  |         $this->asAdmin(); | 
					
						
							| 
									
										
										
										
											2018-01-28 21:18:28 +08:00
										 |  |  |         $imageName = 'first-image.png'; | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-28 21:18:28 +08:00
										 |  |  |         $this->uploadImage($imageName, $page->id); | 
					
						
							|  |  |  |         $image = Image::first(); | 
					
						
							|  |  |  |         $relPath = $this->getTestImagePath('gallery', $imageName); | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-28 21:18:28 +08:00
										 |  |  |         $delete = $this->delete( '/images/' . $image->id); | 
					
						
							|  |  |  |         $delete->assertStatus(200); | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-28 21:18:28 +08:00
										 |  |  |         $this->assertDatabaseMissing('images', [ | 
					
						
							| 
									
										
										
										
											2016-09-18 01:22:04 +08:00
										 |  |  |             'url' => $this->baseUrl . $relPath, | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  |             'type' => 'gallery' | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 19:07:27 +08:00
										 |  |  |         $this->assertFalse(file_exists(public_path($relPath)), 'Uploaded image has not been deleted as expected'); | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-28 21:18:28 +08:00
										 |  |  |     public function testBase64Get() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = Page::first(); | 
					
						
							|  |  |  |         $this->asAdmin(); | 
					
						
							|  |  |  |         $imageName = 'first-image.png'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->uploadImage($imageName, $page->id); | 
					
						
							|  |  |  |         $image = Image::first(); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $image->type = 'drawio'; | 
					
						
							|  |  |  |         $image->save(); | 
					
						
							| 
									
										
										
										
											2018-01-28 21:18:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $imageGet = $this->getJson("/images/drawio/base64/{$image->id}"); | 
					
						
							| 
									
										
										
										
											2018-01-28 21:18:28 +08:00
										 |  |  |         $imageGet->assertJson([ | 
					
						
							|  |  |  |             'content' => 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4gEcDCo5iYNs+gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAFElEQVQI12O0jN/KgASYGFABqXwAZtoBV6Sl3hIAAAAASUVORK5CYII=' | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_drawing_base64_upload() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = Page::first(); | 
					
						
							|  |  |  |         $editor = $this->getEditor(); | 
					
						
							|  |  |  |         $this->actingAs($editor); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $upload = $this->postJson('images/drawio', [ | 
					
						
							| 
									
										
										
										
											2018-01-28 21:18:28 +08:00
										 |  |  |             'uploaded_to' => $page->id, | 
					
						
							|  |  |  |             'image' => 'image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4gEcDCo5iYNs+gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAFElEQVQI12O0jN/KgASYGFABqXwAZtoBV6Sl3hIAAAAASUVORK5CYII=' | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $upload->assertStatus(200); | 
					
						
							|  |  |  |         $upload->assertJson([ | 
					
						
							|  |  |  |             'type' => 'drawio', | 
					
						
							|  |  |  |             'uploaded_to' => $page->id, | 
					
						
							|  |  |  |             'created_by' => $editor->id, | 
					
						
							|  |  |  |             'updated_by' => $editor->id, | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $image = Image::where('type', '=', 'drawio')->first(); | 
					
						
							|  |  |  |         $this->assertTrue(file_exists(public_path($image->path)), 'Uploaded image not found at path: '. public_path($image->path)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $testImageData = file_get_contents($this->getTestImageFilePath()); | 
					
						
							|  |  |  |         $uploadedImageData = file_get_contents(public_path($image->path)); | 
					
						
							|  |  |  |         $this->assertTrue($testImageData === $uploadedImageData, "Uploaded image file data does not match our test image as expected"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-21 22:52:29 +08:00
										 |  |  |     protected function getTestProfileImage() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $imageName = 'profile.png'; | 
					
						
							|  |  |  |         $relPath = $this->getTestImagePath('user', $imageName); | 
					
						
							|  |  |  |         $this->deleteImage($relPath); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $this->getTestImage($imageName); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_user_image_upload() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $editor = $this->getEditor(); | 
					
						
							|  |  |  |         $admin = $this->getAdmin(); | 
					
						
							|  |  |  |         $this->actingAs($admin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $file = $this->getTestProfileImage(); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $this->call('PUT', '/settings/users/' . $editor->id, [], [], ['profile_image' => $file], []); | 
					
						
							| 
									
										
										
										
											2019-04-21 22:52:29 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->assertDatabaseHas('images', [ | 
					
						
							|  |  |  |             'type' => 'user', | 
					
						
							|  |  |  |             'uploaded_to' => $editor->id, | 
					
						
							|  |  |  |             'created_by' => $admin->id, | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_user_images_deleted_on_user_deletion() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $editor = $this->getEditor(); | 
					
						
							|  |  |  |         $this->actingAs($editor); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $file = $this->getTestProfileImage(); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $this->call('PUT', '/settings/users/' . $editor->id, [], [], ['profile_image' => $file], []); | 
					
						
							| 
									
										
										
										
											2018-01-28 22:08:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $profileImages = Image::where('type', '=', 'user')->where('created_by', '=', $editor->id)->get(); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $this->assertTrue($profileImages->count() === 1, "Found profile images does not match upload count"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $imagePath = public_path($profileImages->first()->path); | 
					
						
							|  |  |  |         $this->assertTrue(file_exists($imagePath)); | 
					
						
							| 
									
										
										
										
											2018-01-28 22:08:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $userDelete = $this->asAdmin()->delete("/settings/users/{$editor->id}"); | 
					
						
							|  |  |  |         $userDelete->assertStatus(302); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-28 22:08:14 +08:00
										 |  |  |         $this->assertDatabaseMissing('images', [ | 
					
						
							|  |  |  |             'type' => 'user', | 
					
						
							|  |  |  |             'created_by' => $editor->id | 
					
						
							|  |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2019-04-21 22:52:29 +08:00
										 |  |  |         $this->assertDatabaseMissing('images', [ | 
					
						
							|  |  |  |             'type' => 'user', | 
					
						
							|  |  |  |             'uploaded_to' => $editor->id | 
					
						
							|  |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->assertFalse(file_exists($imagePath)); | 
					
						
							| 
									
										
										
										
											2018-01-28 22:08:14 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-28 02:40:07 +08:00
										 |  |  |     public function test_deleted_unused_images() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = Page::first(); | 
					
						
							|  |  |  |         $admin = $this->getAdmin(); | 
					
						
							|  |  |  |         $this->actingAs($admin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $imageName = 'unused-image.png'; | 
					
						
							|  |  |  |         $relPath = $this->getTestImagePath('gallery', $imageName); | 
					
						
							|  |  |  |         $this->deleteImage($relPath); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $upload = $this->uploadImage($imageName, $page->id); | 
					
						
							|  |  |  |         $upload->assertStatus(200); | 
					
						
							|  |  |  |         $image = Image::where('type', '=', 'gallery')->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-13 18:27:55 +08:00
										 |  |  |         $pageRepo = app(PageRepo::class); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $pageRepo->update($page, [ | 
					
						
							| 
									
										
										
										
											2018-05-28 02:40:07 +08:00
										 |  |  |             'name' => $page->name, | 
					
						
							|  |  |  |             'html' => $page->html . "<img src=\"{$image->url}\">", | 
					
						
							|  |  |  |             'summary' => '' | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Ensure no images are reported as deletable
 | 
					
						
							|  |  |  |         $imageService = app(ImageService::class); | 
					
						
							|  |  |  |         $toDelete = $imageService->deleteUnusedImages(true, true); | 
					
						
							|  |  |  |         $this->assertCount(0, $toDelete); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Save a revision of our page without the image;
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $pageRepo->update($page, [ | 
					
						
							| 
									
										
										
										
											2018-05-28 02:40:07 +08:00
										 |  |  |             'name' => $page->name, | 
					
						
							|  |  |  |             'html' => "<p>Hello</p>", | 
					
						
							|  |  |  |             'summary' => '' | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Ensure revision images are picked up okay
 | 
					
						
							|  |  |  |         $imageService = app(ImageService::class); | 
					
						
							|  |  |  |         $toDelete = $imageService->deleteUnusedImages(true, true); | 
					
						
							|  |  |  |         $this->assertCount(0, $toDelete); | 
					
						
							|  |  |  |         $toDelete = $imageService->deleteUnusedImages(false, true); | 
					
						
							|  |  |  |         $this->assertCount(1, $toDelete); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Check image is found when revisions are destroyed
 | 
					
						
							|  |  |  |         $page->revisions()->delete(); | 
					
						
							|  |  |  |         $toDelete = $imageService->deleteUnusedImages(true, true); | 
					
						
							|  |  |  |         $this->assertCount(1, $toDelete); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Check the image is deleted
 | 
					
						
							|  |  |  |         $absPath = public_path($relPath); | 
					
						
							|  |  |  |         $this->assertTrue(file_exists($absPath), "Existing uploaded file at path {$absPath} exists"); | 
					
						
							|  |  |  |         $toDelete = $imageService->deleteUnusedImages(true, false); | 
					
						
							|  |  |  |         $this->assertCount(1, $toDelete); | 
					
						
							|  |  |  |         $this->assertFalse(file_exists($absPath)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->deleteImage($relPath); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-02 03:11:49 +08:00
										 |  |  | } |