| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Tests\Uploads; | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  | use BookStack\Entities\Models\Page; | 
					
						
							| 
									
										
										
										
											2019-03-21 07:59:55 +08:00
										 |  |  | use Illuminate\Http\UploadedFile; | 
					
						
							| 
									
										
										
										
											2022-01-04 21:10:35 +08:00
										 |  |  | use stdClass; | 
					
						
							| 
									
										
										
										
											2019-03-21 07:59:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  | trait UsesImages | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-02-06 08:16:27 +08:00
										 |  |  |      * Get the path to a file in the test-data-directory. | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-02-06 08:16:27 +08:00
										 |  |  |     protected function getTestImageFilePath(?string $fileName = null): string | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-12-22 20:44:49 +08:00
										 |  |  |         if (is_null($fileName)) { | 
					
						
							|  |  |  |             $fileName = 'test-image.png'; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-12-22 21:17:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-22 20:44:49 +08:00
										 |  |  |         return base_path('tests/test-data/' . $fileName); | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-06 08:16:27 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Creates a new temporary image file using the given name, | 
					
						
							|  |  |  |      * with the content decoded from the given bas64 file name. | 
					
						
							|  |  |  |      * Is generally used for testing sketchy files that could trip AV. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function newTestImageFromBase64(string $base64FileName, $imageFileName): UploadedFile | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $imagePath = implode(DIRECTORY_SEPARATOR, [sys_get_temp_dir(), $imageFileName]); | 
					
						
							|  |  |  |         $base64FilePath = $this->getTestImageFilePath($base64FileName); | 
					
						
							|  |  |  |         $data = file_get_contents($base64FilePath); | 
					
						
							|  |  |  |         $decoded = base64_decode($data); | 
					
						
							|  |  |  |         file_put_contents($imagePath, $decoded); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-06 08:16:27 +08:00
										 |  |  |         return new UploadedFile($imagePath, $imageFileName, 'image/png', null, true); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * Get a test image that can be uploaded. | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-02-06 08:16:27 +08:00
										 |  |  |     protected function getTestImage(string $fileName, ?string $testDataFileName = null): UploadedFile | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-02-06 08:16:27 +08:00
										 |  |  |         return new UploadedFile($this->getTestImageFilePath($testDataFileName), $fileName, 'image/png', null, true); | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get the raw file data for the test image. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |      * @return false|string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function getTestImageContent() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return file_get_contents($this->getTestImageFilePath()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get the path for a test image. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-07-25 18:18:40 +08:00
										 |  |  |     protected function getTestImagePath(string $type, string $fileName): string | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |         return '/uploads/images/' . $type . '/' . date('Y-m') . '/' . $fileName; | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Uploads an image with the given name. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |      * @param $name | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * @param int    $uploadedTo | 
					
						
							| 
									
										
										
										
											2019-03-21 07:59:55 +08:00
										 |  |  |      * @param string $contentType | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |      * @return \Illuminate\Foundation\Testing\TestResponse | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-12-22 20:44:49 +08:00
										 |  |  |     protected function uploadImage($name, $uploadedTo = 0, $contentType = 'image/png', ?string $testDataFileName = null) | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-12-22 20:44:49 +08:00
										 |  |  |         $file = $this->getTestImage($name, $testDataFileName); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-21 07:59:55 +08:00
										 |  |  |         return $this->withHeader('Content-Type', $contentType) | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |             ->call('POST', '/images/gallery', ['uploaded_to' => $uploadedTo], [], ['file' => $file], []); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Upload a new gallery image. | 
					
						
							|  |  |  |      * Returns the image name. | 
					
						
							|  |  |  |      * Can provide a page to relate the image to. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |      * @param Page|null $page | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2022-01-04 21:10:35 +08:00
										 |  |  |      * @return array{name: string, path: string, page: Page, response: stdClass} | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-12-22 20:44:49 +08:00
										 |  |  |     protected function uploadGalleryImage(Page $page = null, ?string $testDataFileName = null) | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         if ($page === null) { | 
					
						
							|  |  |  |             $page = Page::query()->first(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-22 20:44:49 +08:00
										 |  |  |         $imageName = $testDataFileName ?? 'first-image.png'; | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $relPath = $this->getTestImagePath('gallery', $imageName); | 
					
						
							|  |  |  |         $this->deleteImage($relPath); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-22 20:44:49 +08:00
										 |  |  |         $upload = $this->uploadImage($imageName, $page->id, 'image/png', $testDataFileName); | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         $upload->assertStatus(200); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         return [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'name'     => $imageName, | 
					
						
							|  |  |  |             'path'     => $relPath, | 
					
						
							|  |  |  |             'page'     => $page, | 
					
						
							| 
									
										
										
										
											2019-12-22 20:44:49 +08:00
										 |  |  |             'response' => json_decode($upload->getContent()), | 
					
						
							| 
									
										
										
										
											2019-05-05 01:11:00 +08:00
										 |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Delete an uploaded image. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-03-15 07:20:21 +08:00
										 |  |  |     protected function deleteImage(string $relPath) | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $path = public_path($relPath); | 
					
						
							|  |  |  |         if (file_exists($path)) { | 
					
						
							|  |  |  |             unlink($path); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | } |