proposal-system/lambdas/tests/conftest.py
Adam Moussa 3d050bcf8e
Some checks are pending
Deploy / Deploy to AWS (push) Waiting to run
fix(lambdas): SigV4-sign internal API calls and bundle Lambda dependencies (#122)
The .NET API Lambda Function URL uses authType=AWS_IAM, but the four workload
Lambdas (suggestions, pdf-extract, pdf-generate, library-ingest) sent unsigned
requests with only X-Internal-Api-Key -> every internal call 403s. They also
used bare fromAsset() with no pip bundling -> ImportError at cold start. Both
made the SQS->Lambda->API pipeline non-functional when deployed (v1 pre-flight).

- Add _sign_request_headers (botocore SigV4Auth, service "lambda"); serialize the
  JSON body once and send via httpx content= so the signed payload hash matches
  the bytes sent; preserve X-Internal-Api-Key for the app-layer check. Sign per
  retry attempt to avoid SigV4 timestamp expiry on slow retries.
- Add CDK pip bundling (--platform manylinux2014_aarch64 --only-binary=:all:) to
  all four Lambdas so ARM64 wheels (reportlab, Pillow, pdfplumber) ship.
- Converge _retry_request across all four (fixes possibly-undefined return in
  pdf-extract/pdf-generate).
- Add SigV4 signing regression tests.

Verified: ruff clean, infra tsc clean, aarch64 wheels resolve for all four,
23 pytest pass. GPT-4.1 cross-family review: no BLOCK (FIX + NIT applied).
2026-06-12 17:13:08 -04:00

27 lines
1.2 KiB
Python

"""Common fixtures for Lambda tests."""
import os
import pytest
# The Lambda app modules instantiate boto3 clients at import time (module top),
# which raises NoRegionError during pytest collection — before the autouse fixture
# below runs, and in CI where no region is configured. conftest is imported before
# any test module, so seed a default region here.
os.environ.setdefault("AWS_DEFAULT_REGION", "us-east-1")
@pytest.fixture(autouse=True)
def _env_setup(monkeypatch):
"""Set environment variables required by all Lambdas."""
monkeypatch.setenv("AWS_DEFAULT_REGION", "us-east-1")
monkeypatch.setenv("AWS_ACCESS_KEY_ID", "testing")
monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "testing")
monkeypatch.setenv("AWS_SECURITY_TOKEN", "testing")
monkeypatch.setenv("AWS_SESSION_TOKEN", "testing")
monkeypatch.setenv("LOG_LEVEL", "DEBUG")
monkeypatch.setenv("GENERATED_BUCKET", "test-generated-pdfs")
monkeypatch.setenv("API_BASE_URL", "http://localhost:5000")
monkeypatch.setenv("INTERNAL_API_KEY_SECRET_ARN", "")
monkeypatch.setenv("KNOWLEDGE_BASE_ID", "")
monkeypatch.setenv("MODEL_ID", "us.anthropic.claude-sonnet-4-5-20250929-v1:0")