prowler-test-api について
prowler-test-apiは、Prowler APIのコントリビューター向けテストスキルです。JSON:APIリクエスト、テナント分離、フィクスチャ、Celeryテストの規約を示します。
主な機能
- 01JSON:APIリクエストとレスポンスのパターン
- 02テナント分離テストの指針
- 03再利用可能なフィクスチャの参照
- 04Celeryタスクのテスト戦略
- 05APIテストコマンド
活用シーン
- 01APIエンドポイント変更のテスト
- 02テナント間アクセス分離の検証
- 03非同期ビューとCeleryタスクのテスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ prowler-cloud/ prowler --skill prowler-test-apiインストール後、Claude Code で/prowler-test-apiを入力して読み込まれたか確認します。
同梱ファイルassets/api_test.pyreferences/test-api-docs.md
詳細
重要なルール
- 必ず
response.json()["data"]を使用し、response.dataは使用しないでください - PATCH/PUT リクエストでは必ず
content_type = "application/vnd.api+json"を使用してください - POST リクエストでは必ず
format="vnd.api+json"を使用してください - 必ずテナント間の分離をテストしてください。RLS は 403 ではなく 404 を返します
- 新しいエンドポイントを追加する際、RLS の分離テストを省略しないでください
- テストで実在しそうな API キーを使用しないでください(TruffleHog に検出されます)
- 非同期タスクのテストでは、必ず
.delay()とTask.objects.getの両方をモックしてください
1. フィクスチャの依存関係
create_test_user (session) ─► tenants_fixture (function) ─► authenticated_client
│
└─► aws_provider ─► scans_fixture ─► findings_fixture
主なフィクスチャ
| フィクスチャ | 説明 |
|---|---|
create_test_user | セッションユーザー([email protected]) |
tenants_fixture | 3 つのテナント:[0] と [1] にはメンバーシップがあり、[2] は分離されています |
authenticated_client | テナント[0]用 JWT を使う Django テストクライアント |
authenticated_client_for_tenant_factory | 特定のユーザーとテナント用の JWT を使う Django テストクライアントを作成します |
provider_factory | プロバイダー固有のデフォルト値を設定した、検証済みプロバイダーを 1 つ作成します |
aws_provider | テナント[0]の AWS プロバイダー 1 つ |
aws_provider_pair | テナント[0]の AWS プロバイダー 2 つ |
all_provider_types_fixture | サポート対象のプロバイダータイプごとにプロバイダーを 1 つ用意します |
tasks_fixture | TaskResult を持つ Celery タスク 2 つ |
RBAC フィクスチャ
| フィクスチャ | 権限 |
|---|---|
authenticated_client_rbac | すべての権限(管理者) |
authenticated_client_rbac_noroles | メンバーシップはありますが、ロールはありません |
authenticated_client_no_permissions_rbac | すべての権限が False |
通常のビュー動作のテストには authenticated_client を使用してください。コストの低い JWT を使用し、実際のリクエスト認証経路も実行します。シリアライザーで生成した JWT や API キーのクライアントは、トークンの取得/更新、無効なトークン、期限切れのトークン、トークンによるテナント切り替え、API キー、または未認証時の 401 動作をテストする場合に限り使用してください。別のユーザーまたはテナント用のコストの低い JWT クライアントが必要なテストでは、authenticated_client_for_tenant_factory を使用してください。
2. JSON:API リクエスト
POST(作成)
response = client.post(
reverse("provider-list"),
data={"data": {"type": "providers", "attributes": {...}}},
format="vnd.api+json", # NOT content_type!
)
PATCH(更新)
response = client.patch(
reverse("provider-detail", kwargs={"pk": provider.id}),
data={"data": {"type": "providers", "id": str(provider.id), "attributes": {...}}},
content_type="application/vnd.api+json", # NOT format!
)
レスポンスの読み取り
data = response.json()["data"]
attrs = data["attributes"]
errors = response.json()["errors"] # For 400 responses
3. RLS 分離(テナント間)
RLS は 403 ではなく 404 を返します。リソースは閲覧できず、アクセスが禁止されているわけではありません。
def test_cross_tenant_access_denied(self, authenticated_client, tenants_fixture):
other_tenant = tenants_fixture[2] # Isolated tenant
foreign_provider = Provider.objects.create(tenant_id=other_tenant.id, ...)
response = authenticated_client.get(reverse("provider-detail", args=[foreign_provider.id]))
assert response.status_code == status.HTTP_404_NOT_FOUND # NOT 403!
4. Celery タスクのテスト
テスト戦略
| 戦略 | 用途 |
|---|---|
.delay() と Task.objects.get をモック | タスクを実行するビューのテスト |
task.apply() | タスクの同期的なロジックのテスト |
chain/group をモック | Canvas オーケストレーションのテスト |
connection をモック | @set_tenant デコレーターのテスト |
apply_async をモック | Beat のスケジュール済みタスクのテスト |
task_always_eager を使用しない理由
| 問題 | 影響 |
|---|---|
| タスクのシリアライズが行われない | 引数の型エラーを見逃します |
| ブローカーとのやり取りがない | 接続の問題が隠れます |
| 実行コンテキストが異なる | self.request の動作が異なります |
代わりに使用してください: 同期実行には task.apply() を、分離にはモックを使用します。
全例:
TestCeleryTaskLogic、TestCeleryCanvas、TestSetTenantDecorator、TestBeatSchedulingについては、assets/api_test.py を参照してください。
5. ダミーのシークレット(TruffleHog)
# BAD - TruffleHog flags these:
api_key = "sk-test1234567890T3BlbkFJtest1234567890"
# GOOD - obviously fake:
api_key = "sk-fake-test-key-for-unit-testing-only"
6. レスポンスステータスコード
| シナリオ | コード |
|---|---|
| GET 成功時 | 200 |
| POST 成功時 | 201 |
| 非同期処理(DELETE/スキャンの開始) | 202 |
| 同期 DELETE | 204 |
| バリデーションエラー | 400 |
| 権限不足(RBAC) | 403 |
| RLS 分離/見つからない場合 | 404 |
コマンド
cd api && uv run pytest -x --tb=short
cd api && uv run pytest -k "test_provider"
cd api && uv run pytest api/src/backend/api/tests/test_rbac.py
リソース
- 全例:完全なテストパターンについては、assets/api_test.py を参照してください
- フィクスチャのリファレンス:references/test-api-docs.md を参照してください
- フィクスチャのソース:
api/src/backend/conftest.py
コメント
Markdown 対応