mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-08-07 23:03:00 +03:00
Removed use of HttpFetcher
- Fixed some existing issues in new aligned process. - Manually tested each external call scenario.
This commit is contained in:
@@ -6,7 +6,6 @@ use BookStack\Entities\Models\Entity;
|
||||
use BookStack\Http\HttpClientHistory;
|
||||
use BookStack\Http\HttpRequestService;
|
||||
use BookStack\Settings\SettingService;
|
||||
use BookStack\Uploads\HttpFetcher;
|
||||
use BookStack\Users\Models\User;
|
||||
use Illuminate\Contracts\Console\Kernel;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
@@ -16,7 +15,6 @@ use Illuminate\Support\Env;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Testing\Assert as PHPUnit;
|
||||
use Mockery;
|
||||
use Monolog\Handler\TestHandler;
|
||||
use Monolog\Logger;
|
||||
use Ssddanbrown\AssertHtml\TestsHtml;
|
||||
@@ -107,19 +105,6 @@ abstract class TestCase extends BaseTestCase
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mock the HttpFetcher service and return the given data on fetch.
|
||||
*/
|
||||
protected function mockHttpFetch($returnData, int $times = 1)
|
||||
{
|
||||
// TODO - Remove
|
||||
$mockHttp = Mockery::mock(HttpFetcher::class);
|
||||
$this->app[HttpFetcher::class] = $mockHttp;
|
||||
$mockHttp->shouldReceive('fetch')
|
||||
->times($times)
|
||||
->andReturn($returnData);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mock the http client used in BookStack http calls.
|
||||
*/
|
||||
|
@@ -3,9 +3,11 @@
|
||||
namespace Tests\Uploads;
|
||||
|
||||
use BookStack\Exceptions\HttpFetchException;
|
||||
use BookStack\Uploads\HttpFetcher;
|
||||
use BookStack\Uploads\UserAvatars;
|
||||
use BookStack\Users\Models\User;
|
||||
use GuzzleHttp\Exception\ConnectException;
|
||||
use GuzzleHttp\Psr7\Request;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use Tests\TestCase;
|
||||
|
||||
class AvatarTest extends TestCase
|
||||
@@ -22,27 +24,16 @@ class AvatarTest extends TestCase
|
||||
return User::query()->where('email', '=', $user->email)->first();
|
||||
}
|
||||
|
||||
protected function assertImageFetchFrom(string $url)
|
||||
{
|
||||
$http = $this->mock(HttpFetcher::class);
|
||||
|
||||
$http->shouldReceive('fetch')
|
||||
->once()->with($url)
|
||||
->andReturn($this->files->pngImageData());
|
||||
}
|
||||
|
||||
protected function deleteUserImage(User $user)
|
||||
protected function deleteUserImage(User $user): void
|
||||
{
|
||||
$this->files->deleteAtRelativePath($user->avatar->path);
|
||||
}
|
||||
|
||||
public function test_gravatar_fetched_on_user_create()
|
||||
{
|
||||
config()->set([
|
||||
'services.disable_services' => false,
|
||||
]);
|
||||
$requests = $this->mockHttpClient([new Response(200, ['Content-Type' => 'image/png'], $this->files->pngImageData())]);
|
||||
config()->set(['services.disable_services' => false]);
|
||||
$user = User::factory()->make();
|
||||
$this->assertImageFetchFrom('https://www.gravatar.com/avatar/' . md5(strtolower($user->email)) . '?s=500&d=identicon');
|
||||
|
||||
$user = $this->createUserRequest($user);
|
||||
$this->assertDatabaseHas('images', [
|
||||
@@ -50,6 +41,9 @@ class AvatarTest extends TestCase
|
||||
'created_by' => $user->id,
|
||||
]);
|
||||
$this->deleteUserImage($user);
|
||||
|
||||
$expectedUri = 'https://www.gravatar.com/avatar/' . md5(strtolower($user->email)) . '?s=500&d=identicon';
|
||||
$this->assertEquals($expectedUri, $requests->latestRequest()->getUri());
|
||||
}
|
||||
|
||||
public function test_custom_url_used_if_set()
|
||||
@@ -61,24 +55,22 @@ class AvatarTest extends TestCase
|
||||
|
||||
$user = User::factory()->make();
|
||||
$url = 'https://example.com/' . urlencode(strtolower($user->email)) . '/' . md5(strtolower($user->email)) . '/500';
|
||||
$this->assertImageFetchFrom($url);
|
||||
$requests = $this->mockHttpClient([new Response(200, ['Content-Type' => 'image/png'], $this->files->pngImageData())]);
|
||||
|
||||
$user = $this->createUserRequest($user);
|
||||
$this->assertEquals($url, $requests->latestRequest()->getUri());
|
||||
$this->deleteUserImage($user);
|
||||
}
|
||||
|
||||
public function test_avatar_not_fetched_if_no_custom_url_and_services_disabled()
|
||||
{
|
||||
config()->set([
|
||||
'services.disable_services' => true,
|
||||
]);
|
||||
|
||||
config()->set(['services.disable_services' => true]);
|
||||
$user = User::factory()->make();
|
||||
|
||||
$http = $this->mock(HttpFetcher::class);
|
||||
$http->shouldNotReceive('fetch');
|
||||
$requests = $this->mockHttpClient([new Response()]);
|
||||
|
||||
$this->createUserRequest($user);
|
||||
|
||||
$this->assertEquals(0, $requests->requestCount());
|
||||
}
|
||||
|
||||
public function test_avatar_not_fetched_if_avatar_url_option_set_to_false()
|
||||
@@ -89,21 +81,18 @@ class AvatarTest extends TestCase
|
||||
]);
|
||||
|
||||
$user = User::factory()->make();
|
||||
|
||||
$http = $this->mock(HttpFetcher::class);
|
||||
$http->shouldNotReceive('fetch');
|
||||
$requests = $this->mockHttpClient([new Response()]);
|
||||
|
||||
$this->createUserRequest($user);
|
||||
|
||||
$this->assertEquals(0, $requests->requestCount());
|
||||
}
|
||||
|
||||
public function test_no_failure_but_error_logged_on_failed_avatar_fetch()
|
||||
{
|
||||
config()->set([
|
||||
'services.disable_services' => false,
|
||||
]);
|
||||
config()->set(['services.disable_services' => false]);
|
||||
|
||||
$http = $this->mock(HttpFetcher::class);
|
||||
$http->shouldReceive('fetch')->andThrow(new HttpFetchException());
|
||||
$this->mockHttpClient([new ConnectException('Failed to connect', new Request('GET', ''))]);
|
||||
|
||||
$logger = $this->withTestLogger();
|
||||
|
||||
@@ -122,17 +111,16 @@ class AvatarTest extends TestCase
|
||||
|
||||
$user = User::factory()->make();
|
||||
$avatar = app()->make(UserAvatars::class);
|
||||
$url = 'http_malformed_url/' . urlencode(strtolower($user->email)) . '/' . md5(strtolower($user->email)) . '/500';
|
||||
$logger = $this->withTestLogger();
|
||||
$this->mockHttpClient([new ConnectException('Could not resolve host http_malformed_url', new Request('GET', ''))]);
|
||||
|
||||
$avatar->fetchAndAssignToUser($user);
|
||||
|
||||
$url = 'http_malformed_url/' . urlencode(strtolower($user->email)) . '/' . md5(strtolower($user->email)) . '/500';
|
||||
$this->assertTrue($logger->hasError('Failed to save user avatar image'));
|
||||
$exception = $logger->getRecords()[0]['context']['exception'];
|
||||
$this->assertEquals(new HttpFetchException(
|
||||
'Cannot get image from ' . $url,
|
||||
6,
|
||||
(new HttpFetchException('Could not resolve host: http_malformed_url', 6))
|
||||
), $exception);
|
||||
$this->assertInstanceOf(HttpFetchException::class, $exception);
|
||||
$this->assertEquals('Cannot get image from ' . $url, $exception->getMessage());
|
||||
$this->assertEquals('Could not resolve host http_malformed_url', $exception->getPrevious()->getMessage());
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user