]> BookStack Code Mirror - bookstack/blob - tests/Uploads/AvatarTest.php
Extracted test file handling to its own class
[bookstack] / tests / Uploads / AvatarTest.php
1 <?php
2
3 namespace Tests\Uploads;
4
5 use BookStack\Auth\User;
6 use BookStack\Exceptions\HttpFetchException;
7 use BookStack\Uploads\HttpFetcher;
8 use Tests\TestCase;
9
10 class AvatarTest extends TestCase
11 {
12     protected function createUserRequest($user): User
13     {
14         $this->asAdmin()->post('/settings/users/create', [
15             'name'             => $user->name,
16             'email'            => $user->email,
17             'password'         => 'testing101',
18             'password-confirm' => 'testing101',
19         ]);
20
21         return User::query()->where('email', '=', $user->email)->first();
22     }
23
24     protected function assertImageFetchFrom(string $url)
25     {
26         $http = $this->mock(HttpFetcher::class);
27
28         $http->shouldReceive('fetch')
29             ->once()->with($url)
30             ->andReturn($this->files->pngImageData());
31     }
32
33     protected function deleteUserImage(User $user)
34     {
35         $this->files->deleteAtRelativePath($user->avatar->path);
36     }
37
38     public function test_gravatar_fetched_on_user_create()
39     {
40         config()->set([
41             'services.disable_services' => false,
42         ]);
43         $user = User::factory()->make();
44         $this->assertImageFetchFrom('https://www.gravatar.com/avatar/' . md5(strtolower($user->email)) . '?s=500&d=identicon');
45
46         $user = $this->createUserRequest($user);
47         $this->assertDatabaseHas('images', [
48             'type'       => 'user',
49             'created_by' => $user->id,
50         ]);
51         $this->deleteUserImage($user);
52     }
53
54     public function test_custom_url_used_if_set()
55     {
56         config()->set([
57             'services.disable_services' => false,
58             'services.avatar_url'       => 'https://example.com/${email}/${hash}/${size}',
59         ]);
60
61         $user = User::factory()->make();
62         $url = 'https://example.com/' . urlencode(strtolower($user->email)) . '/' . md5(strtolower($user->email)) . '/500';
63         $this->assertImageFetchFrom($url);
64
65         $user = $this->createUserRequest($user);
66         $this->deleteUserImage($user);
67     }
68
69     public function test_avatar_not_fetched_if_no_custom_url_and_services_disabled()
70     {
71         config()->set([
72             'services.disable_services' => true,
73         ]);
74
75         $user = User::factory()->make();
76
77         $http = $this->mock(HttpFetcher::class);
78         $http->shouldNotReceive('fetch');
79
80         $this->createUserRequest($user);
81     }
82
83     public function test_avatar_not_fetched_if_avatar_url_option_set_to_false()
84     {
85         config()->set([
86             'services.disable_services' => false,
87             'services.avatar_url'       => false,
88         ]);
89
90         $user = User::factory()->make();
91
92         $http = $this->mock(HttpFetcher::class);
93         $http->shouldNotReceive('fetch');
94
95         $this->createUserRequest($user);
96     }
97
98     public function test_no_failure_but_error_logged_on_failed_avatar_fetch()
99     {
100         config()->set([
101             'services.disable_services' => false,
102         ]);
103
104         $http = $this->mock(HttpFetcher::class);
105         $http->shouldReceive('fetch')->andThrow(new HttpFetchException());
106
107         $logger = $this->withTestLogger();
108
109         $user = User::factory()->make();
110         $this->createUserRequest($user);
111         $this->assertTrue($logger->hasError('Failed to save user avatar image'));
112     }
113 }