> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Testing

> Cómo testear código que utiliza laravel-bluesky. Mock del Facade, HTTP fake y qué funcionalidades no se pueden testear.

## Descripción general

Las funcionalidades principales de `laravel-bluesky` están disponibles a través del Facade `Bluesky`, por lo que puedes testearlas con los mocks estándar de Laravel. Para pruebas de desarrollo de paquetes en general, consulta también [package-testing](/es/advanced/package-testing).

## Mock del Facade

Con `Bluesky::expects()` puedes mockear la cadena completa de métodos.

```php theme={null}
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` utiliza internamente el cliente HTTP de Laravel. Si escribes `Http::preventStrayRequests()` en el `setUp()`, detectarás inmediatamente cualquier petición externa inesperada.

```php theme={null}
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');
}
```

<Tip>
  `Http::preventStrayRequests()` lanza una excepción cuando durante la ejecución de los tests se produce una petición externa real. Detectas al momento comunicaciones externas no deseadas, lo que mejora la fiabilidad de los tests.
</Tip>

## Funcionalidades que no se pueden mockear

### FeedGenerator

Como el FeedGenerator es invocado desde el servidor de Bluesky, no hay mock de extremo a extremo. Sin embargo, la parte del algoritmo del FeedGenerator sí es mockeable.

```php theme={null}
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) {
        // Por restricciones de la API se requiere autenticación
        $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

Como las funciones core de Bluesky/AtProtocol no realizan accesos externos, no es necesario mockearlas.

<Info>
  Source: [docs/testing.md](https://github.com/invokable/laravel-bluesky/blob/main/docs/testing.md)
</Info>


## Related topics

- [Laravel FullFeed](/es/packages/laravel-fullfeed.md)
- [Introducción a las pruebas](/es/testing.md)
- [Casos de uso prácticos de Laravel Pennant](/es/blog/laravel-pennant.md)
- [Clase Lottery](/es/advanced/lottery.md)
- [Pruebas HTTP](/es/http-tests.md)
