mcpField
P
prowler-test-api

prowler-test-api

github.com/prowler-cloudテスト・品質15.1k68 回インストール今日更新
リポジトリ

prowler-test-api について

prowler-test-apiは、Prowler APIのコントリビューター向けテストスキルです。JSON:APIリクエスト、テナント分離、フィクスチャ、Celeryテストの規約を示します。

主な機能

  1. 01JSON:APIリクエストとレスポンスのパターン
  2. 02テナント分離テストの指針
  3. 03再利用可能なフィクスチャの参照
  4. 04Celeryタスクのテスト戦略
  5. 05APIテストコマンド

活用シーン

  1. 01APIエンドポイント変更のテスト
  2. 02テナント間アクセス分離の検証
  3. 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_fixture3 つのテナント:[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_fixtureTaskResult を持つ 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
同期 DELETE204
バリデーションエラー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

コメント