Skip to content

Add moto-backed integration test for --trace upload/download round-trip #61

@scoropeza

Description

@scoropeza

Follow-up from PR #52 — developer productivity investment identified during PR #52's L4 spike. Not a runtime bug; a test-tooling gap.

Functional description

PR #52 shipped the --trace upload / download round-trip:

  • Uploadagent/src/telemetry.py + agent/src/pipeline.py (agent writes to S3).
  • Downloadcli/src/commands/trace.ts + cdk/src/handlers/get-trace-url.ts (backend signs a URL; CLI downloads and gunzips).
  • Contract pinningagent/tests/test_trace_key_contract.py is a cross-language contract test that pins the literal key shape traces/<user_id>/<task_id>.jsonl.gz across orchestrator, agent, handler, and CDK construct.

The gap: that contract test is a strong drift detector for the key shape but does NOT exercise the actual round-trip (agent writes → handler presigns → CLI downloads + gunzips). If a developer accidentally breaks the interaction between these three layers, the only way to catch it is to deploy to AWS and try it by hand.

Full CDK-stack E2E isn't feasible locally — Bedrock AgentCore has no LocalStack / moto equivalent. A moto-backed data-plane harness is the pragmatic middle-ground: fake AWS running in-process, exercising real code paths in under 10 seconds.

Who cares: contributors and maintainers. No user-facing impact. This is a developer-velocity investment.

Technical plan

Create a new integration test module:

File: agent/tests/integration/test_trace_roundtrip.py

Fixtures:

  • moto-backed S3 bucket matching TraceArtifactsBucket properties (7-day lifecycle, SSE, blocked public access).
  • moto-backed DynamoDB TaskTable with the real GSI schema.

Test flow:

  1. Seed a fake TaskRecord with trace=true, user_id, task_id.
  2. Invoke upload_trace_to_s3 with a fabricated trajectory.
  3. Directly invoke the get-trace-url handler logic — either port its core to Python, or drive it via a lightweight shim that reads trace_s3_uri from mocked TaskTable and signs a URL.
  4. Use the CLI's download path (subprocess bgagent trace download against a mocked API Gateway, or direct-invoke the CLI command module) to verify gunzip round-trips and JSONL reconstitutes.

Runtime: mise //agent:test:integration or pytest -m integration.

Estimated effort: 1-2 days for a minimal version. This is greenfield test scaffolding — no existing LocalStack / moto infrastructure in the repo today.

Acceptance criteria

  • One end-to-end test exercising write → read → CLI decode.
  • Runs in <10 seconds.
  • CI wiring via explicit opt-in marker (e.g. pytest -m integration) so it doesn't slow the default test loop.
  • agent/tests/integration/README.md explaining how to run locally and what the harness does / doesn't cover.

Out of scope

  • CDK synth / deploy in tests (too heavy; AgentCore not mockable).
  • Cognito auth flow (already covered by unit tests in CDK + CLI).
  • Cross-user authorization tests (covered by handler unit tests).

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions