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

# 測試

> 使用 laravel-bluesky 的程式碼測試方法。Facade mock、HTTP fake，以及無法測試的功能說明。

## 概觀

`laravel-bluesky` 的主要功能透過 `Bluesky` Facade 提供，因此可用標準的 Laravel mock 進行測試。關於套件開發的整體測試，也請參考 [package-testing](/zh-TW/advanced/package-testing)。

## Facade Mock

使用 `Bluesky::expects()` 對方法鏈進行 mock。

```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` 內部使用 Laravel 的 HTTP client。在 `setUp()` 中加入 `Http::preventStrayRequests()`，可立即偵測到預期外的外部請求。

```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()` 會在測試執行期間發生真實外部請求時擲出例外。可立即發現非預期的外部通訊，提升測試可靠度。
</Tip>

## 無法 mock 的功能

### FeedGenerator

FeedGenerator 是由 Bluesky 伺服器端呼叫，因此無法進行端對端的 mock。不過 FeedGenerator 的演算法部分是可以 mock 的。

```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) {
        // 因 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

Bluesky/AtProtocol 的核心功能不涉及外部存取，因此不需要 mock。

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


## Related topics

- [HTTP 測試](/zh-TW/http-tests.md)
- [測試入門](/zh-TW/testing.md)
- [主控台測試](/zh-TW/console-tests.md)
- [資料庫測試](/zh-TW/database-testing.md)
- [瀏覽器測試（Dusk）](/zh-TW/dusk.md)
