| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Tests\Uploads; | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | use BookStack\Auth\User; | 
					
						
							| 
									
										
										
										
											2021-01-10 21:29:13 +08:00
										 |  |  | use BookStack\Exceptions\HttpFetchException; | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  | use BookStack\Uploads\HttpFetcher; | 
					
						
							|  |  |  | use Tests\TestCase; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AvatarTest extends TestCase | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     use UsesImages; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 00:41:42 +08:00
										 |  |  |     protected function createUserRequest($user): User | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-01-10 21:29:13 +08:00
										 |  |  |         $this->asAdmin()->post('/settings/users/create', [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'name'             => $user->name, | 
					
						
							|  |  |  |             'email'            => $user->email, | 
					
						
							| 
									
										
										
										
											2021-12-19 00:41:42 +08:00
										 |  |  |             'password'         => 'testing101', | 
					
						
							|  |  |  |             'password-confirm' => 'testing101', | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 00:41:42 +08:00
										 |  |  |         return User::query()->where('email', '=', $user->email)->first(); | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected function assertImageFetchFrom(string $url) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-01-10 21:29:13 +08:00
										 |  |  |         $http = $this->mock(HttpFetcher::class); | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $http->shouldReceive('fetch') | 
					
						
							|  |  |  |             ->once()->with($url) | 
					
						
							|  |  |  |             ->andReturn($this->getTestImageContent()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected function deleteUserImage(User $user) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->deleteImage($user->avatar->path); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_gravatar_fetched_on_user_create() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         config()->set([ | 
					
						
							|  |  |  |             'services.disable_services' => false, | 
					
						
							|  |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2021-10-31 04:29:59 +08:00
										 |  |  |         $user = User::factory()->make(); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |         $this->assertImageFetchFrom('https://www.gravatar.com/avatar/' . md5(strtolower($user->email)) . '?s=500&d=identicon'); | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $user = $this->createUserRequest($user); | 
					
						
							|  |  |  |         $this->assertDatabaseHas('images', [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'type'       => 'user', | 
					
						
							|  |  |  |             'created_by' => $user->id, | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  |         $this->deleteUserImage($user); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_custom_url_used_if_set() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         config()->set([ | 
					
						
							| 
									
										
										
										
											2021-01-10 21:29:13 +08:00
										 |  |  |             'services.disable_services' => false, | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'services.avatar_url'       => 'https://example.com/${email}/${hash}/${size}', | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-31 04:29:59 +08:00
										 |  |  |         $user = User::factory()->make(); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |         $url = 'https://example.com/' . urlencode(strtolower($user->email)) . '/' . md5(strtolower($user->email)) . '/500'; | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |         $this->assertImageFetchFrom($url); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $user = $this->createUserRequest($user); | 
					
						
							|  |  |  |         $this->deleteUserImage($user); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_avatar_not_fetched_if_no_custom_url_and_services_disabled() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         config()->set([ | 
					
						
							|  |  |  |             'services.disable_services' => true, | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-31 04:29:59 +08:00
										 |  |  |         $user = User::factory()->make(); | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-10 21:29:13 +08:00
										 |  |  |         $http = $this->mock(HttpFetcher::class); | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  |         $http->shouldNotReceive('fetch'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->createUserRequest($user); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-10 21:29:13 +08:00
										 |  |  |     public function test_no_failure_but_error_logged_on_failed_avatar_fetch() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         config()->set([ | 
					
						
							|  |  |  |             'services.disable_services' => false, | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $http = $this->mock(HttpFetcher::class); | 
					
						
							|  |  |  |         $http->shouldReceive('fetch')->andThrow(new HttpFetchException()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $logger = $this->withTestLogger(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-31 04:29:59 +08:00
										 |  |  |         $user = User::factory()->make(); | 
					
						
							| 
									
										
										
										
											2021-01-10 21:29:13 +08:00
										 |  |  |         $this->createUserRequest($user); | 
					
						
							|  |  |  |         $this->assertTrue($logger->hasError('Failed to save user avatar image')); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-12-23 23:34:38 +08:00
										 |  |  | } |