active: true
derived: false
groups:
- DI
header: |
  ファクトリ関数・DI テスト
level: 2.22
links:
- SPEC022: uTTSZDLc3XfPf_yuIMvsokNwcX6rHAvtFaUBk4Gdztk=
normative: true
ref: ''
references:
- path: tests/integration/core/test_dependency_injection.py
  type: file
reviewed: TUmqUimhuPKIyFpAYxeDZk_XpHa_o2AOFyw3mHi6YI4=
text: |
  ## 目的

  `bs.Spot()` ファクトリ関数は全コンポーネントの DI 配線を担う唯一のパブリックエントリポイントであり、デフォルト構成の正確性とカスタム実装の差し替え可能性がシステム全体の柔軟性と正確性を決定する。

  ## 検証観点

  - **デフォルト構成**: 引数未指定時に `SQLiteTaskDB`, `LocalStorage`, `MsgpackSerializer`, `TokenBucket`, `WarningOnlyPolicy` が自動注入されること。ワークスペースディレクトリ（`.beautyspot/`）が自動作成されること
  - **カスタム DB 注入**: `TaskDBBase` / `TaskDBCore` プロトコル準拠のカスタムDBを `db=` で注入し、正常にキャッシュ操作が行えること
  - **カスタム Storage 注入**: `BlobStorageBase` 準拠のモック Storage を `storage_backend=` で注入し、Blob保存が委譲されること
  - **カスタム Serializer 注入**: `SerializerProtocol` 準拠のカスタム Serializer を注入し、シリアライズ処理が差し替わること
  - **型推論**: `bs.Spot()` の戻り値型が pyright / mypy で正しく推論されること
  - **Protocol 不準拠の拒否**: 必須メソッドを欠くオブジェクトを注入した場合に型チェックエラーまたは実行時エラーが発生すること
