Panoramica
Le funzionalità principali di laravel-bluesky sono fornite tramite la Facade Bluesky, quindi puoi testarle con i mock standard di Laravel. Per il testing di pacchetti in generale, consulta anche package-testing.
Mock della Facade
Con Bluesky::expects() puoi mockare intere catene di metodi.
use Revolution\Bluesky\Facades\Bluesky;
use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\Response;
Bluesky::expects('login->getProfile->json')->once()->andReturn([]);
Bluesky::expects('login->getProfile')->once()->andReturn(new Response(Http::response([])->wait()));
HTTP fake
laravel-bluesky usa internamente il client HTTP di Laravel. Se metti Http::preventStrayRequests() nel setUp(), individui subito le richieste esterne non previste.
use Revolution\Bluesky\Facades\Bluesky;
use Illuminate\Support\Facades\Http;
protected function setUp(): void
{
parent::setUp();
Http::preventStrayRequests();
}
public function test_post(): void
{
Http::fake();
Http::fakeSequence()
->push();
Bluesky::expects('resolveHandle->json')->once()->andReturn('did');
}
Http::preventStrayRequests() lancia un’eccezione se durante i test viene generata una vera richiesta esterna. Rileva subito le comunicazioni esterne non volute, aumentando l’affidabilità dei test.
Funzionalità che non si possono mockare
FeedGenerator
FeedGenerator viene invocato dal lato server di Bluesky, quindi non è disponibile un mock end-to-end. La parte dell’algoritmo del FeedGenerator è comunque mockabile.
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\FeedGenerator\FeedGenerator;
public function test_feed_generator(): void
{
FeedGenerator::register(name: 'test', algo: function (?int $limit, ?string $cursor) {
// È necessaria l'autenticazione a causa delle restrizioni dell'API
$posts = Bluesky::login(identifier: config('bluesky.identifier'), password: config('bluesky.password'))
->searchPosts(q: '#bluesky')->collect('posts');
$feed = $posts->map(function (array $post) {
return ['post' => data_get($post, 'uri')];
})->toArray();
return ['feed' => $feed];
});
Bluesky::expects('login->searchPosts->collect')->once()->andReturn(collect([['uri' => 'at://']]));
$response = $this->get(route('bluesky.feed.skeleton', ['feed' => 'at://did:/app.bsky.feed.generator/test']));
$response->assertSuccessful();
$response->assertJson(['feed' => [['post' => 'at://']]]);
}
Core
Le funzionalità core di Bluesky/AtProtocol non richiedono accessi esterni, quindi non serve mockarle.