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

# テスト - GitHub Copilot SDK for Laravel

> Laravel Copilot SDK の Copilot::fake()、アサーション、Stray request 防止を使ったテスト方法を説明します。

Laravel ならこういうテストコードが書けます。

## Copilot::fake()

`Copilot::fake()` は Copilot Facade から使う機能のためのモックです。他の機能はモックしません。

```php theme={null}
use Revolution\Copilot\Facades\Copilot;

Copilot::fake('2'); // 常に'2'を返すモック

$response = Copilot::run(prompt: '1 + 1'); // ここで実際にはCopilot CLIは呼ばれない

// Pest
expect($response->content())->toBe('2');
// PHPUnit
$this->assertEquals('2', $response->content());
```

`Copilot::start` で複数呼び出した場合。

```php theme={null}
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Contracts\CopilotSession;

Copilot::fake([
    '*' => Copilot::sequence()
            ->push(Copilot::response('2'))
            ->push(Copilot::response('4')),
]);

Copilot::start(function (CopilotSession $session) use (&$response1, &$response2) {
    $response1 = $session->sendAndWait(prompt: '1 + 1'); // '2'を返す
    $response2 = $session->sendAndWait(prompt: '2 + 2'); // '4'を返す
});

expect($response1->content())->toBe('2');
```

## アサーション

特定のプロンプトが呼び出されたことを確認。

```php theme={null}
Copilot::assertPrompt('1 + *');
```

プロンプトが呼び出されなかったことを確認。

```php theme={null}
Copilot::assertNotPrompt('1 + *');
```

プロンプトが呼び出された回数を確認。

```php theme={null}
Copilot::assertPromptCount(3);
```

プロンプトが一度も呼び出されなかったことを確認。

```php theme={null}
Copilot::assertNothingSent();
```

## Prevent stray requests

JSON-RPC リクエストをすべて防止します。呼び出した場合は例外 `Revolution\Copilot\Exceptions\StrayRequestException` が発生します。

```php theme={null}
Copilot::preventStrayRequests();
```

一部のコマンドだけは許可する場合。

```php theme={null}
Copilot::preventStrayRequests(allow: ['ping']);
```

防止の停止。

```php theme={null}
Copilot::preventStrayRequests(false);
```

防止するのは JSON-RPC リクエストだけなので `Client::start()` は防止しません。

## 正常に動かないかもしれない使い方

Artisan コマンド内で Copilot を使っている場合、`fake()` でのモックは有効ですが、その後の `assertPrompt()` などが正しく動かない場合があります。使用例が少ないので調査中です。

```php theme={null}
use Revolution\Copilot\Facades\Copilot;

Copilot::fake('Hello');

$this->artisan('copilot:hi');

Copilot::assertPrompt('Hi');
```

## shouldReceive() / expects()

Mockery でお馴染みの `shouldReceive()` や `expects()` も当然使えます。
Facade を使えば自動的に対応している機能なので説明は省略します。

<Info>
  最新情報は [GitHub リポジトリ](https://github.com/invokable/laravel-copilot-sdk) を参照してください。
</Info>
