> ## 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 모킹, HTTP 페이크, 테스트할 수 없는 기능의 해설.

## 개요

`laravel-bluesky`의 주요 기능은 `Bluesky` Facade를 통해 제공되므로, 표준적인 Laravel 모킹으로 테스트할 수 있습니다. 패키지 개발 테스트 전반에 대해서는 [package-testing](/ko/advanced/package-testing)도 참조하세요.

## Facade 모킹

`Bluesky::expects()`를 사용해 메서드 체인 단위로 모킹합니다.

```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 페이크

`laravel-bluesky`는 내부에서 Laravel의 HTTP 클라이언트를 사용합니다. `Http::preventStrayRequests()`를 `setUp()`에 작성해 두면, 예상치 못한 외부 요청을 즉시 감지할 수 있습니다.

```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()`는 테스트 실행 중에 실제 외부 요청이 발생하면 예외를 throw합니다. 의도하지 않은 외부 통신을 바로 발견할 수 있으므로 테스트의 신뢰성이 높아집니다.
</Tip>

## 모킹할 수 없는 기능

### FeedGenerator

FeedGenerator는 Bluesky 서버 측에서 호출되기 때문에 엔드투엔드 모킹은 없습니다. 다만 FeedGenerator의 알고리즘 부분은 모킹할 수 있습니다.

```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의 코어 기능은 외부 접근을 동반하지 않으므로 모킹이 필요 없습니다.

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


## Related topics

- [HTTP 테스트](/ko/http-tests.md)
- [테스트 입문](/ko/testing.md)
- [콘솔 테스트](/ko/console-tests.md)
- [브라우저 테스트(Dusk)](/ko/dusk.md)
- [Pest를 이용한 고급 테스트](/ko/advanced/testing-pest.md)
